Schreiben Sie einen Wortgleichungslöser

17

Einführung

Betrachten Sie das folgende Beispiel:

  CODE
+ GOLF
——————
 GREAT

Hierbei handelt es sich um eine Gleichung, bei der jeder Buchstabe eine Dezimalziffer und die Wörter natürliche Zahlen darstellen (ähnliche Buchstaben stehen für ähnliche Ziffern und unterschiedliche Buchstaben für unterschiedliche Ziffern). Die Aufgabe besteht darin, jeden Buchstaben mit seinem Ziffernwert abzugleichen, damit die Gleichung korrekt ist. Eine Lösung für die obige Gleichung ist:

  9265
+ 1278
——————
 10543

Deine Aufgabe

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, mit der die oben genannten Gleichungen gelöst werden können.

Eingang

Die Eingabe ist eine Zeichenfolge im folgenden Format:

[A-Z]+\+[A-Z]+=[A-Z]+

Beispiel:

  1. CODE+GOLF=GREAT
  2. AA+BB=CC

Leerzeichen werden weggelassen und es werden nur Buchstaben zwischen Großbuchstaben A und Z verwendet (keine Sonder- oder Kleinbuchstaben).

Diese Zeichenfolge kann aus der Standardeingabe, aus einer Datei oder als Funktionsparameter gelesen werden.

Ausgabe

Sie haben folgende zwei Möglichkeiten für das Ausgabeformat:

  1. die ursprüngliche Gleichung mit den Ziffern ersetzt
  2. Liste der Buchstaben und ihrer Werte

Wenn es mehrere Lösungen gibt, sollte eine (aber nur eine) davon zurückgegeben werden. Wenn es keine Lösungen gibt, sollte das Programm eine leere Zeichenfolge oder null zurückgeben. Die Ausgabe kann als String zurückgegeben, in die Standardausgabe oder in eine Datei geschrieben werden.

Beispiel:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (Sie können ein beliebiges Trennzeichen verwenden)

Regeln

  1. Um die Sache zu vereinfachen, wird angenommen, dass Zahlen mit 0 beginnen, aber Sie können Zahlen mit führender 0 als ungültige Lösungen behandeln, es liegt an Ihnen
  2. Ähnliche Buchstaben stehen für ähnliche Ziffern, und verschiedene Buchstaben stehen für unterschiedliche Ziffern
  3. Sie können jede Sprache und die Standardbibliothek der gewählten Sprache verwenden (keine externen Bibliotheken)
  4. Sie können keine Verbindung zu Ressourcen im Internet herstellen (warum sollten Sie es trotzdem tun?)
  5. Dies ist eine Code-Golf-Aufgabe, der kürzeste Code gewinnt. Aufeinanderfolgende Leerzeichen zählen als ein einzelnes Zeichen. (So ​​gewinnt jedes in Leerzeichen geschriebene Programm automatisch)

Ich habe eine etwas hackige Lösung mit 179 Zeichen. Wenn etwas nicht klar ist, frag mich bitte in den Kommentaren.

David Frank
quelle
Ich denke die optimale Antwort ist "alles ist 0". Möglicherweise möchten Sie dies ausdrücklich untersagen.
Undergroundmonorail
1
Was meinst du mit 0? Unterschiedliche Buchstaben müssen unterschiedliche Zahlen bezeichnen.
David Frank
Das habe ich verpasst, egal :)
undergroundmonorail
If there are no solutions, the program should return an empty string or null.Endlosschleifen geben immer noch nichts aus ... darf ich?
Titus
1
Alle siegreichen Antworten auf diese Herausforderung beruhen auf der Ausnutzung der Whitespace-Bewertungsregel, also auf einer engen Abstimmung als Duplikat.
Paprika

Antworten:

11

Python - 48 Zeichen

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

Missbrauch der Whitespace-Regel.

Zuerst habe ich jedes Zeichen in CesiumLifeJackets Antwort auf seinen ASCII-Wert konvertiert (ich hätte mein eigenes schreiben können, aber ich bin faul, und es hätte sowieso keinen Einfluss auf das Endergebnis gehabt). Die lange Zeichenfolge in meiner Lösung ist ein Leerzeichen für jeden dieser ASCII-Werte und Tabulatoren, die sie trennen. Auf Registerkarten aufteilen, Längen ermitteln, zurück in Zeichen konvertieren und ausführen.

SE konvertiert Tabulatoren in jeweils 4 Leerzeichen, sodass Copypasting nicht funktioniert. Du musst mir nur glauben :)

untergrundbahn
quelle
1
Können Sie einen Link zu ideone oder einen Hex-Dump Ihres Codes bereitstellen?
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̷̰̀ĥ̷̳
1
Auch: exec ist ein Schlüsselwort, Sie könnten 2 Zeichen sparen, indem Sie die erste und letzte Klammer
entfernen
4

Ruby 2.0, 122 Zeichen

Brute Force Mischen + Auswerten! Dies erfüllt noch nicht die Kriterien für die Rückgabe von null / leeren Zeichenfolgen, wenn es keine Lösung gibt. es schleift nur unendlich. Wenn nach ca. 300 Millionen Iterationen kein Ergebnis gefunden wird, wird null zurückgegeben. Nahe genug?

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

