Wyjaśnienie
Odległość edytować między dwóch ciągów jest funkcją minimalnej możliwej liczby insercji, delecji lub podstawienia do konwersji jednego słowa do słowa.
Wstawienia i usunięcia kosztują 1, a zamiany kosztują 2.
Na przykład odległość między AB
i A
wynosi 1, ponieważ usunięcie kosztuje 1, a jedyną potrzebną edycją jest usunięcie B
znaku.
Odległość między CAR
i FAR
wynosi 2, ponieważ podstawienia kosztują 2. Innym sposobem na to jest jedno usunięcie i jedno wstawienie.
Zasady
Biorąc pod uwagę dwa ciągi wejściowe (dostarczone jest jednak wygodne w twoim języku), twój program musi znaleźć minimalną odległość edycji między tymi dwoma ciągami.
Możesz założyć, że ciągi zawierają tylko znaki A-Z
i mają mniej niż 100 znaków i więcej niż 0 znaków.
To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie.
Przykładowe przypadki testowe
ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8
levenshtein
funkcja traktuje podstawienia jako jedną edycję (zastępowanie), a nie dwie (usuwanie + wstawianie).Odpowiedzi:
pieprzenie mózgu, 2680
Oczywiście przy użyciu programowania dynamicznego.
Ciągi wejściowe powinny być oddzielone spacją, a następnie nowy wiersz. Na przykład:
źródło
Python, 138
148152znakówOk, znałem tę zasadę, ale nigdy wcześniej nie wdrożyłem odległości edycji, więc oto:
źródło
PHP, 40
Przestrzega zasad, jak podano, ale nie ducha zasad:
Jako argument przyjmuje dwa parametry. Przykład numerem:
php edit_dist.php word1 word2
.Zwykle
levenshtein()
uważa podstawienie za jedną operację, ale ma on postać przeciążoną, w której można określić wagi wstawiania / sub / usuwania. W tym przypadku jest to 1/2/1.źródło
APL (90 znaków)
Używam Dyalog APL jako mojego interpretera, z
⎕IO
ustawieniem na 1 i⎕ML
ustawieniem na 0. Funkcja direct ({ ... }
) oblicza, podając wiersz jako dane wejściowe, następny wiersz w macierzy odległości. (Rozpoczyna się od pierwszego wiersza:.0,⍳x
) Operator mocy (⍣
) służy do zagnieżdżenia funkcji raz dla każdego znaku w drugim ciągu (⊃⍴b
). Po tym wszystkim ostatni wiersz jest odwracany (⌽
) i pobierany jest jego pierwszy element (⊃
).Przykład:
źródło
R 51
Odczytuje to dwa wiersze od użytkownika (które są danymi wejściowymi), a następnie po prostu używa
adist
funkcji do obliczenia odległości. Ponieważ podstawienia kosztują 2 za ten problem, musimy dodać nazwany wektor dla parametru kosztów dla adist. Ponieważ istnieje także parametr counts dla adist, możemy jedynie skrócić koszty do cos, więc nadal mamy unikalne dopasowanie dla nazw parametrów.Przykładowe użycie
źródło
Ruby 1.9, 124
Golfowa wersja powolnej, rekurencyjnej metody Ruby tutaj , zmodyfikowana w celu podwojenia wagi zastępstw. Fakt, że usunięcie pierwszego znaku ciągu zajmuje 7 znaków, naprawdę boli i fajnie byłoby zastąpić
(a[0]==b[0]?-1:1)
go czymś takim,-1**a[0]<=>b[0]
ale kolejność operacji nie jest moim przyjacielem.źródło
Smalltalk (Smalltalk / X), 34
Mam szczęście - standardowa klasa „String” zawiera już levenshtein:
wprowadź a, b:
(dodatkowe parametry pozwalają na różne wagi przy podstawianiu, usuwaniu itp.)
Testowe uruchomienie:
->
źródło