Dalam tantangan tentang kode awalan ini , kami mempelajari bahwa kode awalan dapat disatukan secara unik.
Itu berarti, mereka dapat bergabung bersama tanpa pemisah, dan tanpa ambiguitas.
Misalnya, karena [1,2,45] adalah kode awalan, saya dapat bergabung bersama-sama tanpa pemisah seperti: 1245245112145, dan tidak akan ada ambiguitas.
Namun yang terjadi tidak selalu benar.
Misalnya, [3,34] bukan kode awalan. Namun, saya dapat melakukan hal yang sama: 3333434334333, dan tidak akan ada ambiguitas. Anda hanya perlu parser yang lebih pintar.
Namun, [1,11] tidak dapat digabungkan secara unik, karena 1111 dapat ditafsirkan dalam 5 cara.
Tujuan
Tugas Anda adalah menulis sebuah program / fungsi yang mengambil daftar string (ASCII) sebagai input, dan menentukan apakah mereka dapat digabungkan secara unik.
Detail
Duplikat dianggap salah.
Mencetak gol
Ini adalah kode-golf . Solusi terpendek dalam byte menang.
Testcases
Benar:
[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]
Salah:
[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]
Jawaban:
05AB1E , 15 byte
Di telepon, jadi penjelasan harus diikuti nanti. Kode:
Menggunakan pengodean CP-1252 . Cobalah online! .
Membutuhkan terlalu banyak memori untuk test case terakhir, sehingga mungkin tidak berfungsi ...
sumber
CJam (54 byte)
Mengambil input pada stdin sebagai daftar yang dipisahkan oleh baris baru.
Demo online
Jika kami tidak harus menangani kata sandi duplikat, ini dapat disingkat menjadi 44:
Atau jika CJam memiliki pengurangan array yang hanya menghapus satu item dari daftar pertama untuk setiap item di kedua, itu bisa menjadi 48 ...
Pembedahan
Ini adalah algoritma Sardinas-Patterson tetapi tidak dioptimalkan. Karena setiap sufiks menggantung hanya muncul paling banyak satu kali, menjalankan loop utama sebanyak yang ada karakter dalam input (termasuk pemisah) menjamin cukup.
Perhatikan bahwa saya harus mencari tahu apa yang bisa dikatakan sebagai bug dalam juru bahasa CJam:
Jadi pemeriksaan awalan lebih rumit
1$,<=
daripada\#!
sumber