Es findet alle eindeutigen Buchstaben in der Eingabe, mischt dann wiederholt die Ziffern 0-9 und versucht, sie mit den Buchstaben abzugleichen, bis es eine Konfiguration findet, die funktioniert.

Der Code wird als eine aufgerufene Funktion dargestellt, fdie eine Zeichenfolge mit den ersetzten Zahlen zurückgibt, wie in Ausgabeoption 1 oben. Anwendungsbeispiel:

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

Die Laufzeit für das CODE+GOLF=GREATBeispiel auf meiner Maschine variiert von augenblicklich bis ungefähr 6 Sekunden - hängt davon ab, wie viel Glück Sie mit dem Mischen haben!

Ich bin besonders unzufrieden mit dem gsub(/\b0/,'')Bit, führende Nullen zu entfernen, aber es war das einzige, was ich denken konnte, um zu verhindern, dass evaldie Zahlen als Oktal-Ints interpretiert werden.

( BONUS : Da eval verwendet wird, funktioniert es für beliebige Ruby-Ausdrücke und nicht nur für Additionen!)

Paul Prestidge
quelle
Ich hatte die gleiche Idee, als ich das las, aber ich bekam ~ 170 Zeichen Code, so gut gemacht. 0..9 sind zehn Ziffern, sollte das Limit also nicht 10 ** 10 sein? Sie könnten Array # -Permutation verwenden, um alle möglichen Zuordnungen zu durchlaufen, aber dadurch wird der Code möglicherweise länger.
Blutorange
@blutorange Ich habe gerade 9 ** 9 gewählt, weil es eine große Zahl war, die man mit wenigen Zeichen schreiben konnte. Es sollte mehr als genug für alle vernünftigen Testfälle sein, denke ich! Ich habe keine Version basierend auf ausprobiert permutation, aber wie Sie sagen, ging es mir hauptsächlich um die Codelänge.
Paul Prestidge
4

LiveScript (179 Zeichen)

Es hat eine deterministische und relativ schnelle Laufzeit und funktioniert auch mit anderen Operatoren (+, -, *).

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
quelle
2

Python, 256 213 Zeichen

Schreckliche Laufzeit, wird versuchen, sich weiter zu verbessern:

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
CaesiumLifeJacket
quelle
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)

Zufällige Bruteforce.
Kann eine Weile dauern (mein bester Schuss CODE+GOLF=GREATist 3 Sekunden, mein schlechtester 3 Minuten).
Versuchen Sie es mit einem einfachen Ausdruck wieA+B=C

Michael M.
quelle
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

Rohe Gewalt. Versucht jede mögliche Übereinstimmung, bis sie eine findet oder nachdem sie alle ausprobiert hat. Ich habe die Ausgaberegeln erweitert: druckt so etwas wie [[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]für die Lösung, und wenn keine vorhanden ist, druckt []. Lassen Sie mich wissen, ob ich das ändern muss.

YawarRaza7349
quelle
Ich denke, diese Ausgabe ist akzeptabel.
David Frank
2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

Insgesamt 975 Zeichen, aber 960 davon sind Leerzeichen in 2 Sequenzen. Diese zählen also als 2 Zeichen, und zusammen mit den anderen 15 erhalten wir 17.
975 mögen viel erscheinen, beachten Sie jedoch, dass die Python-Lösung von undergroundmonorail 18862 Zeichen hat bist nur in einer einzigen Zeile :)

Sie können es unter http://cjam.aditsu.net/ für kurze Wörter ausführen , aber Sie sollten wahrscheinlich den Java-Interpreter für längere verwenden. Läuft mit Java auf meinem Laptop SEND+MORE=MONEYin 30-40 Sekunden und CODE+GOLF=GREATin fast 3 Minuten. Es akzeptiert keine Zahlen, die mit 0 beginnen (weil das nicht cool ist).

Hier ist ein Programm, das das obige Programm generiert (hilft auch, wenn StackExchange das Leerzeichen nicht korrekt anzeigt):

"{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~"

Die ersten 11 Zeilen enthalten das ursprüngliche Programm (nicht wirklich Golf) in einer Zeichenfolge, und die letzte Zeile führt die Konvertierung durch und fügt den Dekodierungsteil hinzu.

aditsu
quelle
0

Powershell, 137 Bytes

Port von 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}}

Ungolfed-Testskript:

$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"

Ausgabe:

11+22=33
2846+0851=03697
mazzy
quelle
0

PHP, 118 113 Bytes

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

druckt Ziffern unter Buchstaben und beendet das Programm; Schleifen unendlich, wenn unlösbar. Als Rohr mit laufen lassen -nr.

Nervenzusammenbruch

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
quelle
0

PHP, 145 Bytes

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');");}

rekursive Funktion, druckt die gelöste Gleichung und beendet das Programm; kehrt zurück, NULLwenn unlösbar.

Probieren Sie es online aus

Nervenzusammenbruch

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
quelle