Tulis pemecah persamaan kata [duplikat]

17

pengantar

Perhatikan contoh berikut:

  CODE
+ GOLF
——————
 GREAT

Ini adalah persamaan di mana setiap huruf mewakili angka desimal dan kata-kata mewakili angka alami (huruf yang sama mewakili angka yang sama dan huruf yang berbeda mewakili angka yang berbeda). Tugasnya adalah mencocokkan setiap huruf dengan nilai digitnya sehingga persamaannya benar. Salah satu solusi untuk persamaan di atas adalah:

  9265
+ 1278
——————
 10543

Tugas Anda

Tugas Anda adalah menulis program atau fungsi yang dapat menyelesaikan persamaan seperti yang terlihat di atas.

Memasukkan

Input adalah string dalam format berikut:

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

Contoh:

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

Spasi dihilangkan dan hanya huruf antara kapital A dan Z yang akan digunakan (tidak ada huruf khusus atau kecil).

String ini dapat dibaca dari input standar, dari file, atau sebagai parameter fungsi.

Keluaran

Anda memiliki dua opsi berikut untuk format output:

  1. persamaan asli dengan digit tersubstitusi
  2. daftar surat dan nilainya

Jika ada beberapa solusi, salah satu (tetapi hanya satu) di antaranya harus dikembalikan. Jika tidak ada solusi, program harus mengembalikan string kosong atau nol. Output dapat dikembalikan sebagai string, dapat ditulis ke output standar atau file.

Contoh:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (Anda dapat menggunakan pembatas apa pun)

Aturan

  1. Untuk mempermudah, angka diterima untuk memulai dengan 0, tetapi Anda dapat menangani angka dengan memimpin 0 sebagai solusi yang tidak valid, terserah Anda
  2. Huruf yang sama mewakili angka yang sama dan huruf yang berbeda mewakili angka yang berbeda
  3. Anda dapat menggunakan bahasa apa pun dan perpustakaan standar bahasa yang dipilih (tidak ada lib eksternal)
  4. Anda tidak dapat terhubung ke sumber daya apa pun di internet (mengapa Anda mau?)
  5. Ini adalah tugas kode golf, kode terpendek menang. Karakter spasi putih berturut-turut dihitung sebagai satu karakter. (Jadi setiap program yang ditulis di spasi putih otomatis menang)

Saya punya solusi yang agak meretas menggunakan 179 karakter. Jika ada sesuatu yang tidak jelas, silakan tanyakan di komentar saya.

David Frank
sumber
Saya pikir jawaban optimal adalah "semuanya adalah 0". Anda mungkin ingin melarangnya secara khusus.
undergroundmonorail
1
Apa yang Anda maksud dengan semuanya adalah 0? Huruf yang berbeda harus menunjukkan angka yang berbeda.
David Frank
Merindukan itu, Nevermind :)
undergroundmonorail
If there are no solutions, the program should return an empty string or null.Loop tak terbatas masih menghasilkan apa-apa ... boleh saya?
Titus
1
Semua jawaban yang menang untuk tantangan ini secara efektif datang untuk mengeksploitasi aturan penilaian spasi putih, sehingga pengambilan suara sebagai duplikat.
pppery

Jawaban:

11

Python - 48 karakter

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

Menyalahgunakan aturan spasi putih.

Pertama saya mengonversi setiap karakter dalam jawaban CesiumLifeJacket ke nilai ASCII-nya (saya bisa saja menulis sendiri tetapi saya malas, dan toh itu tidak akan mempengaruhi skor akhir). String panjang dalam solusi saya adalah satu ruang untuk masing-masing nilai ASCII tersebut, dan tab yang memisahkannya. Pisahkan pada tab, temukan panjangnya, konversikan kembali ke karakter dan jalankan.

SE mengonversi masing-masing tab menjadi 4 spasi, jadi copypasting tidak akan berfungsi. Anda hanya harus percaya padaku :)

monmon bawah tanah
sumber
1
Bisakah Anda memberikan tautan ke ideone, atau dump hex kode Anda?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
1
Juga: exec adalah kata kunci, Anda dapat menyimpan 2 karakter dengan menghapus braket pertama dan terakhir
ɐɔıʇǝɥʇuʇǝɥʇs
4

Ruby 2.0, 122 karakter

Pengocokan kasar + eval! Ini belum memenuhi kriteria untuk mengembalikan string kosong / kosong ketika tidak ada solusi; itu hanya loop tak terhingga. Jika tidak dapat menemukan hasil setelah ~ 300 juta iterasi, itu akan mengembalikan nol. Cukup dekat?

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

