เขียนคำแก้สมการ [ซ้ำ]


17

บทนำ

ลองพิจารณาตัวอย่างต่อไปนี้:

  CODE
+ GOLF
——————
 GREAT

นี่คือสมการที่ตัวอักษรแต่ละตัวแทนตัวเลขทศนิยมและคำที่เป็นตัวแทนของตัวเลขธรรมชาติ (ตัวอักษรที่คล้ายกันแสดงถึงตัวเลขที่คล้ายกันและตัวอักษรที่แตกต่างกันแสดงตัวเลขที่แตกต่างกัน) ภารกิจคือจับคู่ตัวอักษรแต่ละตัวด้วยค่าตัวเลขเพื่อให้สมการนั้นถูกต้อง ทางออกหนึ่งสำหรับสมการข้างต้นคือ:

  9265
+ 1278
——————
 10543

งานของคุณ

งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่สามารถแก้สมการดังที่เห็นด้านบน

อินพุต

อินพุตเป็นสตริงในรูปแบบต่อไปนี้:

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

ตัวอย่าง:

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

เว้นช่องว่างและจะใช้เฉพาะตัวอักษรระหว่างตัวอักษร A และ Z เท่านั้น (ไม่มีตัวอักษรพิเศษหรือตัวเล็ก)

สตริงนี้สามารถอ่านได้จากอินพุตมาตรฐานจากไฟล์หรือเป็นพารามิเตอร์ฟังก์ชั่น

เอาท์พุต

คุณมีสองอ็อพชันต่อไปนี้สำหรับรูปแบบเอาต์พุต:

  1. สมการดั้งเดิมที่มีตัวเลขแทน
  2. รายการตัวอักษรและค่าของพวกเขา

หากมีวิธีแก้ไขหลายวิธีควรส่งคืน (แต่มีเพียงหนึ่งรายการเท่านั้น) หากไม่มีวิธีแก้ปัญหาโปรแกรมควรส่งคืนสตริงว่างหรือโมฆะ เอาต์พุตสามารถส่งคืนเป็นสตริงสามารถเขียนไปยังเอาต์พุตมาตรฐานหรือไฟล์

ตัวอย่าง:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (คุณสามารถใช้ตัวคั่นใดก็ได้)

กฎระเบียบ

  1. เพื่อให้ง่ายขึ้นเรายอมรับตัวเลขที่เริ่มต้นด้วย 0 แต่คุณสามารถจัดการกับตัวเลขด้วยการนำ 0 เป็นวิธีแก้ปัญหาที่ไม่ถูกต้องขึ้นอยู่กับคุณ
  2. ตัวอักษรที่คล้ายกันแทนตัวเลขที่คล้ายกันและตัวอักษรที่แตกต่างกันแสดงถึงตัวเลขที่แตกต่างกัน
  3. คุณสามารถใช้ภาษาใดก็ได้และไลบรารีมาตรฐานของภาษาที่เลือก (ไม่มี libs ภายนอก)
  4. คุณไม่สามารถเชื่อมต่อกับแหล่งข้อมูลใด ๆ บนอินเทอร์เน็ต (ทำไมคุณถึงยังต้องการ)
  5. นี่คือภารกิจการเล่นกอล์ฟรหัสซึ่งเป็นรหัสที่สั้นที่สุดชนะ อักขระช่องว่างต่อเนื่องนับเป็นอักขระเดียว (ดังนั้นโปรแกรมใด ๆ ที่เขียนในช่องว่างจะชนะโดยอัตโนมัติ)

ฉันมีวิธีแฮ็คค่อนข้างใช้ 179 chars หากสิ่งที่ไม่ชัดเจนโปรดถามฉันในความคิดเห็น


ฉันคิดว่าคำตอบที่ดีที่สุดคือ "ทุกอย่างคือ 0" คุณอาจต้องการห้ามเป็นการเฉพาะ
undergroundmonorail

1
คุณหมายถึงอะไรทุกอย่างคือ 0 ตัวอักษรที่แตกต่างกันต้องแสดงถึงตัวเลขที่แตกต่างกัน
David Frank

