Der Hamming-Abstand zwischen zwei Saiten gleicher Länge ist die Anzahl der Positionen, an denen sich die entsprechenden Zeichen unterscheiden. Wenn die Saiten nicht gleich lang sind, ist die Hamming-Distanz nicht definiert.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die aus einer Liste von Zeichenfolgen den größten Hamming-Abstand unter allen Zeichenfolgenpaaren ermittelt.
Die Charaktere werden von innen sein a-zA-Z0-9
.
Die Zeichenfolgen sind möglicherweise nicht gleich lang. Daher muss für jeden Vergleich die kürzere Zeichenfolge wie folgt aufgefüllt werden:
- Wickeln Sie die Zeichenfolge von Anfang an so oft ein, bis die erforderliche Länge erreicht ist
- Ändern Sie die Groß- und Kleinschreibung der Buchstaben bei jedem ungeraden Umbruch (1., 3., 5. usw.)
- Lassen Sie die Dinge
a-zA-Z
beim Wickeln draußen unverändert
Angenommen, Sie müssen die Zeichenfolge mit 5 Zeichen auffüllen, ab9Cd
damit sie 18 Zeichen enthält. Sie würden am Ende mit:
ab9CdAB9cDab9CdAB9
^^^^^ ^^^
mit ^
unter dem 1. und 3. Umbruch hinzugefügt, um Änderungen an Groß- und Kleinschreibung hervorzuheben.
Input-Output
Das Eingabe- / Ausgabeformat ist flexibel. Sie können davon ausgehen, dass die Eingabe mindestens zwei Zeichen enthält und dass alle Zeichen mindestens ein Zeichen enthalten.
Die Ausgabe ist eine Ganzzahl.
Regeln
Das ist Code-Golf . Es gelten Standardregeln.
Testfälle
[ "a", "b" ] => 1
[ "a", "b", "c" ] => 1
[ "a", "a", "c" ] => 1
[ "abc", "abcd" ] => 1
[ "abc12D5", "abC34d3", "ABC14dabc23DAbC89d"] => 17
[ "a", "Aaa", "AaaA", "aAaAa", "aaaaaaaaaaaaaa", "AAaAA", "aAa" ] => 8
["AacaAc", "Aab"] => 2
Referenzimplementierung
Ich habe die Beispiele mit (vollständig ungolfed) R-Code getestet, den Sie hier ausprobieren können , um andere Beispiele, die Sie möglicherweise ausprobieren, mit Ihrem Code zu vergleichen.
["AacaAc", "Aab"] => 2
. Ein gezieltes Golfspielen auf meine Jelly-Antwort hätte diesen Fall nicht bestanden, aber alle anderen bestanden.Antworten:
Gelee , 20 Bytes
Bin nicht wirklich glücklich damit. Sollte golffähig sein, vielleicht sogar bis zu ~ 15 Bytes.
Probieren Sie es online!
oder Testen Sie eine Testsuite!
Erläuterung
quelle
LÞ
und am Ende immer noch das gleiche Maximum erreichen.ṁ/
die längste in einigen Fällen auf die Länge der kürzesten zuschneiden, was nicht das ist, was wir wollen .... Ich denke, die Testfälle sind zu gut gewählt (und das ist ein eher unglücklicher Zufall) ...["AacaAc", "Aab"]
.Python 2 , 86 Bytes
Probieren Sie es online!
Gegeben seien zwei Strings
s,t
,zip((s+s.swapcase())*len(t),t))
wird eine Liste von Tupeln der Länge sein ,len(t)
dazip
auf dem kürzesten iterable abschneidet. Wenn jalen(s)<len(t)
, dann wird diess
mit dem gewünschten Fall vertauscht und es werden diesum
unterschiedlichen Zeichen berechnet .Wenn
len(t)<=len(s)
, dann wird das Ergebnissum
kleiner oder gleich demsum
sein, was wir ausgewertet habent,s
; es hat also keine Auswirkung auf das Ergebnismax
in diesem Fall.quelle
y!=
anstelle von!=y
1 Byte speichernJavaScript (Node.js) , 111 Byte
Probieren Sie es online!
quelle
Gelee , 19 Bytes
Probieren Sie es online!
quelle
Ruby ,
8982 BytesErstellt das Kreuzprodukt der Eingabeliste gegen sich selbst, bevor die Hamming-Distanz jedes Paares unter Verwendung einer Duplizierungsmethode berechnet wird, die der Antwort von Chas Brown ähnelt . Ruby kann Strings nicht zusammenzippen oder Boolesche Werte ohne zusätzlichen Overhead hinzufügen. Daher muss stattdessen das Stringpaar manuell durchlaufen werden.
-7 Bytes von GB.
Probieren Sie es online!
quelle
Java 10 ,
748740667666616 BytesDies muss das dichteste und unleserlichste sein, aber das längste Golf, das ich je hatte.
Aufrufmethode
h(String[])
mit einem expliziten Array (keine var args): zBkehrt zurück
1
.Sie können es online ausprobieren !
Ungolfed und kommentiert:
Ich weiß, dass eine bessere Lösung erzielt werden kann, insbesondere für den Teil der Saitenpaarung.
BEARBEITEN : 8 Bytes durch Ändern der Größe des Int-Arrays in
hammingDistance()
das Quadrat der angegebenen Anzahl von Zeichenfolgen entfernen. Es behebt auch einArrayIndexOutOfBounds
in einem der Testfälle geworfenen Fehler.EDIT 2 : 33 Bytes dank Kevin Cruijssens Kommentaren gespart : Klassendeklaration entfernt, Namen auf 1 Zeichen gekürzt, Operatoren geändert, etc.
EDIT 3 : Speichern Sie 1 Byte und erreichen Sie die vom Satan genehmigte Punktzahl, indem Sie die Methode mit var-arg in array ändern.
EDIT 4 : Sparen Sie nochmals 50 Bytes dank Kevin Cruijssen : Aktualisieren Sie die Java-Version von 8 auf 10, um
var
Schlüsselwörter, entfernteStringBuilder
Instanzen usw. zu verwenden.quelle
hammingDistance
Verwenden Sie stattdessend
eine andere nicht verwendete Variable. Die meisten von Ihnen&&
können&
und||
können sein|
.c^' '
kann seinc^32
.boolean w = false;
kann seinboolean w=0>1;
.i=0
in der Schleifeninitialisierung kann entfernt und geändert werden die,i,j
zu,i=0,j
.++j
kann entfernt und dem++
hinzugefügt werden.charAt(j++)
..toString()
kann sein+""
.for(j=i+1;j<l;++j)
kann seinfor(j=0;++j<l;)
. Etc. etc.StringBuilder
kann seinStringBuffer
(wenn Sie auf Java 10 umsteigen, könnte es seinvar b=new StringBuffer(l);
. Dasboolean
undchar
kann es dann auch seinvar
. Wenn Sie Java 10 nicht lokal haben, ist es auf TIO verfügbar ). Außerdemfor(;i<n;++i){for(char c:s.toCharArray())b.append(e(w,c));w=!w;}
kannfor(;i++<n;w=!w)for(char c:s.toCharArray())b.append(e(w,c));
. Und ich bin mir ziemlich sicher, dass Sie dasStringBuffer
komplett entfernen und einfachString
und+=
statt verwenden könnenappend
.05AB1E ,
3329 BytesProbieren Sie es online aus oder überprüfen Sie alle Testfälle .
Kann höchstwahrscheinlich in Bytezahl halbiert werden, aber es funktioniert ..
Erläuterung:
quelle
Java 11, 387 Bytes
Probieren Sie es online aus. (HINWEIS: Da Java 11 noch nicht auf TIO ist,
String.repeat(int)
wurde es mitrepeat(String,int)
der gleichen Byte-Anzahl emuliert .)Erläuterung:
quelle
R 173 Bytes
Probieren Sie es online!
@ngm: Ich habe versucht , mein Bestes zu Golf Code (mit meiner schweren Anpassung natürlich) , aber, wie Sie wissen, ist R nicht sehr Golfy manipulieren Strings: P
quelle
outer
, alle Kombinationen zu erhalten und die Codepunkte stattdessen modular zu berechnenchartr
.