Napisz solver równania słów [duplikat]

17

Wprowadzenie

Rozważ następujący przykład:

  CODE
+ GOLF
——————
 GREAT

Jest to równanie, w którym każda litera reprezentuje cyfrę dziesiętną, a słowa reprezentują liczby naturalne (podobne litery reprezentują podobne cyfry, a różne litery reprezentują różne cyfry). Zadaniem jest dopasowanie każdej litery do jej wartości cyfrowej, aby równanie było prawidłowe. Jednym z rozwiązań powyższego równania jest:

  9265
+ 1278
——————
 10543

Twoje zadanie

Twoim zadaniem jest napisanie programu lub funkcji, która może rozwiązać takie równania, jak pokazano powyżej.

Wejście

Dane wejściowe to ciąg znaków w następującym formacie:

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

Przykład:

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

Spacje są pomijane i będą używane tylko litery pomiędzy dużymi literami A i Z (bez specjalnych lub małych liter).

Ciąg ten można odczytać ze standardowego wejścia, z pliku lub jako parametr funkcji.

Wynik

Dostępne są następujące dwie opcje formatu wyjściowego:

  1. oryginalne równanie z podstawionymi cyframi
  2. lista liter i ich wartości

Jeśli istnieje wiele rozwiązań, należy zwrócić dowolne (ale tylko jedno) z nich. Jeśli nie ma rozwiązań, program powinien zwrócić pusty ciąg lub wartość null. Dane wyjściowe można zwrócić jako ciąg znaków, można zapisać na standardowym wyjściu lub w pliku.

Przykład:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (możesz użyć dowolnego ogranicznika)

Zasady

  1. Aby ułatwić sprawę, liczby zaczynają się od 0, ale możesz traktować liczby z wiodącym 0 jako nieprawidłowe rozwiązania, to zależy od Ciebie
  2. Podobne litery reprezentują podobne cyfry, a różne litery reprezentują różne cyfry
  3. Możesz użyć dowolnego języka i standardowej biblioteki wybranego języka (bez zewnętrznych bibliotek)
  4. Nie możesz połączyć się z żadnymi zasobami w Internecie (dlaczego miałbyś tak robić?)
  5. To jest zadanie w golfa kodu, wygrywa najkrótszy kod. Kolejne białe znaki są liczone jako pojedynczy znak. (Tak więc każdy program napisany w białej spacji automatycznie wygrywa)

Mam dość hackerskie rozwiązanie, używając 179 znaków. Jeśli coś nie jest jasne, zapytaj mnie w komentarzach.

David Frank
źródło
Myślę, że optymalną odpowiedzią jest „wszystko jest 0”. Możesz chcieć tego szczególnie zabronić.
undergroundmonorail
1
Co rozumiesz przez wszystko to 0? Różne litery muszą oznaczać różne cyfry.
David Frank
Brakowało tego, nieważne :)
undergroundmonorail
If there are no solutions, the program should return an empty string or null.Nieskończone pętle nadal nic nie dają ... czy mogę?
Tytus
1
Wszystkie zwycięskie odpowiedzi na to wyzwanie skutecznie sprowadzają się do wykorzystania reguły punktacji białych znaków, tak więc głosowanie z bliska jako duplikat.
pppery

Odpowiedzi:

11

Python - 48 znaków

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

Nadużywanie reguły białych znaków.

Najpierw przekonwertowałem każdą postać w odpowiedzi CesiumLifeJacket na jej wartość ASCII (mógłbym napisać własną, ale jestem leniwy, i tak nie wpłynęłoby to na końcowy wynik). Długi ciąg w moim rozwiązaniu to jedna spacja dla każdej z tych wartości ASCII i oddzielające je tabulatory. Podziel na zakładkach, znajdź długości, przekonwertuj z powrotem na znaki i uruchom.

SE konwertuje tabulatory na 4 spacje, więc kopiowanie nie będzie działać. Musisz mi tylko uwierzyć :)

podziemny monorail
źródło
1
Czy możesz podać link do ideone lub zrzut heksowy swojego kodu?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
1
Ponadto: exec jest słowem kluczowym, możesz zapisać 2 znaki, usuwając pierwszy i ostatni nawias
25ıʇǝɥʇuʎs
4

Ruby 2.0, 122 znaki

Brute force shuffling + eval! Nie spełnia to jeszcze kryteriów zwracania pustego / pustego łańcucha, gdy nie ma rozwiązania; po prostu zapętla się w nieskończoność. Jeśli nie będzie w stanie znaleźć wyniku po ~ 300 milionach iteracji, zwróci zero. Wystarczająco blisko?

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