พลาดไปอย่างนั้นไม่ต้องห่วง :)
undergroundmonorail

If there are no solutions, the program should return an empty string or null.ลูปไม่มีที่สิ้นสุดยังคงเอาท์พุทอะไร ... ฉันขอไหม
ติตัส

1
คำตอบที่ได้รับรางวัลสำหรับความท้าทายนี้ได้ผลมาจากการใช้ประโยชน์จากกฎการให้คะแนนของช่องว่าง
pppery

คำตอบ:


11

Python - 48 ตัวอักษร

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

การละเมิดกฎช่องว่าง

ก่อนอื่นฉันแปลงทุกตัวละครในคำตอบของ CesiumLifeJacket ให้เป็นค่า ASCII (ฉันสามารถเขียนของตัวเอง แต่ฉันขี้เกียจและมันจะไม่ส่งผลกระทบต่อคะแนนสุดท้ายอยู่ดี) สตริงที่ยาวในโซลูชันของฉันคือหนึ่งช่องว่างสำหรับแต่ละค่า ASCII เหล่านั้นและแท็บที่คั่นพวกเขา แยกที่แท็บค้นหาความยาวแปลงกลับเป็นตัวอักษรและดำเนินการ

SE แปลงแท็บเป็น 4 ช่องว่างดังนั้นการคัดลอกจะไม่ทำงาน คุณแค่ต้องเชื่อฉัน :)


1
คุณสามารถให้ลิงค์ไปยัง ideone หรือฐานสิบหกของรหัสของคุณได้หรือไม่
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
นอกจากนี้: exec เป็นคำหลักคุณสามารถบันทึก 2 ตัวอักษรโดยการลบวงเล็บแรกและสุดท้าย
ɐɔıʇǝɥʇuʎs

4

Ruby 2.0, 122 ตัวอักษร

กำลังดุร้ายสับ + eval! สิ่งนี้ยังไม่เป็นไปตามเกณฑ์ของการส่งคืนสตริงว่าง / ไม่พบเมื่อไม่มีวิธีแก้ปัญหา มันวนซ้ำไปเรื่อย ๆ หากไม่พบผลลัพธ์หลังจากทำซ้ำประมาณ 300 ล้านจะได้ผลลัพธ์เป็นศูนย์ ใกล้พอไหม

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

มันจะค้นหาตัวอักษรที่ไม่ซ้ำกันทั้งหมดในอินพุตจากนั้นจะสลับตัวเลข 0-9 ซ้ำ ๆ และพยายามจับคู่กับตัวอักษรเหล่านั้นจนกว่าจะพบการกำหนดค่าที่ใช้งานได้

รหัสจะถูกนำเสนอเป็นฟังก์ชั่นที่เรียกว่า fซึ่งจะส่งกลับสตริงที่มีตัวเลขทดแทนเช่นเดียวกับในตัวเลือกเอาท์พุท 1 ข้างต้น ตัวอย่างการใช้งาน:

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

เวลาที่ใช้สำหรับCODE+GOLF=GREATตัวอย่างในเครื่องของฉันจะแตกต่างกันไปจากในทันทีถึงประมาณ 6 วินาที - ขึ้นอยู่กับว่าคุณโชคดีแค่ไหนใน shuffles!

ฉันไม่มีความสุขโดยเฉพาะอย่างยิ่งกับ gsub(/\b0/,'')บิตที่จะลบศูนย์นำ แต่มันเป็นสิ่งเดียวที่ฉันสามารถคิดเพื่อป้องกันevalการตีความตัวเลขเป็น int แปด

( โบนัส : เพราะมันใช้ eval มันใช้กับนิพจน์ Ruby โดยพลการและไม่ใช่แค่เพิ่มเท่านั้น!)


ฉันมีความคิดเดียวกันเมื่อฉันอ่านสิ่งนี้ แต่ฉันได้รับโค้ดประมาณ 170 chars ทำได้ดีมาก 0..9 คือสิบหลักดังนั้นขีด จำกัด ควรเป็น 10 ** 10 หรือไม่ คุณสามารถใช้ Array # permutation เพื่อวนลูปการแมปที่เป็นไปได้ทั้งหมด แต่นั่นอาจทำให้โค้ดยาวขึ้น
blutorange

