Penjelasan
Dua string dapat dikocok dengan menyelingi surat-surat mereka untuk membentuk string baru, seperti dua tumpukan kartu dapat dikocok untuk membentuk satu tumpukan.
Misalnya, senar HELLO
dan WORLD
dapat dikocok untuk membentuk HWEOLRLLOD
, atau HEWORLLLDO
, atau mungkin hanya HELLOWORLD
.
Ini bukan acak jika urutan huruf asli tidak dipertahankan. Misalnya, D
dalam WORLD
tidak dapat pernah muncul sebelum R
setelah dikocok. Ini berarti bahwa EHLLOWRDLO
, misalnya, bukan acak HELLO
dan WORLD
, meskipun berisi semua huruf asli.
String adalah pengocokan kembar jika dapat dibentuk dengan mengacak dua string yang identik. Misalnya, ABACBDECDE
adalah kocokan si kembar karena dapat dibentuk dengan mengocok ABCDE
dan ABCDE
. DBEACBCADE
bukan pengocokan kembar karena tidak dapat dibentuk dengan mengacak dua string yang identik.
Detail Program
Diberikan string input, output 0
jika bukan kocokan kembar, dan output salah satu string kembar jika itu adalah kocokan kembar.
Anda dapat mengasumsikan bahwa string input memiliki panjang inklusif antara empat dan dua puluh karakter dan seluruhnya terdiri dari karakter huruf besar. Seharusnya bisa berjalan dalam jumlah waktu yang wajar, katakanlah, di bawah 10 menit.
Ini kode golf, jadi solusi terpendek menang.
Contoh I / O
> ABACBDECDE
ABCDE
> DBEACBCADE
0
> FFFFFF
FFF
> FFGGG
0
> ABBA
0
> AABB
AB
> AABAAB
AAB
Saya punya contoh implementasi (non-golf) .
sumber
that the input string has a length inclusively between four and twenty characters
, dan jangan bilang "jangan pernah percaya input pengguna!", "Jangan pernah percaya spesifikasi!"FFGGG
untuk membuatnya konsisten.Jawaban:
Haskell, 114
Tidak Disatukan:
Penjelasan:
Sebagian besar pekerjaan sedang dilakukan dalam
partitions
fungsi. Ia bekerja dengan secara rekursif menghasilkan semua partisi(a, b)
dari ekor daftar, dan kemudian menggunakan daftar monad untuk menambahkan elemen awalx
ke masing-masing dari mereka dan mengumpulkan semua hasil.findMatch
berfungsi dengan memfilter daftar ini sehingga hanya partisi yang urutannya tetap sama. Kemudian mengembalikan urutan pertama di partisi pertama. Jika tidak ada yang tersisa, daftar itu kosong, jadi yang"0"
ditambahkan pada akhirnya akan dikembalikan sebagai gantinya.main
baca saja inputnya, masukkan melalui dua fungsi ini dan cetaklah.sumber
R, 113 karakter
Tidak digabungkan (dan alih-alih fungsi yang mengambil string):
Solusinya bergantung pada
combn
fungsi yang menghasilkan semua kombinasi indeks sebagai kolom dalam matriks.apply
kemudian menerapkan fungsi ke setiap kolom (dimensi2
) dalam matriks dan mengembalikan vektor string atau nol.max
kemudian temukan string terbesar (yang mengalahkan 0).Fitur keren di R adalah kemampuan untuk memilih subset dari vektor yang diberi vektor indeks, dan untuk kemudian memilih pelengkap dari subset tersebut dengan meniadakan indeks:
x[i] == x[-i]
sumber
Mathematica, 87
Ini secara langsung didasarkan pada posting hammar, tetapi mudah-mudahan cukup berbeda untuk mendapatkan posting.
Uji:
sumber
D
menggunakan kedalaman pencarian rekursif pertama
Saya bisa membuatnya lebih cepat dengan
int i = min(a.length,b.length);if(a[0..i]!=b[0..i])return "0";
klausa penjagasumber
void main(){writeln(c("ABCADABCAD"));}
- hanya versi D yang berbeda, salah saya, sesuatu yang lain? Bagaimana dengan "ABCABCA"?Ruby, 89 karakter
Kode ini mengimplementasikan algoritma pencarian rekursif biasa. Masukan harus diberikan pada STDIN.
sumber
Perl, 68 karakter
String input diasumsikan dalam
$_
variabel, output adalah nilai ekspresi. Mengejar baris baru dalam input diabaikan. Anda dapat menjalankan ini dari baris perintah seperti ini:Kode ini memanfaatkan mesin regexp Perl (dan khususnya fitur eksekusi kode yang disematkan ) untuk melakukan backtracking. Pada dasarnya, ini cocok dengan string input terhadap regexp
^((.+))+$
, melacak kiriman bernomor ganjil dan genap di$x
dan$,
, dan menolak kecocokan pada akhirnya jika keduanya tidak sama.sumber
AABAAB
?AABAAB
ini adalah kasus yang mudah untuk solusi ini, karena kelompok luar hanya perlu mencocokkan dua kali. Butuh waktu lebih lama untuk menyelesaikannya denganAABB
benar.)Python, 168 karakter
sumber