Inspiré par The Great API Easter Egg Hunt!
Résumé
Votre tâche consiste à rechercher un entier prédéterminé dans "l'espace Collatz" (pour être expliqué plus loin) en utilisant le moins d'étape possible.
introduction
Ce défi est basé sur la célèbre conjecture de Collatz dont tout le monde ici, espérons-le, a au moins entendu parler. Voici un récapitulatif tiré de Imprimer les numéros Super Collatz .
La séquence Collatz (également appelée problème 3x + 1) est l'endroit où vous commencez avec n'importe quel entier positif, pour cet exemple, nous utiliserons 10, et lui appliquerons cet ensemble d'étapes:
if n is even: Divide it by 2 if n is odd: Multiply it by 3 and add 1 repeat until n = 1
La distance Collatz C(m,n)
entre les deux nombres m
et n
, aux fins de ce défi, est la distance entre deux nombres dans le graphique Collatz (Crédits à @tsh pour me parler de ce concept), qui est défini comme suit: (en utilisant 21
et 13
comme exemples ):
Notez la séquence Collatz pour m
(dans ce cas, 21
):
21, 64, 32, 16, 8, 4, 2, 1
Notez la séquence Collatz pour n
(dans ce cas, 13
):
13, 40, 20, 10, 5, 16, 8, 4, 2, 1
Comptez maintenant le nombre de chiffres qui n'apparaissent que dans l'une des séquences. Ceci est défini comme la distance Collatz entre m
et n
. Dans ce cas 8
, à savoir,
21, 64, 32, 13, 40, 20, 10, 5
Nous avons donc la distance Collatz entre 21
et 13
as C(21,13)=8
.
C(m,n)
ont les belles propriétés suivantes:
C(m,n)=C(n,m)
C(m,n)=0 iff. m=n
Espérons que la définition de C(m,n)
est maintenant claire. Commençons à chasser les œufs dans l'espace Collatz!
Au début du jeu, un contrôleur décide de la position d'un œuf de Pâques, qui s'exprime par sa coordonnée unidimensionnelle: Un entier dans l'intervalle [p,q]
(en d'autres termes, un entier entre p
et q
, les deux extrémités inclus).
La position de l'œuf reste constante tout au long du jeu. Nous désignerons cette coordonnée comme r
.
Vous pouvez maintenant faire une estimation initiale de 0 et il sera enregistré par le contrôleur. Ceci est votre 0e round. Si vous êtes si chanceux que vous l'avez bien fait au début (c.-à-d. Un 0 = r), le jeu se termine et votre score est 0
(Plus le score est bas, mieux c'est). Sinon, vous entrez dans le 1er tour et vous faites une nouvelle estimation de 1 , cela continue jusqu'à ce que vous ayez bien compris, c'est-à-dire a n = r, et votre score sera n
.
Pour chaque manche après le 0, le contrôleur vous donne l'une des rétroactions suivantes afin que vous puissiez faire une meilleure estimation en fonction des informations fournies. Supposons que vous êtes actuellement au n
troisième tour et donc votre supposition est un n
- "Tu l'as trouvé!" si a n = r, auquel cas le jeu se termine et vous marquez
n
. - "Vous êtes plus proche :)" si C (a n , r) <C (a n-1 , r)
- "Vous tournez autour de l'œuf" si C (a n , r) = C (a n-1 , r)
- "Vous êtes plus loin :(" si C (a n , r)> C (a n-1 , r)
Pour économiser quelques octets, j'appellerai les réponses "Droite", "Plus proche", "Même", "Plus loin", dans l'ordre présenté ci-dessus.
Voici un exemple de jeu avec p=1,q=15
.
- a 0 = 10
- a 1 = 11, réponse: "Closer"
- a 2 = 13, réponse: "Plus loin"
- a 3 = 4, réponse: "Plus loin"
- a 4 = 3, réponse: "Closer"
- a 5 = 5, réponse: "Identique"
- a 6 = 7, réponse: "Droite"
Note: 6
.
Défi
Concevez une stratégie déterministe pour jouer au jeu p=51, q=562
avec le meilleur score.
Les réponses doivent décrire les algorithmes en détail. Vous pouvez attacher n'importe quel code qui aide à élucider l'algorithme. Ce n'est pas du codegolf, vous êtes donc encouragé à écrire du code lisible.
Les réponses doivent inclure le pire score qu'ils peuvent obtenir pour tous les cas possibles r
et celui avec le score le plus faible l'emporte. En cas d'égalité, les algorithmes qui ont un meilleur score moyen pour tous les r
s possibles (qui devraient également être inclus dans les réponses) l'emportent. Il n'y a plus de bris d'égalité et nous pouvons avoir plusieurs gagnants à la fin.
Spécifications
- Pour réitérer,
r
réside dans l'intervalle[51,562]
. - Les failles par défaut s'appliquent.
Bounty (ajouté après la publication de la première réponse)
Je peux personnellement offrir une prime à une réponse où toutes les suppositions sont faites dans la plage [51,562]
tout en ayant un pire score raisonnablement bas.
la source
Réponses:
Rubis, 196
C'était beaucoup plus difficile que je pensais au départ. J'ai dû gérer beaucoup de cas obscurs et je me suis retrouvé avec beaucoup de code laid. Mais c'était très amusant! :)
Stratégie
Chaque séquence Collatz se termine par une séquence de pouvoirs de 2 (ex: [16, 8, 4, 2, 1]). Dès qu'une puissance de 2 est rencontrée, nous divisons par 2 jusqu'à ce que nous atteignions 1. Appelons la première puissance de 2 dans une séquence pow2 la plus proche (car c'est aussi la puissance la plus proche de 2 à notre nombre en utilisant Collatz Distance). Pour la plage donnée (51-562), tous les nombres pow2 les plus proches possibles sont: [16, 64, 128, 256, 512, 1024]
Version courte
L'algorithme effectue:
Version détaillée
Étant donné un jeu avec le nombre cible
r
, la stratégie est la suivante:r
en un minimum d'étapes.Les resultats
L'exécution de l'algorithme pour tous les nombres compris entre 51 et 562 prend environ une seconde sur un PC normal et le score total est de 38665.
Le code
Essayez-le en ligne!
la source
pire score: 11, score total: 3986
Toutes les suppositions sont à portée
[51,562]
.Mon algorithme:
vals
. Initialement, l'ensemble contient tous les nombres dans la plage[51,562]
.À chaque étape, procédez comme suit:
guess
dans la gamme de[51,562]
telle sorte que, lorsque les valeursvals
(saufguess
lui - même) est divisé en 3 séries correspondant aux résultats possiblesCloser
,Same
etFarther
, la taille maximale de ces 3 ensembles est minimum.S'il existe plusieurs valeurs possibles pour
guess
satisfaire ce qui précède, choisissez la plus petite.guess
.vals
sorte qu'elles ne puissent pas donner ce résultat.Mon implémentation de référence écrite en C ++ et Bash s'exécute en environ 7,6 secondes sur ma machine et donne le pire score / score de somme comme décrit dans le titre.
Essayer toutes les valeurs de première estimation possibles prendra environ 1,5 heure sur ma machine. Je peux envisager de le faire.
la source