Viết một trình giải phương trình từ [trùng lặp]


17

Giới thiệu

Hãy xem xét ví dụ sau:

  CODE
+ GOLF
——————
 GREAT

Đây là một phương trình trong đó mỗi chữ cái đại diện cho một chữ số thập phân và các từ đại diện cho số tự nhiên (các chữ cái tương tự đại diện cho các chữ số tương tự và các chữ cái khác nhau đại diện cho các chữ số khác nhau). Nhiệm vụ là khớp từng chữ cái với giá trị chữ số của nó sao cho phương trình đúng. Một giải pháp cho phương trình trên là:

  9265
+ 1278
——————
 10543

Nhiệm vụ của bạn

Nhiệm vụ của bạn là viết một chương trình hoặc một hàm có thể giải các phương trình như đã thấy ở trên.

Đầu vào

Đầu vào là một chuỗi theo định dạng sau:

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

Thí dụ:

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

Dấu cách được bỏ qua và chỉ các chữ cái giữa chữ A và Z sẽ được sử dụng (không có chữ cái đặc biệt hoặc nhỏ).

Chuỗi này có thể được đọc từ đầu vào tiêu chuẩn, từ một tệp hoặc dưới dạng tham số chức năng.

Đầu ra

Bạn có hai tùy chọn sau cho định dạng đầu ra:

  1. phương trình ban đầu với các chữ số thay thế
  2. danh sách các chữ cái và giá trị của chúng

Nếu có nhiều giải pháp, bất kỳ (nhưng chỉ một) trong số chúng phải được trả lại. Nếu không có giải pháp, chương trình sẽ trả về một chuỗi rỗng hoặc null. Đầu ra có thể được trả về dưới dạng một chuỗi, có thể được ghi vào đầu ra tiêu chuẩn hoặc một tệp.

Thí dụ:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (bạn có thể sử dụng bất kỳ dấu phân cách nào)

Quy tắc

  1. Để làm cho mọi việc dễ dàng hơn, các số được chấp nhận bắt đầu bằng 0, nhưng bạn có thể xử lý các số có số 0 là giải pháp không hợp lệ, tùy thuộc vào bạn
  2. Các chữ cái tương tự đại diện cho các chữ số tương tự và các chữ cái khác nhau đại diện cho các chữ số khác nhau
  3. Bạn có thể sử dụng bất kỳ ngôn ngữ và thư viện chuẩn của ngôn ngữ đã chọn (không có lib bên ngoài)
  4. Bạn không thể kết nối với bất kỳ tài nguyên nào trên internet (tại sao bạn lại biết?)
  5. Đây là một nhiệm vụ golf mã, mã ngắn nhất thắng. Các ký tự khoảng trắng liên tiếp được tính là một ký tự đơn. (Vì vậy, bất kỳ chương trình nào được viết trong khoảng trắng sẽ tự động thắng)

Tôi có một giải pháp hơi hackish bằng cách sử dụng 179 ký tự. Nếu một cái gì đó không rõ ràng, xin vui lòng hỏi tôi trong các ý kiến.


Tôi nghĩ câu trả lời tối ưu là "mọi thứ đều bằng 0". Bạn có thể muốn đặc biệt cấm điều đó.
undergroundmonorail

1
Bạn có ý nghĩa gì bởi mọi thứ là 0? Các chữ cái khác nhau phải biểu thị số khác nhau.
David Frank

Nhỡ rằng, nevermind :)
undergroundmonorail

If there are no solutions, the program should return an empty string or null.Vòng lặp vô hạn vẫn không có kết quả gì ... tôi có thể?
Tít

1
Tất cả các câu trả lời chiến thắng cho thử thách này có hiệu quả đến từ việc khai thác quy tắc chấm điểm khoảng trắng, do đó bỏ phiếu chặt chẽ như một bản sao.
pppery

Câu trả lời:


11

Python - 48 ký tự

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

Lạm dụng quy tắc khoảng trắng.

Đầu tiên tôi đã chuyển đổi mọi ký tự trong câu trả lời của Caeslife sang giá trị ASCII của nó (tôi có thể tự viết nhưng tôi lười biếng và dù sao nó cũng không ảnh hưởng đến điểm số cuối cùng). Chuỗi dài trong giải pháp của tôi là một khoảng trắng cho mỗi một trong các giá trị ASCII đó và các tab tách chúng ra. Tách tại các tab, tìm độ dài, chuyển đổi lại thành ký tự và thực thi.

SE chuyển đổi các tab thành 4 khoảng cách mỗi dấu cách, vì vậy việc sao chép sẽ không hoạt động. Bạn sẽ phải tin tôi :)


1
Bạn có thể cung cấp một liên kết đến ideone hoặc kết xuất hex của mã của bạn không?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
Ngoài ra: exec là một từ khóa, bạn có thể lưu 2 ký tự bằng cách xóa dấu ngoặc đầu tiên và cuối cùng
vào

4

Ruby 2.0, 122 ký tự

