Der Hamming-Abstand zwischen zwei Saiten gleicher Länge ist die Anzahl der Positionen, an denen sich die entsprechenden Symbole unterscheiden.
Sei P
eine binäre Zeichenkette der Länge n
und T
sei eine binäre Zeichenkette der Länge 2n-1
. Wir können die n
Hamming-Abstände zwischen P
und für jeden n
-langen Teilstring T
in der Reihenfolge von links nach rechts berechnen und sie in ein Array (oder eine Liste) einfügen .
Beispiel Hamming-Distanz-Sequenz
Lass P = 101
und T = 01100
. Die Reihenfolge der Hamming-Abstände, die Sie von diesem Paar erhalten, ist 2,2,1
.
Definition von Nähe
Betrachten wir nun zwei solcher Sequenzen von Hamming-Entfernungen. Sagen Sie x = (0, 2, 2, 3, 0)
und y = (2, 1, 4, 4, 2)
als Beispiele. Wir sagen das x
und y
sind close
ob y <= x <= 2*y
oder ob x <= y <= 2*x
. Hier werden die Skalarmultiplikation und die Ungleichung elementweise genommen. Das heißt, für zwei Sequenzen A
und B
, A <= B iff A[i] <= B[i]
für alle Indizes i
.
Man beachte , dass Sequenzen von Hamming - Abstände bilden eine Teilordnung im Rahmen dieser Weise , sie zu vergleichen. Mit anderen Worten, viele Paare von Sequenzen sind weder größer oder gleich noch kleiner oder gleich zueinander. Zum Beispiel (1,2)
und (2,1)
.
Also anhand des obigen Beispiels, ist (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
aber (0, 2, 2, 3, 0)
nicht größer als (2, 1, 4, 4, 2)
. Auch (2, 1, 4, 4, 2)
ist nicht kleiner als oder gleich 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. Infolgedessen x
und y
nicht nah beieinander.
Aufgabe
Berücksichtigen Sie zum Erhöhen n
ab n=1
alle möglichen Paare von binären Zeichenfolgen P
der Länge n
und T
der Länge 2n-1
. Es gibt 2^(n+2n-1)
solche Paare und damit viele Sequenzen von Hamming-Abständen. Viele dieser Sequenzen sind jedoch identisch. Die Aufgabe besteht darin, die Größe des größten Satzes von Hamming-Distanzsequenzen zu ermitteln, sodass keine zwei Sequenzen nahe beieinander liegen.
Ihr Code sollte eine Zahl pro Wert von ausgeben n
.
Ergebnis
Ihre Punktzahl ist im Großen und Ganzen die höchste, die n
Ihr Code in 5 Minuten auf meinem Computer erreicht (aber lesen Sie weiter). Das Timing bezieht sich auf die Gesamtlaufzeit, nicht nur auf die Zeit dafür n
.
Um nicht optimale Antworten bewerten zu können, benötigen wir ein etwas subtiles Bewertungssystem, da es wahrscheinlich schwierig ist, optimale Antworten zu finden. Ihre Punktzahl ist der höchste Wert, n
für den niemand eine höhere richtige Antwort für eine Größe veröffentlicht hat, die kleiner als diese ist. Wenn Sie beispielsweise ausgeben 2, 4, 21
und jemand anderes ausgeben , 2, 5, 15
erzielen Sie nur ein Ergebnis, 1
wenn jemand anderes eine bessere Antwort auf diese Frage hat n = 2
. Wenn Sie ausgeben 2, 5, 21
, würden Sie 3
unabhängig von den Ausgaben anderer Punkte erzielen , da diese Antworten alle optimal sind. Wenn Sie alle optimalen Antworten haben, erhalten Sie die Punktzahl für den höchsten n
Beitrag, den Sie verfassen. Aber auch wenn Ihre Antwort nicht optimal ist, können Sie die Punktzahl erhalten, wenn niemand anders sie schlagen kann.
Beispielantworten und bearbeitetes Beispiel
(Diese Antwort ist noch nicht angekreuzt. Eine unabhängige Überprüfung wäre dankbar.)
Dank ETHproductions:
- n = 1 ergibt 2.
- n = 2 ergibt 5.
- n = 3 ergibt 21.
Schauen wir uns das n = 2
genauer an. In diesem Fall lautet die vollständige Liste der Hamming-Distanzsequenzen (hier durch Tupel dargestellt):
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Wir können sehen, dass dies (0,0)
keinem anderen Tupel nahe kommt. In der Tat , wenn wir annehmen (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
dann keines dieser Tupel ist in der Nähe zu einem anderen. Dies ergibt eine Punktzahl von 5
für n = 2
.
Für n = 3
die vollständige Liste der deutlichen Hamming - Distanz - Sequenzen ist:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
Von diesen 48
Sequenzen können wir eine Menge von Größen auswählen, 21
so dass kein Paar in dieser Menge nahe beieinander liegt.
Sprachen und Bibliotheken
Sie können jede verfügbare Sprache und Bibliothek verwenden, die Sie mögen. Wo immer möglich, wäre es gut, wenn Sie Ihren Code ausführen könnten. Fügen Sie daher bitte eine vollständige Erklärung dazu bei, wie Sie Ihren Code unter Linux ausführen / kompilieren, wenn dies überhaupt möglich ist.
Mein Computer Die Timings werden auf meinem 64-Bit-Computer ausgeführt. Dies ist eine Ubuntu-Standardinstallation mit 8 GB RAM, AMD FX-8350 Eight-Core-Prozessor und Radeon HD 4250. Dies bedeutet auch, dass ich in der Lage sein muss, Ihren Code auszuführen.
Führende Antwort
- Score von 4 für 2, 5, 21, 83, 361 von Christian Sievers. C ++
- Score von 5 für 2, 5, 21, 83, 372 von fəˈnəˈtɛk. Javascript