Die Wythoff-Matrix ist eine unendliche Matrix, die aus den Grundy-Zahlen jedes Quadrats auf einem Schachbrett in Wythoffs Spiel besteht .
Jeder Eintrag in dieser Matrix entspricht der kleinsten nichtnegativen Zahl, die nirgends über, links oder diagonal nordwestlich der Position des Eintrags erscheint.
Das obere linke 20-mal-20-Quadrat sieht folgendermaßen aus:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 0 4 5 3 7 8 6 10 11 9 13 14 12 16 17 15 19 20
2 0 1 5 3 4 8 6 7 11 9 10 14 12 13 17 15 16 20 18
3 4 5 6 2 0 1 9 10 12 8 7 15 11 16 18 14 13 21 17
4 5 3 2 7 6 9 0 1 8 13 12 11 16 15 10 19 18 17 14
5 3 4 0 6 8 10 1 2 7 12 14 9 15 17 13 18 11 16 21
6 7 8 1 9 10 3 4 5 13 0 2 16 17 18 12 20 14 15 11
7 8 6 9 0 1 4 5 3 14 15 13 17 2 10 19 21 12 22 16
8 6 7 10 1 2 5 3 4 15 16 17 18 0 9 14 12 19 23 24
9 10 11 12 8 7 13 14 15 16 17 6 19 5 1 0 2 3 4 22
10 11 9 8 13 12 0 15 16 17 14 18 7 6 2 3 1 4 5 23
11 9 10 7 12 14 2 13 17 6 18 15 8 19 20 21 4 5 0 1
12 13 14 15 11 9 16 17 18 19 7 8 10 20 21 22 6 23 3 5
13 14 12 11 16 15 17 2 0 5 6 19 20 9 7 8 10 22 24 4
14 12 13 16 15 17 18 10 9 1 2 20 21 7 11 23 22 8 25 26
15 16 17 18 10 13 12 19 14 0 3 21 22 8 23 20 9 24 7 27
16 17 15 14 19 18 20 21 12 2 1 4 6 10 22 9 13 25 11 28
17 15 16 13 18 11 14 12 19 3 4 5 23 22 8 24 25 21 26 10
18 19 20 21 17 16 15 22 23 4 5 0 3 24 25 7 11 26 12 13
19 20 18 17 14 21 11 16 24 22 23 1 5 4 26 27 28 10 13 25
Derzeit ist kein effizienter Algorithmus zur Berechnung eines beliebigen Eintrags in der Wythoff-Matrix bekannt. Ihre Aufgabe bei diesem Problem besteht jedoch darin, eine heuristische Funktion zu entwerfen, die angibt, ob die Zahl an einer bestimmten Koordinate wythoff(x, y)
gerade oder ungerade ist.
Ihr Programm darf nicht mehr als 64 KB (65.536 Byte) Quellcode enthalten oder mehr als 2 MB (2.097.152 Byte) Arbeitsspeicher verwenden.
Insbesondere für die Speichernutzung bedeutet dies, dass die maximale Größe des residenten Satzes Ihres Programms 2 MB nicht überschreiten darf als die maximale Größe des residenten Satzes eines leeren Programms in dieser Sprache. Im Fall einer interpretierten Sprache wäre dies die Speichernutzung des Interpreters / der virtuellen Maschine selbst, und im Fall einer kompilierten Sprache wäre es die Speichernutzung eines Programms, das die Hauptmethode ausführt und nichts tut.
Ihr Programm wird in der 10000 x 10000
Matrix auf Zeilen- 20000 <= x <= 29999
und Spaltenwerte in getestet 20000 <= y <= 29999
.
Die Punktzahl Ihres Programms ist die Genauigkeitsrate (Anzahl der richtigen Vermutungen), die Ihr Programm erreicht, wobei kürzerer Code als Tiebreaker fungiert.
01.R
ist ein 05AB1E, der zufällig wahr oder falsch ausgibt. Sei 0 wahr und 1 falsch, mein Programm wird theoretisch ~ 50% der Zeit korrekt sein. Ist das ein gültiger Eintrag?Antworten:
Python; Genauigkeit = 54.074.818; Größe = 65.526 Bytes
Frühere Ergebnisse: 50.227.165; 50,803,687; 50.953.001
Dieser Ansatz unterteilt alle eindeutigen Einträge der Matrix in 523.200 Gruppen und liest die beste Schätzung für die Gruppe (x, y) aus einer binären Zeichenfolge. Sie können den vollständigen Quellcode von Google Drive herunterladen .
Ich habe die Paritäten von @ PeterTaylor verwendet , um die Zeichenfolge zu generieren und die Genauigkeit zu berechnen.
quelle
CJam (Genauigkeit 50016828/100000000, 6 Byte)
(Im ALGOL-Pseudocode für Nicht-CJammer :)
return ((x + y) & 1) == 0
.Dies ist besser als alle anderen zwei Dutzend einfachen Heuristiken, die ich ausprobiert habe. Es ist sogar besser als jede Kombination mit den nächsten beiden besten.
Die Punktzahl setzt voraus, dass mein berechneter Abschnitt der Matrix korrekt ist. Unabhängige Überprüfung begrüßt. Ich hoste die berechneten Paritätsbits unter http://cheddarmonk.org/codegolf/PPCG95604-parity.bz2 (8 MB Download, Auszüge aus 50 MB Textdatei: Da die Matrix symmetrisch zur Hauptdiagonale ist, habe ich nur jede eingeschlossen Linie beginnend mit der Hauptdiagonale, also müssen Sie versetzen, transponieren und bitweise ODER, um das volle Quadrat zu erhalten).
Der Code, mit dem ich ihn berechnet habe, ist Java. Die Definition wird recht einfach verwendet, jedoch mit einer festgelegten Datenstruktur, deren Lauflänge die Bereiche codiert, sodass schnell zum nächsten zulässigen Wert gesprungen werden kann. Eine weitere Optimierung wäre möglich, läuft jedoch auf meinem mäßig alten Desktop in etwa zwei Stunden und 1,5 GB Heap-Speicherplatz.
quelle
J, Genauigkeit = 50022668/10 8 = 50,0227%, 4 Bytes
Nimmt die Koordinaten als zwei Argumente, berechnet das LCM zwischen ihnen und nimmt es Modulo 2. A
0
bedeutet, dass es gerade und a1
bedeutet, dass es ungerade ist.Die Leistung basiert auf den von @ Peter Taylor bereitgestellten Paritätsbits .
Die PRNG-Version zuvor für 7 Bytes
2|?.@#.
hatte eine Genauigkeit von 50010491/10 8 .Erläuterung
quelle
1
nur 25% der Zeit, wenn der richtige Anteil fast genau 50% beträgt), und dennoch ist es besser als viele, die nicht so offensichtlich schlecht sind.AND
.