Wejście:
Dwa ciągi bez znaków nowej linii i białych znaków.
Wynik:
Oba ciągi wejściowe w oddzielnych wierszach, w razie potrzeby ze spacjami † dla jednego z dwóch ciągów. Oraz trzecią linię z postaci A
, R
, M
i , reprezentujący dodane , usunięte , zmodyfikowane i niezmienione .
† Dodajemy spacje do górnego lub dolnego ciągu wejściowego (jeśli musimy). Celem tego wyzwania jest uzyskanie ARM
możliwie najmniejszej liczby zmian ( ), znanych również jako odległość Levenshteina .
Przykład:
Powiedzmy, że ciągi wejściowe ABCDEF
i AFBECD
, następnie wyjście byłoby to:
A B CDEF
AFBECD
A A RR
Oto kilka innych możliwych nieprawidłowych danych wyjściowych jako przykład (i jest o wiele więcej):
ABCDEF
AFBECD
MMMMM
A BCDEF
AFBECD
A MMMR
AB CDEF
AFBECD
MAMMMR
ABC DEF
AFBECD
MMAMMR
ABC DEF
AFBECD
MMAA RR
ABCDEF
AFB ECD
MMR MA
AB CDEF // This doesn't make much sense,
AFBECD // but it's to show leading spaces are also allowed
AM A RR
Żadna z nich nie ma jednak tylko czterech zmian, więc A B CDEF\nAFBECD \n A A RR
jest to tylko poprawny wynik dla tego wyzwania.
Zasady konkursu:
- Możesz założyć, że ciągi wejściowe nie będą zawierać żadnych nowych wierszy ani spacji.
- Dwa ciągi wejściowe mogą mieć różne długości.
- Jeden z dwóch ciągów wejściowych powinien pozostać bez zmian, z wyjątkiem opcjonalnych spacji początkowych / końcowych.
- Jeśli twoje języki nie obsługują niczego oprócz ASCII, możesz założyć, że dane wejściowe będą zawierały tylko drukowalne znaki ASCII.
- Format wejściowy i wyjściowy są elastyczne. Możesz mieć trzy oddzielne ciągi, tablicę ciągów, pojedynczy ciąg znaków z nowymi wierszami, tablicę znaków 2D itp.
- Możesz użyć czegoś innego zamiast
ARM
, ale określ, czego użyłeś (tj.123
Lubabc.
, itd.) - Jeśli możliwe jest więcej niż jedno prawidłowe wyjście z taką samą ilością zmian (
ARM
), możesz wybrać, czy chcesz wypisać jedno z możliwych wyników, czy wszystkie. Wiodące i końcowe spacje są opcjonalne:
A B CDEF AFBECD A A RR
lub
"A B CDEF\nAFBECD\n A A RR" ^ Note there are no spaces here
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem swojego kodu.
- W razie potrzeby dodaj również wyjaśnienie.
Przypadki testowe:
In: "ABCDEF" & "AFBECD"
Output (4 changes):
A B CDEF
AFBECD
A A RR
In: "This_is_an_example_text" & "This_is_a_test_as_example"
Possible output (13 changes):
This_is_an _example_text
This_is_a_test_as_example
MAAAAAAA RRRRR
In: "AaAaABBbBBcCcCc" & "abcABCabcABC"
Possible output (10 changes):
AaAaABBbBBcCcCc
abcABCab cABC
R MM MMMR MM R
In: "intf(){longr=java.util.concurrent.ThreadLocalRandom.current().nextLong(10000000000L);returnr>0?r%2:2;}" & "intf(){intr=(int)(Math.random()*10);returnr>0?r%2:2;}"
Possible output (60 changes):
intf(){longr=java.util.concurrent.ThreadLocalRandom.current().nextLong(10000000000L);returnr>0?r%2:2;}
intf(){i ntr=( i n t)(M ath.r andom ()* 10 );returnr>0?r%2:2;}
MR M MRRRRRR RRRR RRRRRR MMMRR MMMMRRR RRRRRRRR MRRRRRRRRR RRRRRRRRRR
In: "ABCDEF" & "XABCDF"
Output (2 changes):
ABCDEF
XABCD F
A R
In: "abC" & "ABC"
Output (2 changes):
abC
ABC
MM
Odpowiedzi:
Haskell ,
192181174161158150147143158 1 bajtówWypróbuj online! Przykładowe zastosowania:
"ABCDEF" & "AFBECD"
. Zwraca listę trzech ciągów. Jest to rozszerzenie mojego rekurencyjnego rozwiązania na zwykłe pytanie dystansowe Levenshteina .Wyjaśnienie:
Aby obliczyć minimalne modyfikacje do przejścia od
"xyz"
do"yw"
, skupiamy się na pierwszym znaku obu ciągów. Istnieją trzy możliwości:x
z pierwszego ciągu i rekurencyjnie oblicz modyfikacje, aby uzyskać od"yz"
do"yw"
. To daje trzy linie["yz","yw"," M"]
. Dodajx
do pierwszego, spację do drugiego iR
do trzeciego. Dostajemyy
z drugiego ciągu i oblicz"xyz" & "w"
, co zwróci wynik["xyz","w","MRR"]
. Musimy dodać spację w pierwszym wierszu,y
w drugim iA
trzecim wierszu:"yz" & "w"
. Do wyniku["yz","w","MR"]
dodajemyx
on pierwszy iy
drugi wiersz. Tylko w ostatnim wierszu musimy rozróżnić, czy początkowe znaki są takie same. Jeśli są takie same, spacja jest dodawana do trzeciego wiersza, w przeciwnym razie (jak w tym przypadku, ponieważx \= y
)M
dodaje się:Spośród tych trzech kandydatów musimy znaleźć tę z najmniejszą liczbą modyfikacji. Jest to równoważne z posiadaniem największej liczby spacji w trzeciej linii. Dlatego konwertujemy każdego kandydata
s
(listę trzech ciągów) na krotkę([1|' '<-s!!2],s)
, gdzies
pojawia się jako drugi składnik, a pierwszy składnik jest listą z tyloma elementami, ile jest spacji w trzecim wierszus
(zs!!2
powodu indeksowania 0). Ponieważ1
używany jest element listy , ale rzeczywisty element nie ma znaczenia, o ile jest taki sam dla wszystkich kandydatów.W sumie daje to listę krotek
Wbudowanymaximum
wybiera największy element z tej listy, w którym krotki są porównywane leksykograficznie, czyli pod względem komponentów od lewej do prawej. Ponieważ[1]
jest większa niż[]
, wybrana jest pierwsza krotka isnd
zwraca ona drugą składową, czyli listę linii krotki.1 +15 bajtów, aby naprawić błąd, w którym
A
-changes na końcu łańcucha byłyby wyświetlane jakoR
-changesźródło
JavaScript (ES6),
413...343342 bajtówZaoszczędzono 5 bajtów, modyfikując indeksy pętli, jak sugeruje @KevinCruijssen
Pobiera dane wejściowe jako 2 ciągi w składni curry. Zwraca tablicę 3 ciągów znaków.
Przypadki testowe
Pokaż fragment kodu
Mniej golfa
Przykład
Poniżej znajduje się początkowa macierz dla b = „foo” i a = „ok” :
a oto ostatnia macierz po wszystkich iteracjach:
Ostateczny ciąg modyfikacji wraz z odległością Levenshteina są przechowywane w prawej dolnej komórce.
źródło
j
ix
nadal dotyczy ostatniej edycji:b=>a=>{m=[];x=a.length;y=b.length+1;for(i=y;i--;)m[i]=[[i,'R'.repeat(i)]];for(j=x+1;j--;)m[i=0][j]=[j,'A'.repeat(j)];for(;++i<y;)for(j=-1;++j<x;)R=m[S=(X=m[i-1][j])[0],I=(Y=m[i][j])[0],D=(Z=m[i-1][j+1])[0],Q=[D+1,Z[1]+'R'],i][j+1]=b[i-1]==a[j]?[S,X[1]+' ']:S<I?D<S?Q:[S+1,X[1]+'M']:D<I?Q:[I+1,Y[1]+'A'];return[(g=s=>R[1].replace(/./g,c=>c==s?' ':b[i++],i=0))('A'),g('R',b=a),R[1]]}
:)Python 2 ,
548536484500 1488447381 2373371357350 bajtówWypróbuj online!
Używa
'ARM_'
zamiast'ARM '
Działa, budując matrycę Levenshteina,
a następnie przechodząc do tyłu, aby znaleźć operacje. Teraz buduje ciąg operacji w tym samym czasie, co macierz Levenshteina, jak w odpowiedzi JS Arnaulda1: Więcej bajtów, ponieważ nie działało, jeśli pierwszy ciąg był jednym znakiem.
2: Przełączono na tworzenie kombinacji w matrycy Levenshteina.
źródło
m+i+1
może byćm-~i
.while i+j<n+m:v,A=(L[i]+[m,m])[j:j+2];R,M=(L[i+1]+[m,m])[j:j+2];d=min(A,R,M);q=M==d or(R==d)*2;r+=' '*(d==v==M)or'AMR'[q];i+=q>0;j+=q<2
Python 2 , 310 bajtów
Wypróbuj online!
Zastosowanie
difflib.SequenceMatcher
tego oblicza wyrównanie między dwoma łańcuchamiźródło
"This_is_an_example_text","This_is_a_test_as_example"
Mathematica, 250
256259384bajty~ 0,00035 sekund w przypadku kodu Java.
Stosowanie:
f["ABCDE", "ABCDF"]
Wypróbuj online!
Kod oparty jest na fakcie, że
SequenceAlignment
działa domyślnie naMianowicie, punktacja jest obliczana
M
,A
iR
, odpowiednio.Przykład:
źródło
i="";o="";p="";
nai="";o=i;p=i;
2 bajty?i=o=p=""
?D ,
351345 bajtów-6 bajtów dzięki dla KevinCruijssen
Wypróbuj online!
źródło
break;
. +1, jednak po raz pierwszy widzę język programowania D.