단어 방정식 솔버 작성 [중복]


17

소개

다음 예제를 고려하십시오.

  CODE
+ GOLF
——————
 GREAT

이것은 각 문자가 10 진수를 나타내고 단어가 자연수를 나타내는 방정식입니다 (유사한 문자는 유사한 숫자를 나타내고 다른 문자는 다른 숫자를 나타냄). 작업은 방정식이 정확하도록 각 문자를 숫자 값과 일치시키는 것입니다. 위 방정식에 대한 한 가지 해결책은 다음과 같습니다.

  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. 모든 언어와 선택한 언어의 표준 라이브러리를 사용할 수 있습니다 (외부 라이브러리 없음)
  4. 인터넷의 어떤 리소스에도 연결할 수 없습니다 (어쨌든 왜 하시겠습니까?)
  5. 이것은 코드 골프 작업이며 가장 짧은 코드가 승리합니다. 연속적인 공백 문자는 단일 문자로 계산됩니다. (따라서 공백으로 작성된 모든 프로그램이 자동으로 승리합니다)

179자를 사용하는 다소 해킹 솔루션이 있습니다. 분명하지 않은 내용이 있으면 의견을 남겨주십시오.


최적의 대답은 "모든 것이 0"이라고 생각합니다. 구체적으로 금지하고 싶을 수도 있습니다.
undergroundmonorail

1
모든 것이 0이라는 것은 무엇을 의미합니까? 다른 문자는 다른 숫자를 나타내야합니다.
David Frank


If there are no solutions, the program should return an empty string or null.무한 루프는 여전히 아무것도 출력하지 않습니다 ...
Titus

1
이 도전에 대한 모든 답은 효과적으로 공백 스코어링 규칙을 악용하는 것입니다.
pppery

답변:


11

파이썬-48 자

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

공백 규칙을 남용합니다.

먼저 CesiumLifeJacket의 답변에있는 모든 문자를 ASCII 값으로 변환했습니다. 내 솔루션의 긴 문자열은 해당 ASCII 값과 탭을 구분하는 탭마다 하나의 공백입니다. 탭에서 분할하고 길이를 찾고 문자로 다시 변환하고 실행하십시오.

SE는 탭을 각각 4 개의 공백으로 변환하므로 복사 붙여 넣기가 작동하지 않습니다. 당신은 단지 나를 믿어야 할 것입니다 :)


1
이데온에 대한 링크 또는 16 진수 코드 덤프를 제공 할 수 있습니까?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
또한 : exec는 키워드이므로 첫 번째와 마지막 대괄호를 제거하여 2 개의 문자를 절약 할 수 있습니다.
ɐɔıʇǝɥʇuʎs

4

루비 2.0, 122 자

무차별 대입 + 평가! 솔루션이 없을 때 null / 빈 문자열을 반환하는 기준을 아직 충족하지 않습니다. 그것은 무한정 반복됩니다. ~ 3 억 번 반복 한 결과를 찾을 수 없으면 nil을 반환합니다. 충분히 가까이?

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 초까지 다양합니다. 셔플을 얼마나 운이 좋 느냐에 따라 다릅니다!

특히 gsub(/\b0/,'')선행 0을 제거하는 비트에 만족하지 않지만 eval숫자를 8 진 정수로 해석 하지 못하게 할 수있는 유일한 방법이었습니다 .

( 보너스 : eval을 사용하기 때문에 덧셈이 아닌 임의의 루비 표현에 효과적입니다!)


나는 이것을 읽을 때 같은 생각을 가지고 있었지만 ~ 170 자의 코드가 생겼다. 0..9는 10 자리이므로 제한이 10 ** 10이 아니어야합니까? Array # permutation을 사용하여 가능한 모든 매핑을 반복 할 수 있지만 코드가 더 길어질 수 있습니다.
blutorange

@blutorange 나는 몇 개의 문자로 쓸 수있는 큰 숫자이기 때문에 9 ** 9를 선택했습니다. 내가 생각하는 모든 합리적인 테스트 사례에 충분해야합니다! 에 기반한 버전을 시도 permutation하지는 않았지만 주로 코드 길이와 관련이 있습니다.
Paul Prestidge

4

라이브 스크립트 (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

파이썬 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

자바 스크립트 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)

무작위 무차별 대입
시간이 걸릴 수 있습니다 (최고의 샷 CODE+GOLF=GREAT은 3 초, 최악의 3 분입니다).
다음과 같은 간단한 표현으로 시도하십시오A+B=C


2

하스켈, 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 개 문자로, 함께 다른 (15)와 그 수를, 우리는 17 얻을 수 있도록,이 개 순서에 공백이다
975이 많은 것처럼 보일 수 있지만, undergroundmonorail의 파이썬 솔루션은 18,862 문자가 참고, 그들은 그냥 한 줄에 있습니다 :)

짧은 단어 는 http://cjam.aditsu.net/ 에서 실행할 수 있지만 더 긴 단어에는 Java 인터프리터를 사용해야합니다. 내 랩톱에서 Java를 사용하면 SEND+MORE=MONEY30-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

파워 쉘, 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, 118113 바이트

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.