introduction
Supposons un instant que les vipères et la falaise ne soient qu'à deux pas, au lieu de trois.
o
---
Hsss! |
';;' ___ /_\ ___ _
|
Vous êtes, malheureusement, captif d'un tortionnaire sadique. Vous devez faire un pas à gauche ou à droite à chaque tour. Sinon, ils vous abattent instantanément. Vous êtes autorisé à planifier vos étapes à l'avance, mais une fois que vous avez fait votre premier pas, vous ne pouvez pas modifier votre plan. (Et pas de flânerie non plus; ils vous tireront dessus.)
Soudain, une idée lumineuse me vient à l'esprit ...
Ah! Je peux simplement alterner les pas à droite et à gauche! Pas à droite, pas à gauche, pas à droite, pas à gauche, etc.
Ah ah ah, pas si vite. Comme je l'ai dit, le tortionnaire est sadique. Ils peuvent choisir si vous prenez chaque étape, ou chaque deuxième étape, ou chaque troisième étape, et ainsi de suite. Donc, si vous choisissez naïvement la séquence, RLRLRL...
ils peuvent vous forcer à faire chaque deuxième étape, qui commence par LL
. Euh oh! Vous avez été mordu par des vipères! La noirceur vous envahit et tout le reste s'estompe ...
En fait non, tu n'es pas encore mort. Vous devez toujours proposer votre plan. Après y avoir réfléchi pendant quelques minutes, vous réalisez que vous êtes condamné. Il n'y a aucun moyen de planifier une série d'étapes qui garantiront votre survie. Le mieux que vous puissiez trouver est RLLRLRRLLRR
. 1 Onze étapes sûres et pas plus. Si la douzième étape est R
, alors le tortionnaire vous fera faire chaque étape, puis les trois dernières étapes vous enverront hors de la falaise. Si la douzième étape est L
, alors le tortionnaire vous fera faire toutes les trois étapes ( LRLL
), ce qui vous mettra dans la couvée des vipères et de leurs morsures mortelles.
Vous choisissez R
comme la douzième étape, en espérant retarder votre disparition aussi longtemps que possible. Avec le vent qui gronde dans vos oreilles, vous vous demandez ...
Et si j'avais trois étapes?
Alerte spoil!
Tu mourrais encore. En fin de compte, peu importe le nombre d'étapes que vous avez, il y aura un moment où, quel que soit le choix que vous fassiez, il y a une séquence d'étapes que votre tortionnaire peut choisir pour vous assurer de rencontrer votre destin mortel. 2 Cependant, lorsque les vipères et la falaise sont à trois pas, vous pouvez faire un total de 1160 pas sûrs et quand ils sont à quatre pas, il y a au moins 13 000 pas sûrs! 3
Le défi
Étant donné un seul entier n < 13000
, affichez une séquence d' n
étapes sûres, en supposant que la falaise et les vipères sont à quatre pas.
Règles
- Peut être un programme complet ou une fonction.
- L'entrée peut être prise via STDIN ou équivalent, ou comme argument de fonction.
- Sortie doit avoir deux caractères distincts (qui peut être
+/-
,R/L
,1/0
, etc.). - Tout espace dans la sortie n'a pas d'importance.
- Le codage en dur d'une solution n'est pas autorisé. Cela banaliserait ce défi.
- Votre programme devrait (en théorie) se terminer dans un laps de temps décent. Comme dans, cela
n=13000
peut prendre un mois, mais cela ne devrait pas prendre mille ans ou plus. Autrement dit, pas de force brute. (Eh bien, essayez au moins de l'éviter.) - Bonus à vie: fournissez une série d'
2000
étapes sûres. Si vous faites cela, le tortionnaire sera tellement impressionné par votre ténacité, votre persévérance et votre prévoyance qu'ils vous laisseront vivre. Cette fois. (Traitez cette séquence comme un nombre binaire et fournissez l'équivalent décimal pour la vérification. Ceci est destiné à récompenser les réponses qui se terminent rapidement car les réponses peuvent prendre très longtemps.) - Score: octets , sauf si vous vous qualifiez pour le bonus - multipliez par 0,75 .
1 Il y a une bonne explication de ce problème et de la "solution" par l'une des stars de Numberphile, James Grime, sur sa chaîne YouTube ici: https://www.youtube.com/watch?v=pFHsrCNtJu4 .
2 Cette conjecture vieille de 80 ans, connue sous le nom de problème de divergence d'Erdos, a été prouvée très récemment par Terence Tao. Voici un très bel article sur Quanta Magazine à ce sujet: https://www.quantamagazine.org/20151001-tao-erdos-discrepancy-problem/ .
3 Source: A SAT Attack on the Erdos Discrepancy Conjecture , par Boris Konev et Alexei Lisitsa. Consulté ici: http://arxiv.org/pdf/1402.2184v2.pdf .
la source
n=13000
, les 2000 premières instructions de celui-ci gagneront-elles un bonus? Cela semble inutile, alors vous vouliez probablement dire autre chose?n=13000
dans un délai d'un an, peut-être dix. Allez-vous attendre un moisn=2000
? Probablement pas. Et si vous le faites , vous méritez tout de même le bonus.Réponses:
Java, 915 * 0,75 = 686,25
L'entrée est considérée comme un argument de ligne de commande.
Cela essaie presque toutes les possibilités (la seule restriction est que les 8 premières étapes ne doivent aller que dans -1..1), en allant pas à pas, en utilisant une heuristique magique vaudou pour choisir la première façon d'essayer.
Il résout 2000 et même 4000 en 1 seconde sur mon ordinateur (assez rapide). Besoin de plus de RAM pour les plus grands nombres; la plus grande entrée que j'ai résolue dans les 8 Go est 5023 et cela a pris environ 30 secondes.
Représentation décimale de la solution pour 2000 étapes, comme requis pour le bonus:
Ajoutez-
Yb
le dans CJam pour reconvertir en binaire.À propos de l'heuristique: d'abord, il y a un modèle que j'utilise: toutes les 9 étapes essaient de répéter les 9 premières, sauf chaque (9 * x) e étape essaie de répéter la xième étape. Ceci est inspiré de la solution que j'ai téléchargée et utilisée (codée en dur) dans ma réponse python.
Je garde une trace du nombre de fois où je me suis écarté du modèle, et aussi du nombre de fois où je suis arrivé à un "bord" (à 1 pas de la mort). La fonction heuristique est essentiellement une combinaison pondérée de ces 2 nombres et du nombre de pas effectués jusqu'à présent.
L'heuristique pourrait être encore modifiée pour améliorer la vitesse, et il existe plusieurs façons d'y ajouter un facteur aléatoire.
En fait, je viens de lire sur les fonctions multiplicatives par rapport à ce problème, et il semble que cela puisse apporter une amélioration significative (TODO: implémentez-le plus tard).
Non golfé et commenté:
la source
Python 2, 236 octets
C'est assez rapide, pour une méthode de force brute, ne prenant que quelques secondes pour n = 223, mais beaucoup plus pour n> = 224.
Explication: Gardez une trace d'une liste de paires chaîne-liste (s, u), où la liste u est telle que u [i] est la position actuelle après avoir suivi chaque cinquième étape de la chaîne. Pour chaque chaîne de la liste, essayez d'ajouter "L" ou "R", puis modifiez les valeurs de la liste qui se croisent. (c.-à-d. si la chaîne résultante a une longueur de 10, ajoutez ou soustrayez 1 des positions 1, 2, 5 et 10, selon les directions que vous avez déplacées). Si vous dépassez 3 ou -3 jetez la nouvelle paire, sinon conservez-la dans la liste. Les cordes les plus longues sont conservées à la fin. Une fois que vous avez une chaîne de longueur n, retournez-la.
la source
//
c'était disponible en python 2.Python 2, 729 octets
Je pense que cela donne également droit au bonus si l'idée est de "récompenser des réponses qui se terminent rapidement".
Cependant, c'est une réponse codée en dur, qui n'est pas dans l'esprit du défi (bien qu'elle ne soit pas explicitement interdite lorsque je l'ai écrite).
la source