Scrivi una parola risolutore di equazioni [duplicato]


17

introduzione

Considera il seguente esempio:

  CODE
+ GOLF
——————
 GREAT

Questa è un'equazione in cui ogni lettera rappresenta una cifra decimale e le parole rappresentano numeri naturali (lettere simili rappresentano cifre simili e lettere diverse rappresentano cifre diverse). Il compito è abbinare ogni lettera al suo valore in cifre in modo che l'equazione sia corretta. Una soluzione per l'equazione sopra è:

  9265
+ 1278
——————
 10543

Il tuo compito

Il tuo compito è scrivere un programma o una funzione in grado di risolvere tali equazioni come visto sopra.

Ingresso

L'input è una stringa nel seguente formato:

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

Esempio:

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

Gli spazi vengono omessi e verranno utilizzate solo lettere tra maiuscole e minuscole (nessuna lettera speciale o minuscola).

Questa stringa può essere letta dall'input standard, da un file o come parametro di funzione.

Produzione

Sono disponibili le seguenti due opzioni per il formato di output:

  1. l'equazione originale con le cifre sostituite
  2. elenco delle lettere e dei loro valori

Se esistono più soluzioni, è necessario restituirne una (ma solo una). Se non ci sono soluzioni, il programma dovrebbe restituire una stringa vuota o null. L'output può essere restituito come stringa, può essere scritto nell'output standard o in un file.

Esempio:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (puoi usare qualsiasi delimitatore)

Regole

  1. Per semplificare le cose, i numeri sono accettati per iniziare con 0, ma puoi gestire i numeri con 0 iniziale come soluzioni non valide, dipende da te
  2. Lettere simili rappresentano cifre simili e lettere diverse rappresentano cifre diverse
  3. Puoi usare qualsiasi lingua e la libreria standard della lingua scelta (senza librerie esterne)
  4. Non è possibile connettersi a nessuna risorsa su Internet (perché dovresti comunque?)
  5. Questo è un compito di golf del codice, il codice più corto vince. I caratteri di spazi bianchi consecutivi contano come un singolo personaggio. (Quindi qualsiasi programma scritto negli spazi bianchi vince automaticamente)

Ho una soluzione in qualche modo hacker che utilizza 179 caratteri. Se qualcosa non è chiaro, per favore chiedetemi nei commenti.


Penso che la risposta ottimale sia "tutto è 0". Potresti volerlo proibire in modo specifico.
undergroundmonorail,

1
Cosa intendi con tutto è 0? Lettere diverse devono indicare numeri diversi.
David Frank,

Perso questo, non importa :)
undergroundmonorail

If there are no solutions, the program should return an empty string or null.I loop infiniti non generano ancora nulla ... posso?
Tito

1
Tutte le risposte vincenti a questa sfida si riducono effettivamente allo sfruttamento della regola del punteggio degli spazi bianchi, votando così da vicino come duplicato.
pepery

Risposte:


11

Python - 48 caratteri

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

Abusare della regola degli spazi bianchi.

Per prima cosa ho convertito tutti i personaggi nella risposta di CesiumLifeJacket al suo valore ASCII (avrei potuto scrivere il mio ma sono pigro e non avrebbe comunque influito sul punteggio finale). La lunga stringa nella mia soluzione è uno spazio per ognuno di quei valori ASCII e le schede che li separano. Dividi in schede, trova le lunghezze, converti nuovamente in caratteri ed esegui.

SE converte le schede in 4 spazi ciascuna, quindi il copypasting non funzionerà. Devi solo credermi :)


1
Puoi fornire un link a ideone o un dump esadecimale del tuo codice?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Inoltre: exec è una parola chiave, è possibile salvare 2 caratteri rimuovendo la prima e l'ultima parentesi
Junıʇǝɥʇuʎs

4

Ruby 2.0, 122 caratteri

Mescolanza della forza bruta + eval! Questo non soddisfa ancora i criteri per restituire una stringa nulla / vuota quando non c'è soluzione; si avvolge all'infinito. Se non riesce a trovare un risultato dopo ~ 300 milioni di iterazioni, restituirà zero. Abbastanza vicino?

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

