Pertanyaan ini merupakan perpanjangan dari Periksa apakah kata-kata adalah isomorf dan menyalin bagian pertama untuk memberikan definisi isomorf.
Dua kata adalah isomorf jika memiliki pola pengulangan huruf yang sama. Misalnya keduanya ESTATE
dan DUELED
memiliki polaabcdca
ESTATE
DUELED
abcdca
karena huruf 1 dan 6 sama, huruf 3 dan 5 sama, dan tidak lebih jauh. Ini juga berarti kata-kata tersebut terkait dengan cipher pengganti, di sini dengan pencocokan E <-> D, S <-> U, T <-> E, A <-> L
.
Diberikan dua string X dan Y, dengan X tidak lebih dari Y, tugasnya adalah menentukan apakah ada substring Y yang merupakan isomorf dengan X.
Input: Dua string surat yang tidak kosong dari a..zA..Z yang satu string per baris. Ini akan datang dari input standar.
Output Substring dari string kedua yang merupakan isomorph dengan string pertama, jika hal seperti itu ada. Kalau tidak, output "Tidak!".
Aturan Kode Anda harus berjalan dalam waktu linier dalam total panjang input.
Skor Skor Anda adalah jumlah byte dalam kode Anda. Bytes paling sedikit menang.
Contoh input dan output
adca
ddaddabdaabbcc
dabd
Tip
Setidaknya ada satu solusi waktu yang tidak rumit, praktis cepat dan linear untuk masalah ini.
Jawaban:
Python 2,
338326323321310306297293290289280279266264259237230229226223222220219217 (260238231228225223221220218 dengan 0 status keluar)Algoritma adalah variasi KMP, menggunakan tes berbasis indeks untuk pencocokan karakter. Ide dasarnya adalah bahwa jika kita mendapatkan ketidakcocokan pada posisi
X[i]
maka kita dapat kembali ke tempat yang memungkinkan untuk pertandingan sesuai dengan sufiks terpanjangX[:i]
yaitu isomorfik ke awalanX
.Bekerja dari kiri ke kanan, kami menetapkan setiap karakter indeks yang sama dengan jarak ke kemunculan karakter sebelumnya, atau jika tidak ada kejadian sebelumnya maka kami mengambil panjang awalan string saat ini. Sebagai contoh:
Untuk menguji apakah dua karakter cocok, kami membandingkan indeks, menyesuaikan dengan tepat untuk indeks yang lebih besar dari panjang string (sub) saat ini.
Algoritma KMP menjadi sedikit disederhanakan karena kita tidak bisa mendapatkan ketidakcocokan pada karakter pertama.
Program ini menghasilkan kecocokan pertama jika ada. Saya menggunakan kesalahan runtime untuk keluar jika terjadi kecocokan, tetapi kode dapat dengan mudah dimodifikasi untuk keluar dengan bersih dengan biaya beberapa byte.
Catatan: Untuk menghitung indeks, kita dapat menggunakan
str.rfind
(sebagai lawan dari pendekatan saya sebelumnya menggunakan kamus) dan masih memiliki kompleksitas linier, dengan asumsi bahwastr.rfind
mulai mencari dari akhir (yang tampaknya satu-satunya pilihan implementasi yang waras) - untuk setiap karakter dalam alfabet , kita tidak perlu melewati bagian yang sama dari string dua kali, jadi ada batas atas (ukuran alfabet) * (ukuran string) perbandingan.Karena kode menjadi agak kabur dalam permainan golf, berikut ini adalah solusi (293 byte) sebelumnya yang sedikit lebih mudah dibaca:
The
e
tes fungsi ekivalensi karakter. Theexec
pernyataan memberikan indeks dan melakukan beberapa initialisations variabel. Proses loop pertamaX
untuk nilai jatuh kembali, dan loop kedua melakukan pencarian string.Pembaruan: Ini adalah versi yang keluar dengan bersih, dengan biaya satu byte:
sumber
r=raw_input
vs. r =input
menghemat 4 byte dan paren pada cetakan hanya biaya 3.exec
.Python 3, 401 byte
Ini sebagian besar masih belum diserang, tetapi saya pikir itu harus bekerja. Algoritma inti adalah KMP , ditambah faktor tambahan yang faktorial dalam ukuran alfabet (yang baik-baik saja, karena alfabetnya konstan). Dengan kata lain, ini adalah / harus menjadi salah satu algoritma linear yang sama sekali tidak praktis.
Berikut beberapa penjelasan untuk membantu analisis:
Untuk pengujian, Anda dapat mengganti
s
dengan alfabet yang lebih kecil daristring.ascii_letters
.sumber
APL (Dyalog) , 32 byte
Ini adalah fungsi infix, mengambil X sebagai argumen kiri dan Y sebagai argumen kanan.
Cobalah online!
{
…}
Lambda anonim di mana⍺
dan⍵
mewakili argumen (X dan Y)⍳⍨⍺
ɩ ndex selfie X ( ɩ ndices tentang kemunculan pertama elemen X di X)⊂
lampirkan sehingga kita dapat mencari seluruh pola itu(
...)⍳
ɩ ndex kemunculan pertama itu di ...≢⍺
penghitungan (panjang) X⍵,/⍨
semua substring dari ukuran Y (lit. reduksi concatenation dari mereka, tapi itu adalah no-op)s←
simpan dis
(untuk ubstrings s )⍳⍨¨
self ndex selfie masing-masingsekarang kita memiliki indeks pola pertama, atau 1 + jumlah pola jika tidak ditemukan kecocokan
(
...)⊃⍨
gunakan indeks itu untuk memilih dari ...⊂'No!'
string terlampir (sehingga berfungsi sebagai elemen tunggal)s,
diawali dengans
sumber