@blutorange ฉันเพิ่งเลือก 9 ** 9 เพราะมันเป็นจำนวนมากที่คุณสามารถเขียนด้วยตัวละครน้อย มันควรจะมากพอสำหรับกรณีทดสอบที่สมเหตุสมผลฉันคิดว่า! ฉันไม่ได้ลองใช้เวอร์ชันpermutationแต่ตามที่คุณพูดฉันกังวลเกี่ยวกับความยาวโค้ดเป็นหลัก
Paul Prestidge

4

LiveScript (179 ตัวอักษร)

มันมีเวลาที่กำหนดและค่อนข้างรวดเร็วและทำงานร่วมกับผู้ประกอบการอื่น (+, -, *) เช่นกัน

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 ตัวอักษร

เวลาทำงานที่น่ากลัวจะพยายามปรับปรุงเพิ่มเติม:

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
ใช้เวลาสักครู่ (ภาพที่ดีที่สุดของฉันCODE+GOLF=GREATคือ 3 วินาที, 3 นาทีที่แย่ที่สุดของฉัน)
ลองด้วยการแสดงออกอย่างง่ายเช่นA+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

กำลังดุร้าย. พยายามทุกการจับคู่ที่เป็นไปได้จนกว่าจะพบหนึ่งหรือหลังจากที่ได้ลองพวกเขาทั้งหมด ผมยืดกฎการส่งออก: พิมพ์สิ่งที่ต้องการ[[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]สำหรับการแก้ปัญหาและถ้าไม่มีใครอยู่, []พิมพ์ แจ้งให้เราทราบหากต้องการเปลี่ยนแปลง


ฉันคิดว่าผลลัพธ์นี้เป็นที่ยอมรับ
David Frank

2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

อักขระทั้งหมด 975 ตัว แต่ 960 ตัวนั้นเป็นช่องว่างใน 2 ลำดับดังนั้นจำนวนนั้นจึงเป็น 2 ตัวอักษรและอีก 15 ตัวเราได้ 17.
17.75 อาจดูเยอะมาก แต่โปรดทราบว่าโซลูชันงูหลามของ undergroundmonorail มี 18862 ตัวอักษรพวกเขา แค่บรรทัดเดียว :)

คุณสามารถเรียกใช้งานได้ที่http://cjam.aditsu.net/สำหรับคำสั้น ๆ แต่คุณควรใช้ตัวแปลจาวาสำหรับตัวที่ยาวกว่านี้ ด้วย java บนแล็ปท็อปของฉันSEND+MORE=MONEYทำงานใน 30-40 วินาทีและCODE+GOLF=GREATเกือบ 3 นาที ไม่ยอมรับตัวเลขที่ขึ้นต้นด้วย 0 (เพราะมันไม่เจ๋ง)

ต่อไปนี้เป็นโปรแกรมที่สร้างโปรแกรมด้านบน (และช่วยในกรณีที่ StackExchange ไม่แสดงช่องว่างอย่างถูกต้อง):

"{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 บรรทัดแรกมีโปรแกรมต้นฉบับ (ไม่ใช่กอล์ฟ) ในสตริงและบรรทัดสุดท้ายทำการแปลงและเพิ่มส่วนการถอดรหัส


0

Powershell, 137 ไบต์

พอร์ตของLiveScript

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

สคริปต์ทดสอบ Ungolfed:

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

เอาท์พุท:

11+22=33
2846+0851=03697

0

PHP, 118 113 ไบต์

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

พิมพ์ตัวเลขด้านล่างตัวอักษรและออกจากโปรแกรม; วนซ้ำหากไม่สามารถแก้ไขได้ -nrทำงานเป็นท่อด้วย

ชำรุด

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 ไบต์

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

ฟังก์ชั่นวนซ้ำพิมพ์สมการที่แก้ไขแล้วออกจากโปรแกรม ส่งคืนNULLเมื่อไม่สามารถกู้คืนได้

ลองออนไลน์

ชำรุด

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.