Semua bersama Sekarang

24

Diberikan daftar angka 1 hingga 9, menghasilkan apakah setiap digit dikelompokkan bersama sebagai satu blok yang berdekatan. Dengan kata lain, tidak ada dua digit yang sama yang dipisahkan oleh angka yang berbeda. Tidak apa-apa jika digit tidak muncul sama sekali. Bytes paling sedikit menang.

Input: Daftar angka 1 hingga 9. Angka ini bisa berupa angka desimal, string, daftar, atau urutan yang serupa.

Output: Nilai kebenaran yang konsisten jika semua digit dikelompokkan dalam blok yang berdekatan, dan nilai Falsey yang konsisten jika tidak.

Kasus nyata:

3
51
44999911
123456789
222222222222222222222

Kasus palsu:

818
8884443334
4545
554553
1234567891

Tidak
sumber
2
Apakah daftar string tunggal menjadi format input yang dapat diterima?
Dennis
Ya, lajang baik-baik saja.
xnor
Adakah yang bisa memberi tahu saya algoritma apa yang paling efisien untuk masalah ini? Atau ada masalah yang lebih umum bahwa ini berada di bawah yang bisa saya cari?
@ amt528 Anda dapat melakukannya dalam waktu linier dengan mengulangi setiap digit dan memeriksa apakah tidak ada yang berjalan melewati yang pertama.
xnor
Bisakah Anda memberikan contoh bagaimana penerapannya?

Jawaban:

18

Python 3, 38 34 33 byte

lambda s:s==sorted(s,key=s.index)

Ini mengharapkan daftar digit atau string tunggal sebagai argumen. Uji di Ideone .

Berkat @xsot untuk bermain golf 4 byte!

Berkat @immibis untuk bermain golf 1 byte!

Dennis
sumber
Jika Anda diizinkan untuk menerima daftar string, Anda dapat mempersingkat ini menjadilambda s:s==sorted(s,key=`s`.find)
xsot
Ah, saya mencoba mengambil daftar, tetapi saya tidak berpikir untuk menggunakan backticks ... Saya akan meminta OP.
Dennis
Apakah saya kehilangan sesuatu - mengapa Anda tidak bisa menggunakan saja s.find?
user253751
@immibis sharus menjadi daftar string singleton (atau saya harus memberikan sdaftar untuk perbandingan), dan list.findtidak didefinisikan ...
Dennis
@Dennis kalau s.indexbegitu? Tampaknya bekerja untuk saya.
user253751
14

JavaScript (ES6), 27 byte

s=>!/(.)(?!\1).*\1/.test(s)

Gunakan lookahead negatif untuk mencari dua digit yang tidak bersebelahan. Jika setidaknya ada dua digit, maka mereka dapat dipilih sehingga digit pertama mendahului digit yang berbeda.

Neil
sumber
1
Atau, cukup gunakan regex XD. Itu juga berhasil.
Conor O'Brien
1
ahem Retina ahem
John Dvorak
13

05AB1E , 4 byte

Kode:

Ô¹ÙQ

Penjelasan:

Ô     # Push connected uniquified input. E.g. 111223345565 would give 1234565.
 ¹    # Push input again.
  Ù   # Uniquify the input. E.g. 111223345565 would give 123456.
   Q  # Check if equal, which yields 1 or 0.

Menggunakan pengodean CP-1252 .

Cobalah online!

Adnan
sumber
2
Anda ... baru saja mengalahkan jeli ... Saya tidak pernah berpikir ini mungkin ...
Bálint
11

Jelly , 5 byte

ĠIFPỊ

Cobalah online!

Bagaimana itu bekerja

ĠIFPỊ  Main link. Input: n (list of digits or integer)

Ġ      Group the indices of n by their corresponding values, in ascending order.
       For 8884443334, this yields [[7, 8, 9], [4, 5, 6, 10], [1, 2, 3]].
 I     Increments; compute the all differences of consecutive numbers.
       For 8884443334, this yields [[1, 1], [1, 1, 4], [1, 1]].
  F    Flatten the resulting 2D list of increments.
   P   Product; multiply all increments.
    Ị  Insignificant; check if the product's absolute value is 1 or smaller.
