Bir kelime denklem çözücü yazın [yinelenen]


17

Giriş

Aşağıdaki örneği düşünün:

  CODE
+ GOLF
——————
 GREAT

Bu, her harfin ondalık basamağı temsil ettiği ve kelimelerin doğal sayıları temsil ettiği bir denklemdir (benzer harfler benzer basamakları ve farklı harfler farklı basamakları temsil eder). Görev, denklemin doğru olması için her harfi kendi rakam değeri ile eşleştirmektir. Yukarıdaki denklem için bir çözüm:

  9265
+ 1278
——————
 10543

Senin görevin

Göreviniz yukarıda görüldüğü gibi denklemleri çözebilecek bir program veya fonksiyon yazmaktır.

Giriş

Girdi aşağıdaki biçimde bir dizedir:

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

Misal:

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

Boşluklar kullanılmaz ve yalnızca büyük A ve Z arasındaki harfler kullanılır (özel veya küçük harfler kullanılmaz).

Bu dize standart girişten, bir dosyadan veya bir işlev parametresi olarak okunabilir.

Çıktı

Çıktı biçimi için aşağıdaki iki seçeneğiniz vardır:

  1. basamakları değiştirilmiş orijinal denklem
  2. harflerin listesi ve değerleri

Birden fazla çözüm varsa, bunlardan herhangi biri (ancak bir tanesi) iade edilmelidir. Çözüm yoksa, program boş bir dize veya null döndürmelidir. Çıktı bir dize olarak döndürülebilir, standart çıktıya veya bir dosyaya yazılabilir.

Misal:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (herhangi bir sınırlayıcı kullanabilirsiniz)

kurallar

  1. İşleri kolaylaştırmak için 0 ile başlayan sayılar kabul edilir, ancak 0 ile başlayan numaraları geçersiz çözümler olarak işleyebilirsiniz, bu size kalmış
  2. Benzer harfler benzer rakamları ve farklı harfler farklı rakamları temsil eder
  3. Herhangi bir dili ve seçilen dilin standart kütüphanesini kullanabilirsiniz (harici kütüphaneler olmadan)
  4. İnternetteki hiçbir kaynağa bağlanamıyorsunuz (neden yine de?
  5. Bu bir kod golf görevi, en kısa kod kazanır. Ardışık boşluk karakterleri tek bir karakter olarak sayılır. (Böylece boşlukta yazılmış herhangi bir program otomatik olarak kazanır)

179 karakter kullanarak biraz hackish bir çözüm var. Bir şey net değilse, lütfen yorumlarda bana sorun.


Bence en uygun cevap "her şey 0" dır. Bunu özellikle yasaklamak isteyebilirsiniz.
yeraltı

1
Her şeyle ne demek istiyorsun 0? Farklı harfler farklı sayıları belirtmelidir.
David Frank

Kaçırdım, nevermind :)
undergroundmonorail

If there are no solutions, the program should return an empty string or null.Sonsuz döngüler hala hiçbir şey vermez ...
Titus

1
Bu meydan okumaya tüm kazanan cevaplar, beyaz boşluk puanlama kuralından faydalanmaya etkili bir şekilde gelir, bu yüzden bir kopya olarak yakın oylama.
pppery

Yanıtlar:


11

Python - 48 karakter

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

Boşluk kuralını kötüye kullanma.

İlk önce CesiumLifeJacket'in cevabındaki her karakteri ASCII değerine dönüştürdüm (kendim yazabilirdim ama tembelim ve yine de nihai puanı etkilemezdi). Çözümümdeki uzun dize, bu ASCII değerlerinin her biri ve bunları ayıran sekmeler için bir boşluktur. Sekmelere bölün, uzunlukları bulun, karakterlere geri dönün ve çalıştırın.

SE sekmeleri 4 boşluğa dönüştürür, bu nedenle kopya yapıştırma çalışmaz. Bana inanman gerekecek :)


1
İdeone bağlantısı veya kodunuzun onaltılık dökümünü sağlayabilir misiniz?
ǹ̷̰ĥ̷̳h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Ayrıca: exec bir anahtar kelime, ilk ve son parantez kaldırarak 2 karakter kaydedebilirsiniz
Junıʇǝɥʇuʎs

4

Ruby 2.0, 122 karakter

Kaba kuvvet karıştırma + eval! Bu, çözüm olmadığında boş / boş dizgi döndürme ölçütlerini henüz karşılamamaktadır; sadece sonsuz döngüler. ~ 300 milyon yinelemeden sonra bir sonuç bulamazsa sıfır döndürür. Yeterince yakın?

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

