Der Hamming-Abstand zwischen zwei Saiten gleicher Länge ist die Anzahl der Positionen, an denen sich die entsprechenden Symbole unterscheiden.
Sei Peine binäre Zeichenkette der Länge nund Tsei eine binäre Zeichenkette der Länge 2n-1. Wir können die nHamming-Abstände zwischen Pund für jeden n-langen Teilstring Tin der Reihenfolge von links nach rechts berechnen und sie in ein Array (oder eine Liste) einfügen .
Beispiel Hamming-Distanz-Sequenz
Lass P = 101und 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 xund ysind closeob y <= x <= 2*yoder ob x <= y <= 2*x. Hier werden die Skalarmultiplikation und die Ungleichung elementweise genommen. Das heißt, für zwei Sequenzen Aund 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 xund ynicht nah beieinander.
Aufgabe
Berücksichtigen Sie zum Erhöhen nab n=1alle möglichen Paare von binären Zeichenfolgen Pder Länge nund Tder 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 nIhr 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, nfü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, 21und jemand anderes ausgeben , 2, 5, 15erzielen Sie nur ein Ergebnis, 1wenn jemand anderes eine bessere Antwort auf diese Frage hat n = 2. Wenn Sie ausgeben 2, 5, 21, würden Sie 3unabhä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 nBeitrag, 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 = 2genauer 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 5für n = 2.
Für n = 3die 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 48Sequenzen können wir eine Menge von Größen auswählen, 21so 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