Ia menemukan semua huruf unik dalam input, kemudian berulang kali mengocok angka 0-9 dan mencoba mencocokkannya dengan huruf sampai menemukan konfigurasi yang berfungsi.

Kode disajikan sebagai fungsi yang disebut fyang mengembalikan string dengan angka yang diganti, seperti dalam Opsi Output 1 di atas. Contoh penggunaan:

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

Waktu berjalan untuk CODE+GOLF=GREATcontoh pada mesin saya bervariasi dari seketika hingga sekitar 6 detik - tergantung pada seberapa beruntungnya Anda dengan shuffles!

Saya khususnya tidak senang dengan gsub(/\b0/,'')bit untuk menghapus angka nol di depan tetapi itu adalah satu-satunya hal yang dapat saya pikirkan untuk mencegah evalmenafsirkan angka sebagai int oktal.

( BONUS : Karena menggunakan eval, ia berfungsi untuk ekspresi Ruby yang sewenang-wenang dan bukan hanya penambahan!)

Paul Prestidge
sumber
Saya memiliki ide yang sama ketika saya membaca ini, tetapi saya mendapat ~ 170 karakter kode, sangat bagus. 0..9 adalah sepuluh digit, jadi bukankah batasnya 10 ** 10? Anda bisa menggunakan permutasi # Array untuk mengulang semua pemetaan yang mungkin, tetapi itu mungkin membuat kode lebih lama.
blutorange
@blutorange Saya baru saja memilih 9 ** 9 karena itu adalah angka besar yang dapat Anda tulis dengan beberapa karakter. Itu harus lebih dari cukup untuk setiap kasus uji yang masuk akal saya pikir! Saya belum mencoba versi berdasarkan permutation, tetapi seperti yang Anda katakan, saya terutama berkaitan dengan panjang kode.
Paul Prestidge
4

LiveScript (179 karakter)

Ini memiliki waktu berjalan yang deterministik dan relatif cepat dan bekerja dengan operator lain (+, -, *) juga.

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

Python, 256 213 karakter

Waktu berjalan yang mengerikan, akan mencoba untuk meningkatkan lebih lanjut:

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
sumber
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 acak.
Dapat memakan waktu cukup lama (bidikan terbaik saya CODE+GOLF=GREATadalah 3 detik, 3 menit terburuk saya).
Cobalah dengan ekspresi sederhana sepertiA+B=C

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

Paksaan. Mencoba setiap pencocokan yang mungkin sampai menemukan satu, atau setelah selesai mencoba semuanya. Saya memperluas aturan output: mencetak sesuatu seperti [[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]untuk solusinya, dan jika tidak ada, cetak []. Beri tahu saya jika saya perlu mengubah ini.

YawarRaza7349
sumber
Saya pikir, output ini dapat diterima.
David Frank
2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

Total 975 karakter, tetapi 960 di antaranya adalah spasi putih dalam 2 urutan, sehingga yang dihitung sebagai 2 karakter, dan bersama-sama dengan 15 lainnya, kita mendapatkan 17.
975 mungkin tampak seperti banyak, tetapi perhatikan bahwa solusi python undergroundmonorail memiliki 18862 karakter, mereka Hanya satu baris :)

Anda dapat menjalankannya di http://cjam.aditsu.net/ untuk kata-kata singkat, tetapi Anda mungkin harus menggunakan penerjemah java untuk yang lebih panjang. Dengan java di laptop saya, SEND+MORE=MONEYberjalan dalam 30-40 detik dan CODE+GOLF=GREATdalam hampir 3 menit. Itu tidak menerima angka yang dimulai dengan 0 (karena itu tidak keren).

Berikut adalah program yang menghasilkan program di atas (juga membantu jika StackExchange tidak menampilkan spasi putih dengan benar):

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

11 baris pertama berisi program asli (tidak benar-benar golf) dalam sebuah string, dan baris terakhir melakukan konversi dan menambahkan bagian decoding.

aditsu
sumber
0

Powershell, 137 byte

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

Script tes tidak digabungkan:

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

Keluaran:

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

PHP, 118 113 byte

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

mencetak angka di bawah huruf dan keluar dari program; loop tanpa batas jika tidak terpecahkan. Jalankan sebagai pipa dengan -nr.

kerusakan

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

fungsi rekursif, mencetak persamaan terpecahkan dan keluar dari program; kembali NULLsaat tidak terpecahkan.

Cobalah online

kerusakan

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
sumber