Écrire un solveur d'équation de mot [dupliquer]

17

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:

  1. CODE+GOLF=GREAT
  2. 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:

  1. l'équation originale avec les chiffres substitués
  2. 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:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (vous pouvez utiliser n'importe quel délimiteur)

Règles

  1. 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
  2. Des lettres similaires représentent des chiffres similaires et des lettres différentes représentent des chiffres différents
  3. Vous pouvez utiliser n'importe quelle langue et la bibliothèque standard de la langue choisie (pas de bibliothèques externes)
  4. Vous ne pouvez pas vous connecter à des ressources sur Internet (pourquoi le feriez-vous quand même?)
  5. 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.

David Frank
la source
Je pense que la réponse optimale est "tout est 0". Vous voudrez peut-être l'interdire expressément.
undergroundmonorail
1
Que voulez-vous dire par tout est 0? Différentes lettres doivent désigner des nombres différents.
David Frank
Vous avez manqué ça, peu importe :)
undergroundmonorail
If there are no solutions, the program should return an empty string or null.Les boucles infinies ne produisent toujours rien ... puis-je?
Titus
1
Toutes les réponses gagnantes à ce défi se résument en fait à exploiter la règle de notation des espaces blancs, donc à vote serré en double.
pppery

Réponses:

11

Python - 48 caractères

exec("".join(map(chr,map(len,'                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             '.split("    ")))))

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 :)

métro monorail
la source
1
Pouvez-vous fournir un lien vers ideone ou un vidage hexadécimal de votre code?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
1
Aussi: exec est un mot-clé, vous pouvez enregistrer 2 caractères en supprimant le premier et le dernier crochet
ɐɔıʇǝɥʇuʎs
4

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?

f=->s{d=*0..9
d.shuffle!&&$.+=1until$.>9**9||z=eval((r=$_.tr(s.scan(/\w/).uniq*'',d*'')).gsub(/\b0/,'').sub ?=,'==')
z&&r}

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 fqui renvoie une chaîne avec les nombres substitués, comme dans l'option de sortie 1 ci-dessus. Exemple d'utilisation:

puts f["AA+BB=CC"]
 #=> 22+44=66
puts f["CODE+GOLF=GREAT"]
 #=> 8673+0642=09315

Le temps d'exécution de l' CODE+GOLF=GREATexemple 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êcher evald'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!)

Paul Prestidge
la source
J'ai eu la même idée en lisant ceci, mais j'ai obtenu ~ 170 caractères de code, donc bien joué. 0..9 sont dix chiffres, donc la limite ne devrait-elle pas être 10 ** 10? Vous pouvez utiliser la permutation de tableau # pour faire une boucle sur tous les mappages possibles, mais cela pourrait allonger le code.
blutorange
@blutorange Je viens de choisir 9 ** 9 car c'était un grand nombre qu'on pouvait écrire avec peu de caractères. Cela devrait être plus que suffisant pour tous les cas de test raisonnables, je pense! Je n'ai pas essayé de version basée sur permutation, mais comme vous le dites, je me préoccupais principalement de la longueur du code.
Paul Prestidge
4

LiveScript (179 caractères)

Il a un temps de fonctionnement déterministe et relativement rapide et fonctionne également avec d'autres opérateurs (+, -, *).

f=(s)->                     # define function that takes parameter s
  c=s.replace /[^A-Z]/g ''  # remove all the non-letters
  if c                      # if any letters remain
    for i from 0 to 9       # loop from 0 to 9
       if s.indexOf(i)<0&&a=f s.split(c.0).join i  # if i is not present in the number, replace the first letter with i and call the function recursively
         return a           # if there is a solution, return it
  else                      # if there are no letters left
    if eval s.replace(/(^|\D)0+(\d)/g,'$1$2').replace \= \==  # if the expression is correct (we need to remove leading 0, because javascript interprets numbers with leading 0 as octal)
       return s  # return solution



f("CODE+GOLF=GREAT")
David Frank
la source
2

Python, 256 213 caractères

Un temps de course horrible, tentera de s'améliorer davantage:

q='='
e=input()
v=set(e)-set([q,'+'])
for x in __import__('itertools').permutations(range(10),len(v)):
    t=e
    for l,n in zip(v,x):t=t.replace(l,str(n))
    try: 
        if eval(t.replace(q,q*2)):print(t);break
    except:pass
CesiumLifeJacket
la source
2

JavaScript 138

for(s=prompt(p='1');eval(p.replace('=','!='));)for(p=s,i=64;i++<90;)p=p.replace(new RegExp(String.fromCharCode(i),'g'),10*Math.random()|0)