Znajduje wszystkie unikalne litery na wejściu, a następnie wielokrotnie tasuje cyfry 0–9 i próbuje dopasować je do liter, aż znajdzie konfigurację, która działa.

Kod jest prezentowany jako wywoływana funkcja, fktóra zwraca ciąg znaków z podstawionymi liczbami, jak w opcji wyjścia 1 powyżej. Przykładowe użycie:

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

Czas działania dla CODE+GOLF=GREATprzykładu na mojej maszynie waha się od chwilowego do około 6 sekund - zależy od tego, ile masz szczęścia z tasowaniem!

Jestem szczególnie niezadowolony z tego, gsub(/\b0/,'')że usuwam początkowe zera, ale to jedyna rzecz, o której mogłem pomyśleć, aby nie evalinterpretować liczb jako liczb ósemkowych.

( BONUS : Ponieważ używa eval, działa dla dowolnych wyrażeń Ruby, a nie tylko dla dodawania!)

Paul Prestidge
źródło
Kiedy to przeczytałem, miałem ten sam pomysł, ale otrzymałem ~ 170 znaków kodu, więc dobrze zrobione. 0..9 to dziesięć cyfr, więc czy limit nie powinien wynosić 10 ** 10? Można użyć permutacji Array #, aby przeglądać wszystkie możliwe mapowania, ale może to wydłużyć kod.
blutorange
@blutorange Właśnie wybrałem 9 ** 9, ponieważ była to duża liczba, którą można napisać kilkoma znakami. Myślę, że powinno to być więcej niż wystarczające na uzasadnione przypadki testowe! Nie próbowałem wersji opartej na permutation, ale, jak mówisz, przede wszystkim martwiłem się długością kodu.
Paul Prestidge
4

LiveScript (179 znaków)

Ma deterministyczny i stosunkowo szybki czas działania i współpracuje również z innymi operatorami (+, -, *).

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
źródło
2

Python, 256 213 znaków

Przerażający czas pracy, postara się poprawić:

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
źródło
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)

Losowa brutalność.
Może trochę potrwać (moje najlepsze ujęcie CODE+GOLF=GREATto 3 sekundy, moje najgorsze 3 minuty).
Spróbuj z prostym wyrażeniem, takim jakA+B=C

Michael M.
źródło
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

Brutalna siła. Próbuje każdego możliwego dopasowania, dopóki go nie znajdzie lub po zakończeniu wypróbowania wszystkich. Rozciągnąłem reguły wyjściowe: drukuje coś w rodzaju [[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]rozwiązania, a jeśli nie istnieje, drukuje []. Daj mi znać, jeśli będę musiał to zmienić.

YawarRaza7349
źródło
Myślę, że ten wynik jest do zaakceptowania.
David Frank
2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

Łącznie 975 znaków, ale 960 z nich to białe znaki w 2 sekwencjach, więc liczą się one jako 2 znaki, a wraz z pozostałymi 15 otrzymujemy 17.
975 może wydawać się dużo, ale zauważ, że rozwiązanie python podziemnej kolejki ma 18862 znaków, są tylko na jednej linii :)

Możesz uruchomić go na http://cjam.aditsu.net/ dla krótkich słów, ale prawdopodobnie powinieneś używać interpretera java dla dłuższych. Z java na moim laptopie, SEND+MORE=MONEYdziała w 30-40 sekund iCODE+GOLF=GREAT prawie 3 minuty. Nie akceptuje liczb zaczynających się od 0 (ponieważ to nie jest fajne).

Oto program, który generuje program powyżej (pomaga również, jeśli StackExchange nie wyświetla poprawnie białych znaków):

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

Pierwsze 11 wierszy zawiera oryginalny program (nie tak naprawdę golfowy) w ciągu, a ostatni wiersz dokonuje konwersji i dodaje część dekodującą.

aditsu
źródło
0

PowerShell, 137 bajtów

port 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}}

Skrypt testowy bez golfisty:

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

Wynik:

11+22=33
2846+0851=03697
mazzy
źródło
0

PHP, 118 113 bajtów

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

drukuje cyfry pod literami i wychodzi z programu; zapętla się w nieskończoność, jeśli nie da się go rozwiązać. Uruchom jako potok z -nr.

awaria

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
    )
;
Tytus
źródło
0

PHP, 145 bajtów

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

funkcja rekurencyjna, drukuje rozwiązane równanie i wychodzi z programu; zwraca, NULLgdy nierozwiązywalne.

Wypróbuj online

awaria

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
}
Tytus
źródło