Cela a été inspiré par un problème de mathématique que j’ai vu quelque part sur Internet mais ne me souviens plus où (MISE À JOUR: le problème original a été trouvé sur les énigmes mathématiques subreddit avec une preuve à condition que cela soit possible, voir aussi ce post de Math SE ), demandant une preuve si le processus suivant est possible pour toute paire d'entiers quelconque (de ce que je me souviens, il était possible pour toute paire donnée):
Étant donné une paire d’entiers, j et k, doublez-en un et ajoutez-en un, créant ainsi une paire de nouveaux entiers, à savoir, (j, k) -> (j + 1, k * 2) ou (j * 2, k + 1). Répétez ensuite ce processus avec ces entiers, l'objectif étant que la paire d'entiers soit égale.
Ces exemples donnés ne sont pas nécessairement optimaux mais montrent comment ce processus peut être effectué sur des nombres entiers, positifs, négatifs ou nuls:
(2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(5, 6) -> (6, 12) -> (7, 24) -> (14, 25) -> (28, 26) -> (56, 27) -> (112, 28) -> (113, 56) -> (226, 57) -> (227, 114) -> (228, 228)
(0, 2) -> (1, 4) -> (2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(-4, 0) -> (-3, 0) -> (-2, 0) -> (-1, 0) -> (0, 0)
(3, -1) -> (6, 0) -> (12, 1) -> (13, 2) -> (14, 4) -> (15, 8) -> (16, 16)
(-4, -3) -> (-8, -2) -> (-16, -1) -> (-32, 0) -> (-31, 0) -> ... -> (0, 0)
Défi
Créez un programme qui donne deux entiers et affiche la liste des étapes nécessaires pour rendre ces entiers égaux en incrémentant plusieurs fois et en doublant l'autre
Caractéristiques
- La solution ne doit pas nécessairement être optimale, mais elle doit être résolue en un nombre fini d'étapes pour toute paire arbitraire.
L'entrée doit être deux entiers
La sortie peut être toute sortie raisonnable indiquant clairement les entiers résultants de chaque étape, par exemple:
- une chaîne avec deux délimiteurs distincts (tout symbole, espace, etc.), un pour chaque entier d'une paire et un pour chaque paire
- par exemple, entrée j, k: 2, 5 -> sortie: 3,10; 6,11; 12,12
- une liste de listes d'entiers
- par exemple, entrée j, k: 2, 5 -> sortie: [[3, 10], [6, 11], [12, 12]]
- une chaîne avec deux délimiteurs distincts (tout symbole, espace, etc.), un pour chaque entier d'une paire et un pour chaque paire
Si l'entrée est une paire de nombres égaux, vous pouvez sortir n'importe quoi pourvu que ce soit cohérent avec d'autres réponses non triviales.
- par exemple
- si l'entrée [2, 5] a une sortie [[3, 10], [6, 11], [12, 12]], qui n'inclut pas la paire d'entrée, l'entrée [4, 4] ne doit alors rien émettre.
- si l'entrée [2, 5] a la sortie [[2, 5], [3, 10], [6, 11], [12, 12]], qui inclut la paire d'entrée, alors l'entrée [4, 4] devrait sortie [[4, 4]].
- par exemple
Les méthodes IO standard s'appliquent et les échappatoires standard sont interdites
Ceci est le code de golf si la réponse la plus courte en octets gagne
la source
[(12,12),(6,11),(3,10),(2,5)]
pour l'entrée(2,5)
?Réponses:
JavaScript (ES6),
1119083 octetsEssayez-le en ligne!
Commenté
la source
Haskell,
7069 octetsEssayez-le en ligne!
Un simple BFS. Garde une trace des étapes dans une liste de paires.
la source
Python 3 ,
907472 octets-2 octets grâce à Dennis .
Essayez-le en ligne!
Prend les entrées sous forme de liste de singleton .
Ungolfed
la source
Pyth, 41 octets
Essayez-le ici
Explication
C'est une recherche assez simple, en largeur d'abord. Conservez une file d'attente de séquences possibles (
J
) et jusqu'à l'obtention d'une paire correspondante, prenez la séquence suivante, collez chacun des mouvements possibles et mettez-les à la fin de la file d'attente.Par souci de brièveté, nous définissons une fonction
y
(en utilisant l'expression lambdaL
) pour effectuer l'un des mouvements, et l'appliquons à la fois en avant et en arrière.la source
Gelée , 20 octets
Essayez-le en ligne!
la source
[[2,5]]
)05AB1E ,
252220 octetsPrend une liste doublement imbriquée en entrée et génère une liste en dents de scie avec chaque étape à une profondeur de nid.
Essayez-le en ligne!
Explication
la source
Retina , 72 octets
Essayez-le en ligne! Seulement deux cas de test en raison des limitations de l'arithmétique unaire. Explication:
Convertir en unaire.
Bien que l’entrée ne contienne pas une paire de nombres identiques ...
... correspondre à la dernière paire sur chaque ligne ...
... et tournez la ligne en deux lignes, l'une suffixée du premier nombre incrémenté et du deuxième doublé, l'autre suffixée du premier nombre doublé et du deuxième incrémenté.
Gardez la ligne avec la paire correspondante.
Reconvertir en décimal.
89Version arithmétique décimale non signée de 88 octets (fonctionne également avec 0):Essayez-le en ligne!
la source
MATL , 24 octets
Le temps d'exécution est aléatoire, mais il est fini avec une probabilité 1.
Le code est très inefficace. Les entrées nécessitant plus de 4 ou 5 étapes ont une grande probabilité d'extinction dans l'interprète en ligne.
Essayez-le en ligne!
Explication
la source
Stax ,
2926 octetsExécuter et déboguer
C'est une première recherche en profondeur. Cela semble assez rapide.
Il faut une paire d'entiers doublée d'un tableau. La sortie est une liste de valeurs séparées par des espaces. Toutes les deux valeurs représentent une paire dans le chemin d'accès à la solution.
la source
Haskell , 95 octets
Essayez-le en ligne! Les sorties sont inversées, par exemple les
h(2,5)
rendements[(12,12),(6,11),(3,10),(2,5)]
.la source
Rouge , 142 octets
Prend l’entrée comme un bloc doublement imbriqué de la paire d’entiers au format Red
(2, 5)
->2x5
Renvoie le résultat sous forme de liste des paires rouges , par exemple
2x5 3x10 6x11 12x12
. Inclut la paire initiale.Essayez-le en ligne!
Entrée stricte:
L'entrée est deux nombres, par exemple
2 5
Rouge , 214 octets
Essayez-le en ligne!
Explication:
la source