Force brute aléatoire.
Cela peut prendre un certain temps (mon meilleur coup CODE+GOLF=GREATest de 3 secondes, mes pires 3 minutes).
Essayez-le avec une expression simple commeA+B=C

Michael M.
la source
2

Haskell, 222

import Data.List
z=(\(b,(_:c))->b:z c).span Data.Char.isUpper
j(Just g)=g
main=interact$(\d@[a,b,c]->show$take 1[e|e<-map(zip$nub$d>>=id)$permutations['0'..'9'],(\f->f a+f b==(f c::Int))(read.map(j.(`lookup`e)))]).take 3.z

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.

YawarRaza7349
la source
Je pense que cette sortie est acceptable.
David Frank
2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

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=MONEYfonctionne en 30 à 40 secondes et CODE+GOLF=GREATen 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):

"{L__&=}:U;
{L!!{L))_9>{;:L;I}{+:L;}?}*}:I;
{{U!_{I}*}g}:M;
{L,N<L,g&}:K;
{I{K{L0+:L;}*MK}g}:G;
{{C#L=}%si}:R;
{XRYR+ZR=PRAb0#0<&}:F;
l'+/~'=/~:Z;:Y;:X;
[X0=Y0=Z0=]:P;
XYZ++_&:C,:NB<{0a:L;{F0{GL}?}g}*
L{XR'+YR'=ZR}{L}?"
127b3b[32 9 A]:cf='"\'"_32c9cAc"\"f#3b127b:c~"

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.

aditsu
la source
0

Powershell, 137 octets

port de LiveScript

$f={param($s)if($c=$s-replace'[^A-Z]'){0..9|?{$s-notmatch$_}|%{&$f ($s-replace$c[0],$_)}|Select -f 1}elseif($s-replace'=','-eq'|iex){$s}}

Script de test non golfé:

$f={

param($s)                           # parameter string
$c=$s-replace'[^A-Z]'               # remove all the non-letters
if($c){                             # if any letters remain
    0..9|?{                         # loop from 0 to 9
        $s-notmatch$_               # if $s is not contains current number
    }|%{
        &$f ($s-replace$c[0],$_)    # replace the first letter with current number and call the function recursively
    }|Select -f 1                   # seelct first non-null value (break if found)
}
elseif($s-replace'=','-eq'|iex){    # else if evaluated value if the expression is $true
    $s                              # return $s as solution
}

}

&$f "AA+BB=CC"
&$f "A+AB=A"            # empty because it has no solution
&$f "CODE+GOLF=GREAT"

Production:

11+22=33
2846+0851=03697
mazzy
la source
0

PHP, 118 113 octets

for(;;)eval(strtr($argn,"=".$w=substr(count_chars($argn,3),2),"-".$n=str_shuffle(1234567890))."||die('$w
$n');");

imprime les chiffres sous les lettres et quitte le programme; boucles à l'infini si insoluble. Exécuter en tant que tuyau avec -nr.

panne

for(;;)
    eval(                               # 6. evaluate
        strtr($argn,                    # 4. translate letters to digits, "=" to "-"
            "=".$w=substr(              # 2. remove non-letters
                count_chars($argn,3)    # 1. get characters used in the argument
                ,2),
            "-".$n=str_shuffle(1234567890)  # 3. shuffle digits
        )."||die('$w\n$n');"            # 5. if falsy (`A+B-C==0`), print translation and exit
    )
;
Titus
la source
0

PHP, 145 octets

function f($s){for(;$i<10*preg_match("/[A-Z]/",$s,$m);)strpos(_.$s,++$i+47)||f(strtr($s,$m[0],$i-1));$i||eval(strtr($s,"=","-")."||die('$s');");}

fonction récursive, imprime l'équation résolue et quitte le programme; retourne NULLlorsqu'il est insoluble.

Essayez-le en ligne

panne

function f($s)
{
    for(;
        $i<10                   # loop $i from 0 to 9
        *preg_match("/[A-Z]/",$s,$m)    # find a letter; if not found: $i<10*0 == falsy
        ;
    )
        strpos(_.$s,++$i+47)            # find $i in string
        ||f(strtr($s,$m[0],$i-1));      # if not found, replace letter with $i, recurse
    $i||                        # no letter found ($i is unset):
        eval(                   # evaluate:
            strtr($s,"=","-")       # replace "=" with "-"
            ."||die('$s');"         # if falsy (A+B-C==0), print equation, exit program
        );
    # else implicitly return NULL
}
Titus
la source