Anak kecil saya punya mainan seperti ini:
Mainan ini terdiri dari 10 ember kecil yang dapat ditumpuk, yang akan kami beri nomor dari 1 (yang terkecil) hingga 10 (yang terbesar). Terkadang dia membuat tumpukan kecil dan mainan berakhir seperti ini:
Secara skematis kita dapat mewakili tumpukan seperti ini:
1 6
4 9 2 7
5 10 3 8
---------- <-- Floor
1 2 3 4 <-- Pile #
Atau, dengan kata lain:
[[4,5],[9,10],[1,2,3],[6,7,8]]
Set tumpukan ember ini mudah dipasang kembali untuk membangun kembali set asli (gambar pertama) hanya dengan secara berurutan menempatkan tumpukan ember yang lebih kecil di dalam tumpukan ember yang lebih besar:
1 1 6
2 2 7
1 6 3 6 3 8
4 9 2 7 4 9 7 4 9
5 10 3 8 5 10 8 5 10
---------- > [Pile 3 to 1] > ---------- > [Pile 4 to 2] > ---------- > [Pile 1 to 2] > Done!
1 2 3 4 1 2 3 4 1 2 3 4
Meskipun demikian, kadang-kadang anak saya mencoba membangun menara, atau membuang ember, dan tumpukan tersebut akhirnya menjadi tidak konsisten dan set aslinya tidak dapat dibangun kembali hanya dengan menempatkan satu tumpukan di dalam tumpukan lainnya. Contoh dari ini:
[[1,3,2],[4]] (the kid tried to build a tower by placing a bigger bucket
over a smaller one, we would need to reorder the buckets
first)
[[1,3,4],[2]] (the kid left aside an unordered bucket, we would need to remove
bucket #1 from pile #1 before restacking)
[[1,2,3],[5]] (the kid lost a bucket, we need to find it first)
Tantangan
Diberikan daftar daftar bilangan bulat yang mewakili satu set tumpukan ember, kembalikan nilai yang sebenarnya jika daftar tersebut mewakili kumpulan tumpukan yang mudah diulang kembali, atau kesalahan dalam hal lain.
- Input akan diberikan sebagai daftar daftar bilangan bulat, mewakili ember dari atas ke bawah untuk setiap tumpukan.
- Tidak akan ada tumpukan awal yang kosong (Anda tidak akan mendapatkan
[[1,2,3],[],[4,5]]
input). - Jumlah total ember dapat berupa apa pun dalam rentang bilangan bulat yang wajar.
- Anak saya hanya memiliki satu set ember sehingga tidak akan ada elemen rangkap.
- Anda dapat memilih dua nilai yang konsisten (dan koheren) untuk truey atau falsey.
- Bucket akan dilabeli dari # 1 hingga #N, menjadi
N
bilangan bulat terbesar dalam daftar bilangan bulat. Anak saya masih belum tahu konsep nol. - Anda dapat menerima input dalam format beralasan apa pun asalkan itu mewakili setumpuk ember. Tetapkan saja dalam jawaban Anda jika Anda mengubah cara Anda menerima input.
- Ini adalah kode-golf , jadi semoga program / fungsi terpendek untuk setiap bahasa menang!
Contohnya
Input: [[4,5],[9,10],[1,2,3],[6,7,8]]
Output: Truthy
Input: [[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]
Output: Truthy
Input: [[2,3,4],[1],[5,6,7]]
Output: Truthy
Input: [[1,2],[5,6],[7,8,9]]
Output: Falsey (buckets #3 and #4 are missing)
Input: [[2,3,4],[5,6,7]]
Output: Falsey (bucket #1 is missing)
Input: [[1,3,4],[5,7],[2,6]]
Output: Falsey (non-restackable piles)
Input: [[1,4,3],[2],[5,6]]
Output: Falsey (one of the piles is a tower)
sumber
Jawaban:
Jelly ,
65 byteTerima kasih kepada @Lynn karena telah menghemat 1 byte.
Cobalah online! (dilengkapi dengan footer test-suite)
Penjelasan
sumber
ṢFµJ⁼
berhasil, tapi saya belum memikirkan semua kasus tepi.1
tidak hilang. Saya tidak yakin apakah ini dijamin oleh OP.J
bisa dikembalikan, menjamin hasil yang salah. apakah saya melewatkan sesuatu?Python 2 ,
5352 byteTerima kasih untuk byte xnor
Cobalah online!
sumber
[]
. Cukup rumit[0]
sehingga rentang dapat mulai dari0
.JavaScript (ES6),
5958 bytePenjelasan
Uji kasus
Tampilkan cuplikan kode
sumber
05AB1E , 4 byte
Cobalah online!
sumber
Haskell , 54 byte
Cobalah online!
sumber
Haskell , 37 byte
Cobalah online!
Cek apakah daftar yang disatukan secara leksikografis lebih kecil dari daftar yang tak terbatas
[1,2,3,...]
. Karena tidak ada duplikat, setiap ember yang hilang atau ember yang tidak sesuai pesanan akan menyebabkan nilai lebih besar daripadak
dik
tempat yang pertama, membuat daftar yang dihasilkan menjadi lebih besar ..sumber
Pyth, 6 byte
Coba di sini.
Penjelasan:
sumber
UI
bagian itu, tolongU <col>
adalahrange(len(A))
,I <pfn> <any> <n-1:any>
adalahA(B, ...) == B
.U <col>
inirange(len(A))
, tapi saya tidak menyadari bahwa port solusi Python akan lebih pendek ...PROLOG (SWI), 54 byte
Nah, itu lebih baik. Masih cukup bertele-tele, sayang.
Cobalah online!
Itu
s/1
predikat mengambil daftar sebagai argumen dan benar jika daftar adalah daftar ember mudah stackable.Peningkatan dalam algoritma: jika saya mengurutkan daftar sebelum saya meratakannya, ini memaksa semua sublists untuk diurutkan agar predikat benar. Sedikit "meminjam" dari jawaban Jelly Pietu1998 . Berkat itu saya dapat membuang
forall
yang lebih dari setengah dari program (lihat di bawah untuk jawaban yang asli).Bagaimana cara kerjanya?
Predikat itu benar jika semua klausa itu benar:
Jawaban sebelumnya, PROLOG (SWI), 109 byte
Cobalah online!
sumber
Pyth ,
9 1611 byte (Tetap)Menggunakan metode yang sama sekali berbeda dari jawaban lainnya. Pendekatan 7 byte yang lebih pendek dapat ditemukan di bawah.
Test Suite.
Penjelasan
Bagaimana cara kerjanya?
Mari kita ambil beberapa contoh, yang membuatnya lebih mudah untuk dipahami. Anggap inputnya
[[1,3,4],[5,7],[2,6]]
. Inti dari algoritma ini adalah bahwa setiap delta dalam daftar tidak rata harus 1 agar ember dapat ditumpuk.Pertama,
S
mengubahnya menjadi[[1, 3, 4], [2, 6], [5, 7]]
.Kemudian,
s
merata itu:[1, 3, 4, 2, 6, 5, 7]
.Letakkan
0
di depan:[0, 1, 3, 4, 2, 6, 5, 7]
.+
mendapat delta dari daftar[1, 2, 1, -2, 4, -1, 2]
,.tM
mengurangi setiap elemen[0, 1, 0, -3, 3, -2, 1]
,.Setiap non-
0
integer benar dalam Pyth, jadi kami memeriksa apakah ada elemen kebenaran dengan.E
(yang berarti tumpukan tidak dapat dibentuk dengan benar). Kami mendapatkanTrue
.!
meniadakan hasil, yang berubahTrue
menjadiFalse
.Jika inputnya, misalnya,
[[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]
algoritma akan bekerja seperti ini:Diurutkan oleh elemen tertinggi:
[[1], [2], [3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]
dan diratakan, dengan0
prepended:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
.Delta:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
. Semua get dikurangi:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
.Tidak ada unsur kebenaran, jadi kita dapatkan
False
. Dengan negasi logis, hasilnya adalahTrue
.Pyth , 7 byte
Test Suite.
Port of the Python menjawab dan variasi dari solusi @ Erik .
sumber
tM
penurunan setiap elemen? Saya akan berpikir bahwa pengurangan setiap elemen[1, 2, 1, -2, 4, -1, 2]
akan menghasilkan[0, 1, 0, -3, 3, -2, 1]
. Tapi itu tidak akan membantu menyelesaikan masalah, jadi saya harus salah paham apa artinya pengurangan setiap elemen.tM
mengurangi setiap elemen dalam daftar dengan1
. Ada kesalahan dalam penjelasan saya. Akan memperbaiki.Brachylog , 5 byte
Cobalah online!
Unifikasi yang dijelaskan:
Penjelasan analitis:
Pertama-tama kita mengurutkan daftar, dan kemudian kita menggabungkan (yaitu meratakan 1-dalam) (
oc
) sehingga ember ditumpuk dari kanan ke kiri jika memungkinkan. Kemudian, untuk memeriksa apakah bucket telah ditumpuk dengan benar (mis. Tidak ada bucket atau menara yang hilang), kami memeriksa bahwa daftar yang dihasilkan adalah kisaran inklusif dari 1 hingga panjangnya. Sekarang, alih-alih memeriksa daftar dengan rentang [1..n] yang panjangnya ({l⟦₁?}
), kami mencoba mencari input ke fungsi yang menghasilkan kisaran seperti itu (~⟦₁
), jika ada. Jika input ditemukan, maka program berakhir tanpa masalah, sehingga memicutrue.
status. Jika tidak ada input yang ditemukan, program gagal, memicufalse.
status.sumber
Python 2 , 43 byte
Cobalah online!
Cek apakah daftar yang disatukan secara leksikografis lebih kecil daripada
[1,2,3,...N]
besarN
. Karena tidak ada duplikat, setiap ember yang hilang atau ember yang tidak sesuai pesanan akan menyebabkan nilai lebih besar darik
padak
tempatnya, membuat daftar yang dihasilkan menjadi lebih besar. Panjang string input mencukupi sebagai batas atas karena setiap angka membutuhkan lebih dari 1 karakter.sumber
MATL , 5 byte
Cobalah online!
(Masukan implisit, katakanlah
{[4,5],[9,10],[1,2,3],[6,7,8]}
)S
- urutkan susunan input dalam urutan leksikografis ({[1,2,3],[4,5],[6,7,8],[9,10]}
)g
- dikonversi menjadi satu array (cell2mat
)t
- duplikat ituf
- temukan indeks nilai bukan nol. Karena input di sini adalah semua bukan nol, kembalikan daftar indeks dari 1 ke panjang (array) ([1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10]
)=
- periksa apakah array sama dengan rentang 1 hingga panjang (array)sumber
Japt ,
131211 byteIni mungkin bisa lebih pendek.
Cobalah atau jalankan semua test case
Penjelasan
sumber
ä-0 e¥J
atauän0 e¥1
ä
array. Terima kasih atas penghematannya.Scala, 49 Bytes
Tidak Disatukan:
sumber
Japt , 9 byte
Cobalah online!
sumber
g<space>
;)R , 58 byte
Cobalah online!
NB: SALAH adalah hasil yang benar, BENAR adalah yang palsu
Penjelasan:
sumber
seq(a)
untuk 2 byte? Juga, itu diizinkan untuk digunakanTRUE
sebagai nilai palsu dan sebaliknya (sebutkan dalam jawaban Anda), sehingga Anda dapat melakukannyaany(a-seq(a))
untuk byte lain.seq(a)
berperilaku berbeda ketikaa
panjangnya 1 dan saya melewatkan bahwa dalam hal ini kita akan mendapatkan hasil yang sama: D Terima kasih!C # (.NET Core) ,
157145132 byte-13 byte terima kasih kepada TheLethalCoder
Jumlah byte juga termasuk
Cobalah online!
Tidak Disatukan:
sumber
x.First()
->x[0]
?Enumerable.Range
->new int[]
danZip
dengan indeks jika memungkinkan ..? HapusWhere
dan masukkan kondisinyaAny
.new int[]
pendekatan akan membutuhkan penambahanSelect()
untuk mendapatkan indeks, dan pada akhirnya membuat jumlah byte lebih besar.CJam , 11 byte
Cobalah online!
Oww
:(
... ya!{$:+_,,:)=}
sumber
Arang , 19 byte (tidak bersaing?)
Cobalah online!
-10 byte berkat ASCII saja .
-3 byte terima kasih kepada ASCII-only untuk implementasi selanjutnya (lihat histori revisi untuk kemungkinan versi yang bersaing).
-
untuk kebenaran,untuk kepalsuan.
Input adalah daftar tunggal dari daftar daftar, karena cara Arang mengambil input.
sumber
UP
.UPsorted
.▷
digunakan di sana membuat lingkup hal-hal prioritas meskipun sehingga; s mengapaUP
masih ada tapi saya kira Anda bisa menghindari menggunakan nama fungsi python sebagai varnames?v
, juga O_O ini bahkan bukan tantangan seni ascii (tidak heran itu sangat ungolfy: PJava 10, 213 byte
Cobalah online.
Sepertinya ide yang bagus ketika saya mulai, tetapi bawaan ini hanya membuatnya lebih lama .. Pasti bisa bermain golf dengan menggunakan pendekatan yang lebih manual ..
Terinspirasi oleh jawaban 4-byte 05AB1E @EriktheOutgolfer . 4 vs 213 byte, rofl ..>.>
Penjelasan:
sumber