Brute lực lượng xáo trộn + eval! Điều này chưa đáp ứng các tiêu chí trả về chuỗi rỗng / rỗng khi không có giải pháp; nó chỉ vòng lặp vô tận. Nếu nó không thể tìm thấy kết quả sau ~ 300 triệu lần lặp, nó sẽ trả về con số không. Đủ gầ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}

Nó tìm thấy tất cả các chữ cái duy nhất trong đầu vào, sau đó liên tục xáo trộn các chữ số 0-9 và cố gắng ghép chúng với các chữ cái cho đến khi tìm thấy cấu hình hoạt động.

Mã được trình bày dưới dạng một hàm được gọi là ftrả về một chuỗi với các số được thay thế, như trong Tùy chọn đầu ra 1 ở trên. Ví dụ sử dụng:

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

Thời gian chạy cho CODE+GOLF=GREATví dụ trên máy của tôi thay đổi từ tức thời đến khoảng 6 giây - tùy thuộc vào mức độ may mắn của bạn với việc xáo trộn!

Tôi đặc biệt không hài lòng với gsub(/\b0/,'')bit để loại bỏ các số 0 đứng đầu nhưng đó là điều duy nhất tôi có thể nghĩ để ngăn không cho việc evaldiễn giải các số là số nguyên bát phân.

( THƯỞNG : Bởi vì nó sử dụng eval, nó hoạt động cho các biểu thức Ruby tùy ý và không chỉ là bổ sung!)


Tôi đã có ý tưởng tương tự khi tôi đọc nó, nhưng tôi đã nhận được ~ 170 ký tự mã, rất tốt. 0..9 là mười chữ số, vì vậy không nên giới hạn là 10 ** 10? Bạn có thể sử dụng hoán vị Array # để lặp trên tất cả các ánh xạ có thể, nhưng điều đó có thể làm cho mã dài hơn.
blutorange

@blutorange Tôi chỉ chọn 9 ** 9 vì đó là một số lớn bạn có thể viết với vài ký tự. Nó nên là quá đủ cho bất kỳ trường hợp thử nghiệm hợp lý nào tôi nghĩ! Tôi chưa thử phiên bản dựa trên permutation, nhưng như bạn nói, tôi chủ yếu quan tâm đến độ dài mã.
Paul Prestidge

4

LiveScript (179 ký tự)

Nó có thời gian chạy xác định và tương đối nhanh và cũng hoạt động với các toán tử khác (+, -, *).

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 ký tự

Thời gian chạy khủng khiếp, sẽ cố gắng cải thiện hơn nữa:

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 ngẫu nhiên.
Có thể mất một lúc (cú đánh tốt nhất của tôi CODE+GOLF=GREATlà 3 giây, 3 phút tồi tệ nhất của tôi).
Hãy thử nó với một biểu thức đơn giản như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

Lực lượng vũ phu. Thử mọi kết hợp có thể cho đến khi tìm thấy một hoặc sau khi kết thúc thử tất cả. Tôi kéo dài các quy tắc đầu ra: in một cái gì đó giống như [[('C','3'),('O','8'),('D','6'),('E','7'),('G','0'),('L','5'),('F','2'),('R','4'),('A','1'),('T','9')]]cho giải pháp, và nếu không tồn tại, in []. Hãy cho tôi biết nếu tôi cần thay đổi điều này.


Tôi nghĩ rằng, đầu ra này là chấp nhận được.
David Frank

2

CJam - 17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

Tổng cộng 975 ký tự, nhưng 960 trong số đó là khoảng trắng trong 2 chuỗi, vì vậy chúng được tính là 2 ký tự và cùng với 15 ký tự khác, chúng tôi nhận được 17.
975 có vẻ như rất nhiều, nhưng lưu ý rằng giải pháp python của ngầm có 18862 ký tự chỉ là trên một dòng duy nhất :)

Bạn có thể chạy nó tại http://cjam.aditsu.net/ cho các từ ngắn, nhưng có lẽ bạn nên sử dụng trình thông dịch java cho các từ dài hơn. Với java trên máy tính xách tay của tôi, SEND+MORE=MONEYchạy trong 30-40 giây và CODE+GOLF=GREATtrong gần 3 phút. Nó không chấp nhận số bắt đầu bằng 0 (vì điều đó không tuyệt).

Đây là một chương trình tạo chương trình ở trên (cũng hữu ích nếu StackExchange không hiển thị chính xác khoảng trắng):

"{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 dòng đầu tiên chứa chương trình gốc (không thực sự được đánh gôn) trong một chuỗi và dòng cuối cùng thực hiện chuyển đổi và thêm phần giải mã.


0

Powershell, 137 byte

cổng 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}}

Kịch bản kiểm tra bị lật tẩy:

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

Đầu ra:

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

in các chữ số bên dưới các chữ cái và thoát khỏi chương trình; vòng lặp vô hạn nếu không thể giải quyết. Chạy như ống với -nr.

phá vỡ

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

hàm đệ quy, in phương trình đã giải và thoát chương trình; trả lại NULLkhi không thể giải quyết.

Dùng thử trực tuyến

phá vỡ

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.