Penjelasan
The mengedit jarak antara dua string adalah fungsi dari jumlah minimum yang mungkin insersi, delesi, atau substitusi untuk mengkonversi satu kata ke kata lain.
Penyisipan dan penghapusan biaya 1, dan biaya penggantian 2.
Misalnya, jarak antara AB
dan A
adalah 1, karena penghapusan biaya 1 dan satu-satunya pengeditan yang diperlukan adalah penghapusan B
karakter.
Jarak antara CAR
dan FAR
adalah 2, karena biaya penggantian 2. Cara lain untuk melihat ini adalah satu penghapusan dan satu penyisipan.
Aturan
Diberikan dua string input (disediakan namun nyaman dalam bahasa Anda), program Anda harus menemukan jarak edit minimum antara dua string.
Anda dapat mengasumsikan bahwa string hanya berisi karakter A-Z
dan memiliki kurang dari 100 karakter dan lebih dari 0 karakter.
Ini kode golf , jadi solusi terpendek menang.
Contoh Uji Kasus
ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8
levenshtein
memperlakukan substitusi sebagai satu edit (pengganti), bukan dua (delete + insert).Jawaban:
brainfuck, 2680
Menggunakan pemrograman dinamis, tentu saja.
String input harus dipisahkan oleh spasi, dan diikuti oleh baris baru. Sebagai contoh:
sumber
Python, 138
148152karakterOk, saya tahu prinsipnya tetapi belum pernah mengimplementasikan edit distance sebelumnya, jadi begini:
sumber
PHP, 40
Mengikuti aturan sebagaimana dinyatakan, tetapi tidak semangat aturan:
Membawa dua parameter sebagai argumen. Contoh memanggil:
php edit_dist.php word1 word2
.Biasanya
levenshtein()
menganggap substitusi sebagai satu operasi, tetapi memiliki bentuk kelebihan tempat bobot insert / sub / delete dapat ditentukan. Dalam hal ini, 1/2/1.sumber
APL (90 karakter)
Saya menggunakan Dyalog APL sebagai juru bahasa saya, dengan
⎕IO
set ke 1 dan⎕ML
set ke 0. Fungsi langsung ({ ... }
) menghitung, diberi baris sebagai input, baris berikutnya dalam matriks jarak. (Dimulai dengan baris awal:.0,⍳x
) Operator daya (⍣
) digunakan untuk membuat sarang fungsi sekali untuk setiap karakter dalam string kedua (⊃⍴b
). Setelah semua itu, baris terakhir dibalik (⌽
), dan elemen pertamanya diambil (⊃
).Contoh:
sumber
R 51
Ini dibaca dalam dua baris dari pengguna (yang merupakan input) dan kemudian hanya menggunakan
adist
fungsi untuk menghitung jarak. Karena biaya pengganti 2 untuk masalah ini, kita perlu menambahkan vektor bernama untuk parameter biaya untuk adist. Karena ada juga parameter jumlah untuk adist, kami hanya dapat mempersingkat biaya menjadi cos sehingga kami masih memiliki kecocokan unik untuk nama parameter.Contoh penggunaan
sumber
Ruby 1.9, 124
Versi Golf dari metode Ruby rekursif yang lambat di sini , dimodifikasi untuk menggandakan bobot penggantian. Fakta bahwa dibutuhkan 7 karakter untuk menghapus karakter pertama dari string benar-benar menyakitkan, dan itu akan keren untuk diganti
(a[0]==b[0]?-1:1)
dengan sesuatu seperti-1**a[0]<=>b[0]
tetapi urutan operasinya bukan teman saya.sumber
Smalltalk (Smalltalk / X), 34
Saya beruntung - kelas "String" standar sudah berisi levenshtein:
masukan a, b:
(parameter tambahan memungkinkan untuk bobot yang berbeda pada substitusi, penghapusan, dll.)
Uji coba:
->
sumber