Dennis
sumber
Lima byte yang Anda katakan? Encoding macam apa itu?
John Dvorak
4
Jelly memiliki halaman kode sendiri , yang mengkodekan masing-masing dari 256 karakter yang dipahami sebagai satu byte.
Dennis
9

Pyth, 6 5 byte

1 byte berkat FryAmTheEggman

SIxLQ

Terinspirasi oleh solusi Python di sini .

Suite uji

Penjelasan:

SIxLQ
  xLQ   Map each element in the input to its index in the input. Input is implicit.
SI      Check whether this list is sorted.
isaacg
sumber
3
SIxLQsepertinya berhasil.
FryAmTheEggman
Ini jenius.
Maltysen
1
Yang kedua Qtampaknya tidak diuraikan dengan benar, itu bertukar urutan argumen atau sesuatu sehingga Anda mendapatkan semua 0dan itu selalu memberi benar. Ini suite tes.
FryAmTheEggman
8

R, 66 48 46 43 38 byte

function(s)!any(duplicated(rle(s)$v))

Ini adalah fungsi yang menerima input sebagai vektor digit dan mengembalikan boolean. Untuk menyebutnya, tetapkan ke variabel.

Bukan yang terpendek tapi saya pikir itu pendekatan yang menyenangkan. Kami menjalankan panjang encode input dan mengekstrak nilai. Jika daftar nilai berisi duplikat kemudian kembali FALSE, jika tidak kembaliTRUE .

Verifikasi semua kasus uji online

Disimpan 20 byte berkat MickyT, 3 berkat Albert Masclans, dan 5 berkat mnel!

Alex A.
sumber
7

MATL , 8 byte

t!=tXSP=

Outputnya adalah array yang hanya berisi yang benar, atau array yang mengandung setidaknya satu nol untuk falsey.

Cobalah online!

Penjelasan

Pertimbangkan input 22331yang memenuhi syarat. Menguji apakah masing-masing karakter sama satu sama lain memberikan array 2D

1 1 0 0 0
1 1 0 0 0
0 0 1 1 0
0 0 1 1 0
0 0 0 0 1

Hasil akhir harus benar jika baris array itu (dianggap sebagai atom) berada dalam urutan (leksikografis) menurun . Sebagai perbandingan, input 22321memberikan array

1 1 0 1 0
1 1 0 1 0
0 0 1 0 0
1 1 0 1 0
0 0 0 0 1

di mana baris tidak diurutkan.

t!   % Take string input. Duplicate and tranpose
=    % Test for equality, element-wise with broadcast: gives a 2D array that
     % contains 0 or 1, for all pairs of characters in the input
t    % Duplicate
XS   % Sort rows (as atomic) in increasing order
P    % Flip vertically to obtain decreasing order
=    % Test for equality, element-wise
Luis Mendo
sumber
5

Retina , 17 byte

M`(.)(?!\1).+\1
0

Cobalah online! (Sedikit dimodifikasi untuk menjalankan semua test case sekaligus.)

Pertama pertandingan regex digit yang sedang dipisahkan oleh angka lainnya, jadi kami mendapatkan 0masukan yang valid dan mana saja antara 1dan 9input tidak valid (karena keserakahan dari para .+, kita tidak bisa mendapatkan lebih dari n-1pertandingan untuk nberbeda digit).

Untuk membalikkan kebenaran hasil, kami menghitung jumlah 0s, yang 1untuk input yang valid dan yang 0tidak valid.

Martin Ender
sumber
Saya membuat yang lebih pendek, tapi itu cukup dekat dengan Anda sehingga harus menjadi komentar. Gunakan AntiGrep sebagai ganti Match, lalu hapus baris terakhir: A`(.)(?!\1).+\1selama 15 byte. Juga berfungsi untuk banyak input. Kebenaran adalah input, kepalsuan bukanlah apa-apa. Seseorang tidak hanya bermain golf dengan Martin dalam bahasanya sendiri. :)
mbomb007
@ mbomb007 Saya pikir saya benar-benar mempertimbangkan itu, tapi sayangnya, tantangannya meminta nilai kebenaran yang konsisten (dan palsu), jadi mencetak input karena kebenaran tidak diizinkan.
Martin Ender
5