Girişteki tüm benzersiz harfleri bulur, ardından 0-9 arasındaki rakamları tekrar tekrar karıştırır ve çalışan bir yapılandırma bulana kadar harflerle eşleştirmeye çalışır.

Kod, fyukarıdaki Çıktı Seçeneği 1'deki gibi ikame edilmiş sayıları içeren bir dize döndüren bir işlev olarak sunulur . Örnek kullanım:

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

Makinemdeki CODE+GOLF=GREATörnek için çalışma süresi anlıkdan yaklaşık 6 saniyeye kadar değişiyor - karışıklarla ne kadar şanslı olduğunuza bağlı!

gsub(/\b0/,'')Baştaki sıfırları kaldırmak için biraz memnun kalmadım, ancak evalsayıları sekizli ints olarak yorumlamayı engelleyebileceğim tek şeydi .

( BONUS : eval kullandığından, sadece toplama için değil, rastgele Ruby ifadeleri için de çalışır!)


Bunu okuduğumda aynı fikrim vardı, ama ~ 170 karakterlik kod aldım, çok iyi. 0..9 on basamaklı, bu yüzden sınır 10 ** 10 olmamalı mı? Tüm olası eşlemeler üzerinde döngü oluşturmak için Dizi # permütasyonunu kullanabilirsiniz, ancak bu kodun daha uzun olmasına neden olabilir.
blutorange

@blutorange Az önce 9 ** 9 seçtim, çünkü birkaç karakterle yazabileceğiniz çok sayıdaydı. Bence makul test vakaları için fazlasıyla yeterli olmalı! Ben dayalı bir sürümü denemedim permutation, ama dediğin gibi ben öncelikle kod uzunluğu ile ilgili.
Paul Prestidge

4

LiveScript (179 karakter)

Belirleyici ve nispeten hızlı çalışma süresine sahiptir ve diğer operatörlerle (+, -, *) de çalışır.

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

Python, 256 213 karakter

Korkunç çalışma süresi, daha da geliştirmeye çalışacaktır:

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)

Rastgele kaba kuvvet.
Biraz zaman alabilir (en iyi çekimim CODE+GOLF=GREAT3 saniye, en kötü 3 dakikam).
Gibi basit bir ifade ile deneyinA+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

Kaba kuvvet. Olası her eşleşmeyi bir tane bulana kadar veya hepsini denemeyi bitirdikten sonra dener. Çıktı kurallarını uzattım: [[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]çözüm için benzer bir şey yazdırır ve eğer yoksa, yazdırır []. Bunu değiştirmem gerekip gerekmediğini bana bildirin.


Bence bu çıktı kabul edilebilir.
David Frank

2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

Toplam 975 karakter, ancak 960'ı 2 dizide boşluk, bu yüzden 2 karakter olarak sayılıyor ve diğer 15 ile birlikte 17 elde ediyoruz.
975 çok gibi görünebilir, ancak undergroundmonorail'in python çözümünün 18862 karakteri olduğunu unutmayın. sadece tek bir satırdayız :)

Şurada çalıştırabilirsiniz: Kısa kelimeler için http://cjam.aditsu.net/ adresinden , ancak java yorumlayıcıyı daha uzun olanlar için kullanmalısınız. Benim laptop java ile, SEND+MORE=MONEY30-40 sn ve CODE+GOLF=GREATneredeyse 3 dakika içinde çalışır . 0 ile başlayan sayıları kabul etmez (çünkü bu hoş değildir).

Yukarıdaki programı oluşturan bir program aşağıdadır (StackExchange boşlukları doğru göstermiyorsa da yardımcı olur):

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

İlk 11 satır, bir dizede orijinal programı (gerçekten golf değil) içerir ve son satır dönüştürme işlemini yapar ve kod çözme parçasını ekler.


0

Powershell, 137 bayt

LiveScript bağlantı noktası

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

Ungolfed test komut dosyası:

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

Çıktı:

11+22=33
2846+0851=03697

0

PHP, 118113 bayt

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

harflerin altındaki rakamları yazdırır ve programdan çıkar; çözülemezse sonsuz döngüler. İle boru olarak çalıştırın -nr.

Yıkmak

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 bayt

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

özyinelemeli fonksiyon, çözülmüş denklemi yazdırır ve programdan çıkar; NULLçözülemediğinde döner .

Çevrimiçi deneyin

Yıkmak

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.