Compte rendu
Vous êtes un bot, dans une grille 2D qui s'étend à l'infini dans les quatre directions, nord, sud, est et ouest. Quand on vous donne un numéro, vous devez déplacer le bot pour atteindre le numéro cible.
Voici comment fonctionne la grille:
Vous pouvez vous déplacer dans 4 directions: nord, sud, est ou ouest. Une fois que vous avez quitté une cellule, vous n'êtes plus autorisé à revenir dans cette cellule (si efficacement, elle a été effacée de la carte).
Il y a un "compteur" qui va 1234567890
(donc ça va de 1
à 2
... tout le chemin à 9
, puis à 0
, puis de nouveau à 1
nouveau), qui change à chaque fois que vous bougez.
Vous avez également une "valeur", qui commence à 0.
Une fois que vous vous déplacez dans n'importe quelle direction, une opération mathématique se produit, selon la direction dans laquelle vous vous déplacez:
- Nord: votre valeur est augmentée par le compteur (
value += counter
). - Est: votre valeur est décrémentée par counter (
value -= counter
). - Sud: votre valeur est multipliée par counter (
value *= counter
). - Ouest: votre valeur est divisée par le compteur (
value /= counter
).- La division est une division entière, donc
5/2 -> 2
. - Vous n'êtes pas autorisé à diviser par
0
.
- La division est une division entière, donc
Exemple:
Si le bot se déplace 3 fois vers le nord:
- Le premier mouvement "nord" incrémente le compteur de
1
, et ajoute cela à la valeur (qui est maintenant1
). - Le deuxième mouvement "nord" incrémente le compteur à
2
, et ajoute cela à la valeur (qui est maintenant3
). - Le troisième mouvement "nord" incrémente le compteur à
3
, et ajoute cela à la valeur (qui est maintenant6
).
La valeur finale est 6
.
Déplacer vers le nord, puis à nouveau vers le sud:
- Le premier mouvement "nord" incrémente le compteur de
1
, et ajoute cela à la valeur (qui est maintenant1
). - Les deuxièmes erreurs de déplacement "sud", car la cellule sur laquelle le bot essaie de se déplacer est supprimée (du premier déplacement).
Il n'y a pas de valeur finale, car le bot s'est trompé.
Défi
Votre défi est d'écrire un programme lorsque, étant donné un nombre, produire les directions appropriées pour que le bot entre afin que la valeur finale du bot soit égale à ce nombre.
Donc, si le nombre est 6
, une solution valable serait:
nnn
(Le bot se déplace vers le nord 3 fois de suite).
Vos valeurs de test sont:
49445094, 71259604, 78284689, 163586986, 171769219, 211267178, 222235492, 249062828, 252588742, 263068669, 265657839, 328787447, 344081398, 363100288, 363644732, 372642304, 374776630, 377945535, 407245889, 467229432, 480714605, 491955034, 522126455, 532351066, 542740616, 560336635, 563636122, 606291383, 621761054, 648274119, 738259135, 738287367, 748624287, 753996071, 788868538, 801184363, 807723631, 824127368, 824182796, 833123975, 849666906, 854952292, 879834610, 890418072, 917604533, 932425141, 956158605, 957816726, 981534928, 987717553
(Ce sont 50 nombres aléatoires de 1 à 1 milliard.)
Votre score est le nombre total de coups effectués pour les 50 numéros - moins il y a de coups, mieux c'est. En cas d'égalité, la personne qui a soumis son code plus tôt l'emporte.
Spécifications
- Vous êtes assuré de recevoir un entier positif pour l'entrée.
- Votre
value
variable ne doit en aucun cas aller au-dessus2^31-1
ou en dessous-2^31
pour vos chemins générés. - Votre programme final doit tenir dans une réponse (donc,
< 30,000
octets). - Vous ne pouvez coder en dur que 10 chiffres.
- Votre programme doit s'exécuter dans les 5 minutes sur un ordinateur portable raisonnable pour tout cas de test.
- Les résultats DOIVENT être les mêmes à chaque exécution du programme pour chaque numéro.
la source
value
, oui? Au moins pour moi, cela ressemble à une restriction imposée à la mise en œuvre, pas à l'algorithme réel.Réponses:
C ++: score = 453 324 048
OK, j'avais besoin de temps pour retravailler cela, mais voici comment je l'ai résolu.
Après avoir étudié l'espace des solutions, j'ai décidé que ma stratégie serait:
Voici mon résultat: le score total est de 453324048
Et les chemins:
Je suis sûr qu'il existe un moyen d'améliorer la situation en effectuant des mouvements de couperet "sud / ouest" (en divisant par 4 et en multipliant par 5, par exemple); mais il est difficile de le coder et de vous assurer de ne pas dépasser les tours ou de vous faire piéger.
Un autre chemin de solution, peut être d'essayer de redescendre de la cible, vers un nombre "raisonnable", puis de trouver simplement un chemin vers ce plus petit nombre; mais vous devrez le "viser" correctement, afin que le numéro de pas corresponde. délicat, mais pourrait être le meilleur moyen de résoudre ce problème.
Quoi qu'il en soit, voici mon code code:
la source
Python, score = 56068747912
Imprime juste
nenenenenenenen...
pour chaque numéro.Ajoutera une explication plus tard.
la source
nen
est le 2Rouille , score = 1758 (optimal parmi les chemins sans ouest)
Fonctionne en environ 7 secondes au total pour 50 numéros, à l'aide d'une recherche bidirectionnelle .
Essayez-le en ligne!
Production
la source
ns
,sn
,ew
etwe
est immédiatement illégal en plus des boucles dans le cheminw
,ns
etsn
, ce qui laisse seulement les voies légales au détriment d'ignorer les chemins juridiques avecw
.PHP, score = 1391462099
Une tentative rapide, ne va jamais vers l'ouest pour simplifier la vérification du chemin et a peu de règles pour décider de la direction à chaque étape.
la source