Java, 161 156 byte

Karena Jawa ...

Tanpa malu-malu mencuri meminjam regex dari jawaban ini karena saya mulai mencoba melakukan ini dengan array dan manipulasi matematika, tetapi itu menjadi sangat rumit, dan regex adalah alat yang bagus untuk masalah ini.

import java.util.regex.*;public class a{public static void main(String[] a){System.out.println(!Pattern.compile("(.)(?!\\1).*\\1").matcher(a[0]).find());}}

Tidak Disatukan:

import java.util.regex.*;

public class a {
    public static void main(String[] args) {
        System.out.println(!Pattern.compile("(.)(?!\\1).*\\1").matcher(args[0]).find());
    }

Ditata seperti orang Jawa yang masuk akal:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class  {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(.)(?!\\1).*\\1");
        Matcher m = p.matcher(args[0]);
        System.out.println(!m.find());
    }
}
JamesENL
sumber
3
like a sensible Java personItu tidak akan pernah menggunakan Java.
kucing
Solusi lain hanya menyediakan fungsi, akan membuatnya jauh lebih pendek. Sesuatu sepertis->s.match("(.)(?!\\1).*\\1")
Andreas
2
Tapi kemudian kami tidak bisa bersenang-senang dalam jawaban yang verbal.
JamesENL
4

Pyth, 7 byte

{IeMrz8

Test Suite .

Maltysen
sumber
4

Ruby, 23 byte

Fungsi anonim. Menerima string. Regex strat.

->n{/(.)(?!\1).*\1/!~n}

Regex breakdown

/(.)(?!\1).*\1/
 (.)            # Match a character and save it to group 1
    (?!\1)      # Negative lookahead, match if next character isn't
                #  the same character from group 1
          .*    # Any number of matches
            \1  # The same sequence as group 1

!~berarti jika tidak ada kecocokan regex dalam string, kembali true, dan sebaliknya kembali false.

Nilai Tinta
sumber
4

Mathematica, 26 byte

0<##&@@Sort[#&@@@Split@#]&
feersum
sumber
4

MATL, 13 11 byte

u"G@=fd2<vA

Terima kasih kepada Luis Mendo karena telah menghemat dua byte!

Cobalah secara Online!

Penjelasan

        % Grab the input implicitly
u       % Find the unique characters
"       % For each of the unique characters
    G   % Grab the input again
    @=  % Determine which chars equal the current char
    f   % Find the locations of these characters
    d   % Compute the difference between the locations
    2<  % Find all index differences < 2 (indicating consecutive chars)
    v   % Vertically concatenate all stack contents
    A   % Ensure that they are all true
        % Implicit end of the for loop
Suever
sumber
Anda dapat mengambil input dengan tanda kutip (diizinkan secara default) dan menghapus j. Juga, saya pikir Anda dapat bergerak vAdalam lingkaran dan menghapus]
Luis Mendo
@LuisMendo Terima kasih! Saya telah mengacaukan dengan meletakkan Y&di dalam tetapi itu tidak berhasil karena fd2<bisa kosong. Bergerak ke vAdalam sangat bagus! Saya juga sangat berharap kami memiliki stabil uniqueyang tidak memakan banyak byte.
Suever
Sekarang stable yang unik membutuhkan waktu sedikit lebih sedikit, menggunakan angka sebagai ganti string yang telah ditentukan. Saya dapat menambahkan versi yang lebih pendek di masa depan. Atau hanya membuat ustabil secara default (Anda selalu bisa memasukkan Ssetelahnya, dua byte). Apa yang kamu pikirkan?
Luis Mendo
3

