Pertimbangkan array bilangan bulat:
[1, 0, 9, 1, 3, 8]
Ada banyak cara untuk mem-partisi daftar ini menjadi sublists berturut-turut. Inilah tiga:
A: [[1, 0, 9], [1, 3, 8]]
B: [[1], [0, 9], [1, 3], [8]]
C: [[1, 0], [9, 1], [3, 8]]
Kami akan memanggil partisi Y dan memperbaiki partisi X lainnya jika X dapat diperoleh dari Y dengan menggabungkan beberapa sublistenya kembali bersama.
Begitu B
juga penyempurnaan A
: jika kita bergabung dengan dua yang pertama dan dua yang terakhir kembali bersama, kita dapatkan A
. Tapi C
ini bukan penyempurnaan A
: kita harus memisahkan 9
dan 1
untuk memulihkannya A
. Juga, partisi apa pun adalah perbaikan itu sendiri.
Perhatikan bahwa kami tidak diizinkan mengatur ulang setiap daftar atau elemen apa pun.
Tantangan
Diberikan dua partisi (daftar daftar bilangan bulat) X
dan Y
, tentukan apakah Y
penyempurnaan X
.
Anda mungkin menganggap bahwa partisi hanya akan berisi bilangan bulat dari 0
ke 9
, inklusif. Anda tidak boleh menganggap itu X
dan Y
merupakan partisi dari daftar yang sama (jika tidak, mereka juga bukan penyempurnaan dari satu sama lain). X
dan / atau Y
mungkin kosong tetapi tidak akan pernah berisi daftar kosong.
Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter fungsi (keluar).
Input dapat diambil dalam format string atau daftar yang nyaman. Karena elemen-elemen tersebut hanya berupa bilangan bulat satu digit, Anda dapat memilih untuk menghilangkan pembatas di dalam sublist, tetapi pastikan bahwa 0
s yang terdepan mungkin. Anda dapat memilih untuk mengambil X
dan Y
dalam urutan yang berlawanan.
Output harus truthy jika Y
merupakan penyempurnaan dari X
dan falsy sebaliknya.
Kode Anda harus dapat menyelesaikan setiap kasus uji di bawah dalam 1 detik pada mesin desktop yang masuk akal. (Ini hanyalah pemeriksaan kewarasan untuk menghindari solusi brute force sederhana.)
Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.
Uji Kasus
Setiap test case adalah pada barisnya sendiri, ditulis sebagai X Y
. Saya menggunakan notasi larik GolfScript / CJam untuk menghemat ruang horisontal:
Benar:
[] []
[[0]] [[0]]
[[1 0 9 1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9 1 3 8]] [[1 0 9 1 3] [8]]
[[1 0 9 1 3 8]] [[1] [0] [9] [1] [3] [8]]
[[1 0 9] [1 3 8]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5] [1 4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Falsy:
[[0]] []
[[0]] [[1]]
[[1 0 9]] [[1 0 9] [1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9 1 3 8]]
[[1 0 9] [1 3 8]] [[1 0 9]]
[[1 0 9] [1 3 8]] [[1 0] [9]]
[[1 0 9] [1 3 8]] [[1 0] [9 1] [3 8]]
[[1] [0 9] [1 3] [8]] [[1 0 9] [1 3 8]]
[[9 8 8 5 8 2 7] [5] [1 4] [2 0 0 6 0 8 4 2 6 4 2 3 7 8 7 3 9 5 7 9 8 2 9 5] [3 9 8] [7 1 4 9 7 4 5 9] [3 3 3] [9 0 7 8] [3 9 4 7 2 7 8 0 3 0] [8 2 2 7 3 9 3 2] [2 9 0 8 5 4 1 8 5 5 6 2 0 9 2 7 7 9 2 7] [3 6] [1 2 7 7 4 4 2 9]] [[9 8] [8] [5 8 2] [7] [5 1] [4] [2] [0 0 6] [0] [8 4 2] [6 4] [2] [3] [7 8] [7 3] [9] [5 7 9] [8 2] [9 5] [3] [9 8] [7 1 4] [9 7] [4 5 9] [3 3] [3] [9 0] [7 8] [3] [9] [4] [7 2] [7 8] [0] [3 0] [8 2] [2] [7 3] [9 3] [2] [2] [9] [0] [8 5 4] [1 8] [5 5] [6] [2 0] [9] [2] [7 7 9] [2 7] [3 6] [1 2] [7 7] [4 4 2] [9]]
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
<script>site = 'meta.codegolf'; postID = 5314; isAnswer = true; QUESTION_ID = 51719</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
Tantangan Terkait
sumber
[[[1 0 9] [1 3 8]] [[1] [0 9] [1 3] [8]]]
atau[["109" "138"] ["1" "09" "13" "8"]]
menjadi format input yang dapat diterima?Jawaban:
CJam,
13109 byteCobalah online di juru bahasa CJam .
Terima kasih kepada @ MartinBüttner karena menyarankan format input cerdik @ edc65 .
Terima kasih kepada @ jimmy23013 untuk meningkatkan format input dan bermain golf dengan 3 byte tambahan.
I / O
Memasukkan
Sublists dipisahkan oleh
;
dan dari satu sama lain oleh,
:Keluaran
Bagaimana itu bekerja
Untuk string dengan panjang yang berbeda,
.-
akan meninggalkan karakter dalam array, yang tidak dapat sama dengan bilangan bulat 0 atau 15.sumber
;
sebagai pemisah ...ll.m27m0-!
.,
dan;
keduanya sintaks array umum (dan tidak ada yang digunakan oleh CJam). Terima kasih!Pyth, 19 byte
Cobalah secara online: Demonstrasi atau Uji harness
Saya menggunakan format tuple / list Pyth sebagai input. Cukup ganti spasi kotak uji dengan koma.
Penjelasan:
Karena pseudo-code masih sedikit membingungkan, saya akan mendemonstrasikan algoritma menggunakan input contoh.
Bagian
.u+NYdY
menghitung semua sublists berkelanjutan, yang berisi elemen pertama.B
adalah penyempurnaan dariA
, jika setiap sublist kontinuA
juga merupakan sublist kontinuB
(hanya ada satu pengecualian).Jadi saya hanya memeriksa, jika himpunan sublist kontinu
A
adalah subset himpunan sublist kontinu dariB
(gF_m.u+NYdYQ
).Satu-satunya pengecualian adalah, jika daftar input pertama mengandung lebih sedikit elemen dari daftar input kedua. Misalnya
<Fm.u+YdYQ
akan kembaliTrue
untuk input[[1]],[[1],[2]]
.Karena itu saya juga memeriksa apakah daftar yang bergabung juga sama
&...qFsMQ
.sumber
JavaScript ( ES6 ), 67
70Edit 3 byte disimpan thx @apsillers
Jalankan cuplikan di bawah ini di Firefox untuk menguji
sumber
OK
danKO
.C, 69
75Fungsi dengan 2 parameter string, menghasilkan 0 atau 1.
Format parameter: sublist dipisahkan dengan spasi (''), elemen daftar dipisahkan dengan koma.
Contoh:
"1,0,9 1,3,8"
"1,0 9,1,3,8"
Kurang golf
Ide Tes (ketinggalan jaman)
sumber
Haskell, 76 byte
Pengembalian
True
atauFalse
. Contoh penggunaan:[[1,0,9],[1,3,8]] # [[1,0],[9]]
->False
.Pendekatan rekursif sederhana: jika unsur-unsur pertama cocok, lanjutkan dengan ekor, kalau tidak mulailah dari awal tetapi menyatukan dua unsur di bagian depan daftar kedua. Kasing dasar adalah: kedua daftar kosong ->
True
; keduanya daftar dengan satu elemen -> bandingkan; hanya satu daftar kosong ->False
.sumber
CJam, 19 byte
Cobalah online.
I / O
Memasukkan
Keluaran
Ide
Setiap partisi dapat diidentifikasi secara unik dengan mengamati dua properti berikut:
Daftar ini dibentuk dengan menggabungkan semua daftar.
"Titik potong", termasuk yang paling ujung dari daftar.
Kita dapat menggabungkan kedua kriteria menjadi satu dengan mengganti setiap titik pemotongan dengan sublist elemen dari titik potong ke akhir daftar.
Untuk memverifikasi bahwa partisi yang diberikan lebih baik daripada yang lain, kita hanya perlu memverifikasi apakah partisi yang lebih kasar, yang direpresentasikan di atas, adalah subset dari partisi yang lebih halus dan bahwa daftar terbesar dari kedua partisi tersebut cocok.
Kode
Untuk input dari contoh I / O, stack menampung
sebelum dieksekusi
-!
.Perhatikan bahwa elemen pertama dari setiap larik memiliki spasi tambahan. Ini memastikan kami membandingkan daftar lengkap input pertama dengan daftar lengkap input kedua.
sumber
CJam, 24 byte
Algoritma
Di sini kita cukup menggunakan algoritma serakah untuk melihat apakah
N
sub-daftar pertama dari daftar kedua dapat digabung bersama untuk membentuk sub-daftar pertama dari daftar pertama. SetelahN
ditemukan, kami menghapusN
sub-daftar pertama dari daftar kedua dan sub-daftar pertama dari daftar pertama dan mengulangi prosesnya.Idealnya, jika daftar kedua adalah penyempurnaan dari yang pertama, kita harus dibiarkan dengan 2 daftar kosong di tumpukan. Kami hanya memeriksa dan mencetak
1
jika itu yang terjadi. Dalam kombinasi lain, setelah sepenuhnya mengulangi sub-daftar daftar kedua, kami tidak akan berakhir dengan 2 daftar kosong. Jadi a0
akan dicetak untuk kasus-kasus seperti itu.Perluasan kode
Cobalah online di sini atau jalankan test suite lengkap di sini
sumber
C,
120114 byteSaya belum bermain golf baru-baru ini, jadi saya pikir saya akan mencoba yang ini.
Kami mendefinisikan fungsi
R(char* s, char* t)
yang mengembalikan1
jikat
adalah partisi yang disempurnakans
, dan0
sebaliknya.s
dant
diharapkan dalam format[DDDD...][DDDD...]...
Di mana masingD
- masing elemen satu digit.Kode pengujian:
Di atas mencetak yang berikut ini:
Tampaknya berhasil, setidaknya.
sumber
Haskell,
525053 byteSangat berbeda dari solusi saya yang lain . Menggunakan format input pintar yang sama dengan jawaban @ edc65 , yaitu elemen dipisahkan dengan
,
dan dicantumkan dengan.
Contoh penggunaan:
"1,0,9,1,3,8" # "1,0,9 1,3,8"
->True
.Parameter kedua adalah penyempurnaan dari yang pertama, jika mereka memiliki elemen yang sama di setiap posisi atau yang pertama
,
. Saya harus menambahkan token ujung unik (->..
) untuk kedua parameter, karenazipWith
memotong parameter yang lebih panjang dan misalnya"1,2,3" # "1,2"
juga akanTrue
.sumber
(\a b->a==b||a>b)
hanya(>=)
."."
alih-alih".."
bekerja juga?"2"#"1"
karena fungsi hanya memeriksa jika nilainya lebih besar, tidak sama"."
tidak akan bekerja, karena itu akan memberikan positif palsu"2,1" # "2"
yang pertama kali akan diperluas"2,1." # "2."
dan kemudian dipotong olehzipWith
ke"2," # "2."
. Koma di string pertama cocok dengan semuanya.Mathematica, 65 byte
sumber
Matematika dengan ekspresi reguler itu menyenangkan!
ES6 Javascript, 53 karakter
Javascript Vintage, 70 karakter
Menggunakan format input yang sama dengan jawaban edc65 .
Demo lengkap termasuk semua kasus uji di sini.
sumber
Mathematica, 55 byte
Ini mendefinisikan fungsi yang tidak disebutkan namanya, mengambil dua partisi dalam satu daftar , dalam urutan terbalik (yaitu
Y
pertama,X
kedua).Penjelasan
Ini memeriksa bahwa kedua partisi sebenarnya adalah partisi dari daftar yang sama.
Ini adalah bentuk golf dari pendekatan saya dalam pertanyaan ini di Mathematica.SE , yang menginspirasi tantangan ini. Pada dasarnya, partisi didefinisikan sebagai sejumlah indeks tempat pemisahan dimasukkan, dan ini memeriksa apakah semua posisi pemisahan
X
juga munculY
dengan mengakumulasikan panjang sublists.sumber
Python 2,
6851 byteTerima kasih kepada xnor untuk penghematan byte yang cukup besar!
Fungsi anonim yang mengambil dua string formulir
"1,0,9 1,3,8"
(diambil dari jawaban C edc65 ) dan mengembalikanTrue
atauFalse
. Versi barumap(None)
tanpa lagi berfungsi di Python 3.Test suite:
Solusi 92 byte sebelumnya yang mengambil input sebagai
"109 138"
:sumber
None
tetapi indeks lainnya memiliki nomor, karenai==j or"0">i>j
tidak dapat menampung.i==','
. Ini memungkinkan Anda menggabungkan tes sebagaii in[',',j]
(kami tidak dapat melakukani in ','+j
) karenaj
mungkinNone
.b
ada nomor di tempat itu?" ... lupa dengan format input ini, itu tidak mungkin.