Trova tutte le lettere univoche nell'input, quindi mescola ripetutamente le cifre da 0 a 9 e tenta di abbinarle alle lettere fino a trovare una configurazione che funzioni.

Il codice viene presentato come una funzione chiamata fche restituisce una stringa con i numeri sostituiti, come nell'Opzione di output 1 sopra. Esempio di utilizzo:

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

Il tempo di esecuzione CODE+GOLF=GREATdell'esempio sulla mia macchina varia da istantaneo a circa 6 secondi - dipende da quanto sei fortunato con i mescolamenti!

Sono particolarmente scontento del gsub(/\b0/,'')bit per rimuovere gli zeri iniziali, ma era l'unica cosa che potevo pensare di impedire evaldi interpretare i numeri come numeri ottali.

( BONUS : Poiché usa eval, funziona con espressioni Ruby arbitrarie e non solo addizioni!)


Ho avuto la stessa idea quando ho letto questo, ma ho ricevuto ~ 170 caratteri di codice, così ben fatto. 0..9 sono dieci cifre, quindi il limite non dovrebbe essere 10 ** 10? È possibile utilizzare la permutazione dell'array # per scorrere su tutte le possibili mappature, ma ciò potrebbe allungare il codice.
Blutorange,

@blutorange Ho appena scelto 9 ** 9 perché era un gran numero che potresti scrivere con pochi caratteri. Dovrebbe essere più che sufficiente per qualsiasi ragionevole test case penso! Non ho provato una versione basata su permutation, ma come dici tu, ero principalmente interessato alla lunghezza del codice.
Paul Prestidge,

4

LiveScript (179 caratteri)

Ha un tempo di esecuzione deterministico e relativamente rapido e funziona anche con altri operatori (+, -, *).

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

2

Pitone, 256 213 caratteri

Il tempo di esecuzione orribile, cercherà di migliorare ulteriormente:

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

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)

Bruteforce casuale.
Può volerci un po '(il mio tiro migliore per CODE+GOLF=GREAT3 secondi, i miei 3 minuti peggiori).
Provalo con un'espressione semplice comeA+B=C


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

Forza bruta. Prova ogni possibile abbinamento fino a quando non ne trova uno, o dopo aver finito di provarli tutti. Ho allungato le regole di output: stampa qualcosa di simile [[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]per la soluzione e, se non esiste, stampa []. Fammi sapere se devo cambiare questo.


Penso che questo risultato sia accettabile.
David Frank,

2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

In totale 975 caratteri, ma 960 di essi sono spazi bianchi in 2 sequenze, quindi contano come 2 caratteri e insieme agli altri 15 ne otteniamo 17.
975 può sembrare molto, ma nota che la soluzione di pitone di undergroundmonorail ha 18862 caratteri, essi sei solo su una sola riga :)

Puoi eseguirlo su http://cjam.aditsu.net/ per parole brevi, ma probabilmente dovresti usare l'interprete java per parole più lunghe. Con java sul mio laptop, SEND+MORE=MONEYfunziona in 30-40 secondi e CODE+GOLF=GREATin quasi 3 minuti. Non accetta numeri che iniziano con 0 (perché non è bello).

Ecco un programma che genera il programma sopra (aiuta anche se StackExchange non mostra correttamente gli spazi bianchi):

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

Le prime 11 righe contengono il programma originale (non proprio giocato a golf) in una stringa e l'ultima riga esegue la conversione e aggiunge la parte di decodifica.


0

Powershell, 137 byte

porta di 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 di prova non golfato:

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

Produzione:

11+22=33
2846+0851=03697

0

PHP, 118 113 byte

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

stampa le cifre sotto le lettere ed esce dal programma; loop all'infinito se irrisolvibili. Esegui come pipe con -nr.

abbattersi

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

0

PHP, 145 byte

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

funzione ricorsiva, stampa equazione risolta ed esce dal programma; ritorna NULLquando irrisolvibile.

Provalo online

abbattersi

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.