Haskell, 44 byte

import Data.List 
((==)<*>nub).map head.group

Contoh penggunaan: ((==)<*>nub).map head.group $ "44999911"-> True.

Versi non-pointfree:

f x = q == nub q                -- True if q equals q with duplicates removed
  where
  q = map head $ group x        -- group identical digits and take the first
                                -- e.g. "44999911" -> ["44","9999","11"] -> "491"
                                -- e.g  "3443311" -> ["3","44","33","11"] -> "3431"
nimi
sumber
3

J, 8 byte

-:]/:i.~

Mengujinya dengan J.js .

Bagaimana itu bekerja

-:]/:i.~  Monadic verb. Argument: y (list of digits)

     i.~  Find the index in y of each d in y.
  ]/:     Sort y by the indices.
-:        Match; compare the reordering with the original y.
Dennis
sumber
1
:] :i :-1
CalculatorFeline
11
Tidak yakin apakah lelucon atau saran bermain golf ...
Dennis
3

Python, 56 55 byte

a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
orlp
sumber
Gagal dalam Python 3.4.1 ( int not subscriptable)
CalculatorFeline
Menyimpan byte ekstra dengan ~(yang secara harfiah setara dengan 1-):a=lambda s:~(s[0]in s.lstrip(s[0]))&a(s[1:])if s else 1
CalculatorFeline
3

C #, 119 byte

bool m(String s){for(int i=0;i<9;i++){if(new Regex(i.ToString()+"+").Matches(s).Count>1){return false;}}return true;}

Tidak disatukan

bool m(String s) {
    for(int i=0;i<9;i++) {
        if(new Regex(i.ToString() + "+").Matches(s).Count > 1) {
            return false;
        }
    }

    return true;
}
auhmaan
sumber
1
Selamat datang di PPCG! Alih-alih menghapus posting dan membuat posting baru dengan versi yang sudah diperbaiki, Anda juga dapat mengedit posting lama Anda dan kemudian menghapusnya. (Tidak perlu melakukan itu sekarang karena sudah ada dua posting, tapi supaya Anda tahu di masa depan.)
Martin Ender
Salahku. Ketika saya pertama kali bermaksud untuk berpartisipasi dalam Golf Kode ini saya salah membaca tujuan dan tidak punya banyak waktu untuk melakukan solusi lain (dan mengetahui sendiri, saya tidak akan mencoba untuk memperbaiki solusi yang diposting sebelumnya). Tetapi kemudian saya diberi tahu bahwa saya memiliki lebih banyak waktu luang dan berusaha memposting "solusi yang tepat". Bahkan tidak terpikir untuk melakukan apa yang Anda katakan. Lain kali aku akan memikirkan itu!
auhmaan
Tidak masalah sama sekali, saya harap Anda akan bersenang-senang di komunitas. :)
Martin Ender
2

Julia, 35 byte

s->issorted(s,by=x->findfirst(s,x))

Untuk alasan apa pun, sorttidak mengambil string, tetapi issortedtidak ...

Dennis
sumber
... Apakah string bukan array yang tidak berubah dalam Julia seperti Python? Itu akan membuat saya sangat sedih.
kucing
1
Ya, string tidak berubah. Mungkin itu sebabnya issortedbekerja, tetapi sorttidak.
Dennis
1
Tidak ada metode penyortiran yang didefinisikan untuk string, tetapi itu tidak akan berfungsi jika mereka diproses dengan cara yang sama dengan array satu dimensi karena mereka diurutkan dengan melakukan semacam salinan di tempat, dan seperti yang Anda katakan, string tidak berubah. Ini bukan masalah untuk memeriksa pesanan yang diurutkan karena itu diterapkan sebagai loop sederhana di atas iterable, yang baik untuk string. Hanya beberapa hal sepele. ¯ \ _ (ツ) _ / ¯
Alex A.
@AlexA. Jadi sangat banyak seperti Python sebenarnya; perbedaannya adalah bahwa builtin Python sortedmengubah argumennya menjadi daftar yang dapat diubah terlebih dahulu - itu sebabnyasorted(string) mengembalikan daftar string
cat
2

