Eingang:
Zwei Zeichenfolgen ohne Zeilenumbrüche oder Leerzeichen.
Ausgabe:
Beide Eingabezeichenfolgen in getrennten Zeilen, ggf. mit Leerzeichen † für eine der beiden Zeichenfolgen. Und eine dritte Zeile mit den Zeichen A
, R
, M
und , was hinzugefügt , entfernt , verändert und unverändert .
† Wir fügen der oberen oder unteren Eingabezeichenfolge Leerzeichen hinzu (falls erforderlich). Ziel dieser Herausforderung ist es, möglichst wenig Änderungen ( ARM
) auszugeben , auch bekannt als Levenshtein-Abstand .
Beispiel:
Angenommen, die Eingabezeichenfolgen sind ABCDEF
und AFBECD
, dann wäre die Ausgabe wie folgt:
A B CDEF
AFBECD
A A RR
Hier sind einige andere mögliche ungültige Ausgaben als Beispiel (und es gibt noch viel mehr):
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
Keine davon hat jedoch nur vier Änderungen, also nur A B CDEF\nAFBECD \n A A RR
eine gültige Ausgabe für diese Herausforderung vorliegt.
Herausforderungsregeln:
- Sie können davon ausgehen, dass die Eingabezeichenfolgen keine neuen Zeilen oder Leerzeichen enthalten.
- Die beiden Eingabezeichenfolgen können unterschiedlich lang sein.
- Eine der beiden Eingabezeichenfolgen sollte unverändert bleiben, mit Ausnahme von optionalen führenden / nachfolgenden Leerzeichen.
- Wenn Ihre Sprachen nichts anderes als ASCII unterstützen, können Sie davon ausgehen, dass die Eingabe nur druckbare ASCII-Zeichen enthält.
- Das Eingabe- und Ausgabeformat ist flexibel. Sie können drei separate Strings, ein String-Array, einen einzelnen String mit Zeilenumbrüchen, ein 2D-Zeichen-Array usw. haben.
- Sie dürfen stattdessen etwas anderes verwenden
ARM
, aber geben Sie an , was Sie verwendet haben (z. B.123
oderabc.
usw.). - Wenn mehr als eine gültige Ausgabe mit der gleichen Anzahl von Änderungen möglich ist (
ARM
), können Sie auswählen, ob eine der möglichen Ausgaben oder alle davon ausgegeben werden sollen. Führende und nachfolgende Leerzeichen sind optional:
A B CDEF AFBECD A A RR
oder
"A B CDEF\nAFBECD\n A A RR" ^ Note there are no spaces here
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Es gelten Standardregeln Ihre Antwort Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Testfälle:
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
Antworten:
Haskell ,
192181174161158150147143158 1 ByteProbieren Sie es online! Beispiel Nutzung:
"ABCDEF" & "AFBECD"
. Gibt eine Liste mit drei Zeichenfolgen zurück. Dies ist eine Erweiterung meiner rekursiven Lösung der gewöhnlichen Levenshtein-Distanzfrage .Erläuterung:
Um die minimalen Änderungen zu berechnen, die von
"xyz"
zu kommen"yw"
, konzentrieren wir uns auf das erste Zeichen beider Zeichenfolgen. Es gibt drei Möglichkeiten:x
aus der ersten Zeichenfolge und rekursiv die Änderungen berechnen bekommen von"yz"
zu"yw"
. Dies ergibt die drei Linien["yz","yw"," M"]
. Fügen Siex
dem ersten ein Leerzeichen zum zweiten undR
zum dritten hinzu. Wir bekommeny
von der zweiten Zeichenkette und berechne"xyz" & "w"
, was das Ergebnis ergibt["xyz","w","MRR"]
. Wir müssen in der ersten Zeile ein Leerzeichen einfügen,y
in der zweiten undA
in der dritten Zeile einfügen:"yz" & "w"
. Zum Ergebnis["yz","w","MR"]
fügen wirx
in der ersten undy
in der zweiten Zeile hinzu. Nur für die letzte Zeile müssen wir unterscheiden, ob die Anfangszeichen gleich sind. Wenn sie identisch sind, wird ein Leerzeichen in die dritte Zeile eingefügt, andernfalls wird (wie in diesem Fall, weilx \= y
) FolgendesM
hinzugefügt:Von diesen drei Kandidaten müssen wir den mit den wenigsten Änderungen finden. Dies entspricht den meisten Leerzeichen in der dritten Zeile. Daher konvertieren wir jeden Kandidaten
s
(eine Liste mit drei Zeichenfolgen) in ein Tupel([1|' '<-s!!2],s)
, wobeis
als zweite Komponente angezeigt wird und die erste Komponente eine Liste mit so vielen Elementen ist, wie Leerzeichen in der dritten Zeile vons
(s!!2
wegen der 0-Indizierung) vorhanden sind. Als Listenelement1
wird verwendet, aber das tatsächliche Element ist irrelevant, solange es für alle Kandidaten gleich ist.Insgesamt ergibt dies die Liste der Tupel
Das Build-Inmaximum
wählt das größte Element dieser Liste aus, in dem Tupel lexikografisch verglichen werden, dh komponentenweise von links nach rechts. Wenn[1]
größer als[]
, wird das erste Tupel ausgewählt undsnd
das zweite der Komponente, dh der Liste der Zeilen, des Tupels zurückgegeben.1 +15 Byte, um einen Fehler zu beheben, bei dem
A
-Änderungen am Ende einer Zeichenfolge alsR
-Änderungen angezeigt werdenquelle
JavaScript (ES6),
413...343342 Byte5 Bytes durch Optimieren der Schleifenindizes gespart, wie von @KevinCruijssen vorgeschlagen
Nimmt Eingaben als 2 Zeichenfolgen in der Currying-Syntax an. Gibt ein Array mit 3 Zeichenfolgen zurück.
Testfälle
Code-Snippet anzeigen
Weniger golfen
Beispiel
Unten ist die anfängliche Matrix für b = "foo" und a = "ok" :
und hier ist die endgültige Matrix nach allen Iterationen:
Die endgültige Änderungszeichenfolge sowie der Levenshtein-Abstand werden in der rechten unteren Zelle gespeichert.
quelle
j
undx
gilt nach wie vor um Ihre neueste edit: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 BytesProbieren Sie es online!
Verwendet
'ARM_'
anstelle von'ARM '
Baut die Levenshtein-Matrix auf
und geht dann rückwärts, um die Operationen zu finden. Bildet nun den Operationsstring gleichzeitig mit der Levenshtein-Matrix, wie in Arnauld's JS-Antwort1: Mehr Bytes, da es nicht funktionierte, wenn die erste Zeichenfolge ein einzelnes Zeichen war.
2: Umstellung auf den Aufbau der Kombinationen in der Levenshtein-Matrix.
quelle
m+i+1
Kann seinm-~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 Bytes
Probieren Sie es online!
Mit
difflib.SequenceMatcher
diesem Befehl wird eine Ausrichtung zwischen zwei Zeichenfolgen berechnetquelle
"This_is_an_example_text","This_is_a_test_as_example"
Mathematica, 250
256259384Bytes~ 0,00035 Sekunden für den Java-Code-Fall.
Verwendung:
f["ABCDE", "ABCDF"]
Probieren Sie es online!
Der Code basiert auf einer Tatsache,
SequenceAlignment
die standardmäßig auf funktioniertUnd zwar wird der Scoring berechnet
M
,A
undR
dementsprechend.Beispiel:
quelle
i="";o="";p="";
zui="";o=i;p=i;
2 Bytes zu reduzieren?i=o=p=""
?D ,
351345 Bytes-6 Bytes Danke an KevinCruijssen
Probieren Sie es online!
quelle
break;
. +1 allerdings sehe ich zum ersten Mal die Programmiersprache D.