introduction
Prenons l'exemple suivant:
CODE
+ GOLF
——————
GREAT
Il s'agit d'une équation où chaque lettre représente un chiffre décimal et les mots représentent des nombres naturels (des lettres similaires représentent des chiffres similaires et des lettres différentes représentent des chiffres différents). La tâche consiste à faire correspondre chaque lettre avec sa valeur numérique afin que l'équation soit correcte. Une solution pour l'équation ci-dessus est:
9265
+ 1278
——————
10543
Ta tâche
Votre tâche consiste à écrire un programme ou une fonction qui peut résoudre de telles équations comme vu ci-dessus.
Contribution
L'entrée est une chaîne au format suivant:
[A-Z]+\+[A-Z]+=[A-Z]+
Exemple:
CODE+GOLF=GREAT
AA+BB=CC
Les espaces sont omis et seules les lettres entre les majuscules A et Z seront utilisées (pas de lettres spéciales ou minuscules).
Cette chaîne peut être lue depuis l'entrée standard, depuis un fichier ou comme paramètre de fonction.
Production
Vous disposez des deux options suivantes pour le format de sortie:
- l'équation originale avec les chiffres substitués
- liste des lettres et de leurs valeurs
S'il existe plusieurs solutions, toutes (mais une seule) doivent être retournées. S'il n'y a pas de solutions, le programme doit retourner une chaîne vide ou null. La sortie peut être renvoyée sous forme de chaîne, peut être écrite dans la sortie standard ou dans un fichier.
Exemple:
9265+1278=10543
A=1 B=2 C=3
(vous pouvez utiliser n'importe quel délimiteur)
Règles
- Pour faciliter les choses, les nombres sont acceptés pour commencer par 0, mais vous pouvez gérer les nombres avec 0 en tête comme des solutions invalides, c'est à vous de décider
- Des lettres similaires représentent des chiffres similaires et des lettres différentes représentent des chiffres différents
- Vous pouvez utiliser n'importe quelle langue et la bibliothèque standard de la langue choisie (pas de bibliothèques externes)
- Vous ne pouvez pas vous connecter à des ressources sur Internet (pourquoi le feriez-vous quand même?)
- Il s'agit d'une tâche de golf de code, le code le plus court gagne. Les espaces blancs consécutifs comptent comme un seul caractère. (Donc, tout programme écrit en espace gagne automatiquement)
J'ai une solution quelque peu piratée utilisant 179 caractères. Si quelque chose n'est pas clair, veuillez me demander dans les commentaires.
la source
If there are no solutions, the program should return an empty string or null.
Les boucles infinies ne produisent toujours rien ... puis-je?Réponses:
Python - 48 caractères
Abuser de la règle des espaces blancs.
J'ai d'abord converti chaque personnage de la réponse de CesiumLifeJacket en sa valeur ASCII (j'aurais pu écrire la mienne mais je suis paresseux, et cela n'aurait pas affecté le score final de toute façon). La longue chaîne de ma solution est un espace pour chacune de ces valeurs ASCII et des tabulations les séparant. Divisez les onglets, trouvez les longueurs, reconvertissez-les en caractères et exécutez.
SE convertit les tabulations en 4 espaces chacune, donc le copypasting ne fonctionnera pas. Vous n'aurez qu'à me croire :)
la source
Ruby 2.0, 122 caractères
Brute force shuffling + eval!
Cela ne répond pas encore aux critères de retour de chaîne vide / vide lorsqu'il n'y a pas de solution; il boucle juste à l'infini.S'il ne trouve pas de résultat après ~ 300 millions d'itérations, il retournera zéro. Assez proche?Il trouve toutes les lettres uniques dans l'entrée, puis mélange à plusieurs reprises les chiffres 0 à 9 et tente de les faire correspondre avec les lettres jusqu'à ce qu'il trouve une configuration qui fonctionne.
Le code est présenté comme une fonction appelée
f
qui renvoie une chaîne avec les nombres substitués, comme dans l'option de sortie 1 ci-dessus. Exemple d'utilisation:Le temps d'exécution de l'
CODE+GOLF=GREAT
exemple sur ma machine varie d'instantané à environ 6 secondes - dépend de la chance que vous avez avec les shuffles!Je suis particulièrement mécontent de la
gsub(/\b0/,'')
suppression des zéros de tête, mais c'était la seule chose à laquelle je pouvais penser pour empêchereval
d'interpréter les nombres comme des octets.( BONUS : Parce qu'il utilise eval, il fonctionne pour les expressions Ruby arbitraires et pas seulement pour l'addition!)
la source
permutation
, mais comme vous le dites, je me préoccupais principalement de la longueur du code.LiveScript (179 caractères)
Il a un temps de fonctionnement déterministe et relativement rapide et fonctionne également avec d'autres opérateurs (+, -, *).
la source
Python,
256213 caractèresUn temps de course horrible, tentera de s'améliorer davantage:
la source
JavaScript 138
Force brute aléatoire.
Cela peut prendre un certain temps (mon meilleur coup
CODE+GOLF=GREAT
est de 3 secondes, mes pires 3 minutes).Essayez-le avec une expression simple comme
A+B=C
la source
Haskell, 222
Force brute. Essaie toutes les correspondances possibles jusqu'à ce qu'il en trouve une, ou une fois qu'il les a toutes essayées. J'ai étiré les règles de sortie: imprime quelque chose comme
[[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]
pour la solution, et s'il n'en existe pas, imprime[]
. Faites-moi savoir si je dois changer cela.la source
CJam - 17
975 caractères au total, mais 960 d'entre eux sont des espaces blancs en 2 séquences, donc ceux-ci comptent pour 2 caractères, et avec les 15 autres, nous obtenons 17.
975 peut sembler beaucoup, mais notez que la solution python de undergroundmonorail a 18862 caractères, ils suis juste sur une seule ligne :)
Vous pouvez l'exécuter sur http://cjam.aditsu.net/ pour les mots courts, mais vous devriez probablement utiliser l'interpréteur java pour les mots plus longs. Avec java sur mon ordinateur portable,
SEND+MORE=MONEY
fonctionne en 30 à 40 secondes etCODE+GOLF=GREAT
en près de 3 minutes. Il n'accepte pas les nombres commençant par 0 (car ce n'est pas cool).Voici un programme qui génère le programme ci-dessus (aide également si StackExchange n'affiche pas correctement les espaces blancs):
Les 11 premières lignes contiennent le programme original (pas vraiment joué) dans une chaîne, et la dernière ligne fait la conversion et ajoute la partie décodage.
la source
Powershell, 137 octets
port de LiveScript
Script de test non golfé:
Production:
la source
PHP,
118113 octetsimprime les chiffres sous les lettres et quitte le programme; boucles à l'infini si insoluble. Exécuter en tant que tuyau avec
-nr
.panne
la source
PHP, 145 octets
fonction récursive, imprime l'équation résolue et quitte le programme; retourne
NULL
lorsqu'il est insoluble.Essayez-le en ligne
panne
la source