Faktor, 22 byte

[ dup natural-sort = ]

Lakukan apa yang tertulis di kaleng. Sebagai fungsi anonimouse, Anda harus callini, atau membuatnya : word ;.

kucing
sumber
4
itu membuatku takut ketika seekor kucing membawa tikus ke dalam gim
downrep_nation
@downrep_nation: P
cat
2

Lua, 107 94 85 Bytes

13 byte disimpan berkat @LeakyNun

Setidaknya, ini mengalahkan Java: D. Lua payah memanipulasi string, tapi saya pikir cukup bagus :).

Dibutuhkan inputnya sebagai argumen baris perintah, dan output 1untuk kasus-kasus kebenaran danfalse untuk yang palsu. Sekarang output menggunakan kode keluarnya. Keluar kode 0 untuk jujur, dan 1 untuk palsu

o=os.exit;(...):gsub("(.)(.+)%1",function(a,b)if 0<#b:gsub(a,"")then o(1)end end)o(0)

Tidak disatukan

Hati-hati, ada dua variabel ajaib yang disebut ..., yang pertama berisi argumen dari program, yang kedua adalah lokal ke fungsi anonim dan berisi parameternya

o=os.exit;               -- ; mandatory, else it would exit instantly
(...):gsub("(.)(.+)%1",  -- iterate over each group of the form x.*x and apply an anonymous
  function(a,b)          -- function that takes the captured group as parameters
  if 0<#b:gsub(a,"")     -- if the captured group (.+) contain other character than
  then                   -- the one captured by (.)
    o(1)                 -- exit with falsy
  end
end)
o(0)                     -- exit with truthy, reached only when the string is okay
Katenkyo
sumber
Jika diizinkan, Anda dapat menggantinya os.exit()dengan i=#0...
Leaky Nun
1

JavaScript ES6, 71 69 byte

h=y=>y.match(/(.)\1*/g);x=>h((u=h(x)).sort().join``).length==u.length

Atau, yang setara:

x=>((u=x.match(r=/(.)\1*/g)).sort().join``).match(r).length==u.length
x=>(h=y=>y.match(/(.)\1*/g))((u=h(x)).sort().join``).length==u.length

Golf sedang berlangsung.

Verifikasi kasus uji

var truthy = `3
51
44999911
123456789
222222222222222222222`.split `
`;
var falsey = `818
8884443334
4545
554553
1234567891`.split `
`;

var Q = x => ((u = x.match(r = /(.)\1*/g)).sort().join ``).match(r).length == u.length;
truthy.concat(falsey).forEach(e => {
  t = document.createTextNode(`${e} => ${Q(e)}`);
  o.appendChild(t);
  o.appendChild(document.createElement("br"));
});
* {
  font-family: Consolas, monospace;
}
<div id=o></div>

Conor O'Brien
sumber
1

C # 111 byte

bool f(string s){for(int i=0;i<s.Length-1;i++)if(s[i]!=s[i+1]&&s.LastIndexOf(s[i])!=i)return 1==2;return true;}

strategi lama 131 byte

bool s(string i){var f=Regex.Matches(i,@"([0-9])\1{0,}").Cast<Match>().Select(m=>m.Value[0]);return f.Distinct().SequenceEqual(f);}

golf pertama saya pikir saya lakukan ok

downrep_nation
sumber
1

C, 74 73 71 byte

Dicukur salah satu tiga byte berkat @xsot!

a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
mIllIbyte
sumber
a[99]Saya suka autovivifikasi Perl! Oh, tunggu ...
kucing
Saya pikir ini bekerja:a[99],c,m;main(d){for(;~c;m|=a[d=c]+=c!=d)c=getchar();putchar(48+1/m);}
xsot
@xsot - Terima kasih untuk mencukur satu byte dengan mengganti !--mdengan 1/m. Tentang a[d=c]+=c!=d, saya mencobanya dengan gcc dan tidak berfungsi di komputer saya karena urutan evaluasi. Kita harus menemukan kompiler yang akan dimainkan.
mIllIbyte
Oh, saya baru mengujinya di ideone dan itu berfungsi dengan baik. Bagaimana dengan ini:a[99],c,m;main(d){for(;~c;m|=c^d&&a[d=c]++)c=getchar();putchar(48+!m);}
xsot
1

Haskell, 37 byte

f l=(==)=<<scanl1 min$(<$>l).(==)<$>l

Menggunakan pendekatan yang sama dengan jawaban MATL Luis Mendo : membuat vektor untuk setiap entri yang indeksnya sama, dan memeriksa bahwa hasilnya diurutkan dalam urutan menurun.

(<$>l).(==)<$>ladalah versi lebih pendek dari [map(==a)l|a<-l]. Fungsi (<$>l).(==)yang diperlukan auntuk map(==a)ldipetakan l.

scanl1 minmengambil elemen terkecil kumulatif l, yang sama dengan yang asli hanya jika ldiurutkan terbalik. (==)=<<memeriksa apakah daftar tersebut memang invarian di bawah operasi ini.


Strategi rekursif yang berbeda memberi 40 byte:

f(a:b:t)=f(b:t)>(elem a t&&a/=b)
f _=1>0

Ini memeriksa setiap akhiran untuk melihat apakah elemen pertama tidak muncul di sisanya, alasan kasus di mana dua elemen pertama sama sebagai bagian dari blok yang berdekatan.

Tidak
sumber
1

Racket, 53 byte

Versi sederhana dan bodoh.

(λ(s)(let([s(string->list s)])(eq?(sort s char<?)s)))

Tidak Disatukan:

(define (lame-all-together s)
  (let ([s (string->list s)])
    (eq? (sort s char<?) s)))

Racket, 86 byte

Inilah versi yang menerapkan komentar @ xnor tentang cara yang lebih efisien untuk melakukan ini.

(λ(s)(let([s(string->list(regexp-replace#px"(.)\\1+"s"\\1"))])(eq?(sort s char<?)s)))

Tidak Disatukan:

(define (all-together s)
    (let ([s (string->list (regexp-replace #px"(.)\\1+" s "\\1"))])
      (eq? (sort s char<?) s )))

Oke, ini mungkin sebenarnya hanya menggeser bobot perhitungan dari sortfungsi ke regexp-replace, tapi itu solusi yang menarik. Pada dasarnya, ini menghapus run karakter duplikat terlebih dahulu ( lihat di sini ), kemudian menguji apakah run-length yang tersisa dalam mode disortir.

kucing
sumber
1

Perl 5, 20 byte

19, ditambah 1 untuk -pebukan -e.

$_=!/(.)(?!\1).+\1/
msh210
sumber
1

Bahasa Wolfram (Mathematica) , 18 byte

Gather@#==Split@#&

Cobalah online!

Gathermengumpulkan daftar ke dalam sublist dari elemen identik, dan Splitmembagi daftar menjadi sublist dari elemen identik berturut-turut. Mereka memberikan hasil yang sama jika dan hanya jika setiap nilai muncul hanya dalam satu blok yang berdekatan.

Misha Lavrov
sumber
0

Japt , 9 byte

ò¦ mÌ
eUâ

Cobalah


Penjelasan

          :Implicit input of string U             :e.g., "8884443334"
ò¦        :Split on inequality                    :["888","444","333","4"]
   mÌ     :Map and return the last digit of each  :["8","4","3","4"]
\n        :Assign to U
  Uâ      :Remove duplicates                      :["8","4","3"]
e         :Test for equality with U               :false
          :Implicit output of result
Shaggy
sumber