La matrice Wythoff est une matrice infinie composée des nombres Grundy de chaque carré sur un échiquier dans le jeu de Wythoff .
Chaque entrée de cette matrice est égale au plus petit nombre non négatif qui n'apparaît nulle part au-dessus, à gauche ou en diagonale au nord-ouest de la position de l'entrée.
Le carré 20 par 20 en haut à gauche ressemble à ceci:
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
Il n'existe actuellement aucun algorithme efficace connu pour calculer une entrée arbitraire dans la matrice Wythoff. Cependant, votre tâche dans ce problème est d'essayer de concevoir une fonction heuristique qui dira si le nombre à une coordonnée spécifique wythoff(x, y)
est pair ou impair.
Votre programme ne doit pas contenir plus de 64 Ko (65 536 octets) de code source ou utiliser plus de 2 Mo (2 097 152 octets) de mémoire de travail.
En particulier pour l'utilisation de la mémoire, cela signifie que la taille maximale définie par le résident de votre programme ne peut pas dépasser 2 Mo de plus que la taille maximale définie par le résident d'un programme vide dans cette langue. Dans le cas d'un langage interprété, ce serait l'utilisation de la mémoire de l'interpréteur / machine virtuelle elle-même, et dans le cas d'un langage compilé, ce serait l'utilisation de la mémoire d'un programme qui exécute la méthode principale et ne fait rien.
Votre programme sera testé sur la 10000 x 10000
matrice pour les valeurs de ligne 20000 <= x <= 29999
et les valeurs de colonne dans 20000 <= y <= 29999
.
Le score de votre programme est le taux de précision (nombre de suppositions correctes) atteint par votre programme, avec un code plus court faisant office de bris d'égalité.
01.R
est un 05AB1E qui sort vrai ou faux au hasard. Soit 0 vrai et 1 faux, mon programme sera théoriquement correct ~ 50% du temps. Est-ce une entrée valide?Réponses:
Python; précision = 54 074 818; taille = 65,526 octets
Scores précédents: 50 227 165; 50.803.687; 50,953,001
Cette approche divise toutes les entrées uniques de la matrice en 523 200 groupes et lit la meilleure estimation pour le groupe (x, y) à partir d'une chaîne binaire. Vous pouvez télécharger le code source complet depuis Google Drive .
J'ai utilisé les parités de @ PeterTaylor pour générer la chaîne et calculer la précision.
la source
CJam (précision 50016828/100000000, 6 octets)
(Dans le pseudocode de style ALGOL pour les non-CJammers:)
return ((x + y) & 1) == 0
.Cela fonctionne mieux que les deux autres douzaines d'heuristiques simples que j'ai essayées. C'est encore mieux que n'importe quelle combinaison avec les deux meilleurs suivants.
Le score suppose que ma section calculée de la matrice est correcte. Vérification indépendante bienvenue. J'héberge les bits de parité calculés sur http://cheddarmonk.org/codegolf/PPCG95604-parity.bz2 (téléchargement de 8 Mo, extrait dans un fichier texte de 50 Mo: puisque la matrice est symétrique par rapport à la diagonale principale, je n'ai inclus que chacun ligne à partir de la diagonale principale, vous devez donc décaler, transposer et bit à bit OU pour obtenir le carré complet).
Le code que j'ai utilisé pour le calculer est Java. Il utilise la définition de manière assez simple, mais avec une structure de données définie dont la longueur d'exécution code les plages de sorte qu'il est rapide de passer à la prochaine valeur autorisée. Une optimisation supplémentaire serait possible, mais elle s'exécute sur mon bureau modérément ancien en environ deux heures et 1,5 Go d'espace de stockage.
la source
J, précision = 50022668/10 8 = 50,0227%, 4 octets
Prend les coordonnées comme deux arguments, calcule le LCM entre eux et le prend modulo 2. A
0
signifie qu'il est pair et un1
moyen qu'il est impair.Les performances sont basées sur les bits de parité fournis par @ Peter Taylor .
La version PRNG avant pour 7 octets,
2|?.@#.
avait une précision de 50010491/10 8 .Explication
la source
1
que 25% du temps, lorsque la proportion correcte est presque exactement 50%), et pourtant elle fait mieux que beaucoup d'autres qui ne sont pas si manifestement mauvaises.AND
.