単語方程式ソルバーを書く[複製]


17

前書き

次の例を考えてみましょう。

  CODE
+ GOLF
——————
 GREAT

これは、各文字が10進数を表し、単語が自然数を表す方程式です(類似した文字は類似した数字を表し、異なる文字は異なる数字を表します)。タスクは、方程式が正しいように、各文字を数字の値と一致させることです。上記の方程式の1つの解決策は次のとおりです。

  9265
+ 1278
——————
 10543

あなたのタスク

あなたの仕事は、上記のような方程式を解くことができるプログラムまたは関数を書くことです。

入力

入力は、次の形式の文字列です。

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

例:

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

スペースは省略され、大文字のAとZの間の文字のみが使用されます(特殊文字や小文字は使用されません)。

この文字列は、標準入力、ファイル、または関数パラメーターから読み取ることができます。

出力

出力形式には次の2つのオプションがあります。

  1. 数字が置換された元の方程式
  2. 文字とその値のリスト

複数のソリューションがある場合、それらのいずれか(ただし1つのみ)が返されます。解決策がない場合、プログラムは空の文字列またはnullを返す必要があります。出力は文字列として返すことができ、標準出力またはファイルに書き込むことができます。

例:

  1. 9265+1278=10543
  2. A=1 B=2 C=3 (任意の区切り文字を使用できます)

ルール

  1. 物事を簡単にするために、数字は0から始まりますが、無効な解決策として先頭に0を付けた数字を処理できます。
  2. 同様の文字は同様の数字を表し、異なる文字は異なる数字を表します
  3. 任意の言語と選択した言語の標準ライブラリを使用できます(外部ライブラリはありません)
  4. インターネット上のリソースに接続することはできません(とにかくどうして?)
  5. これはコードゴルフタスクで、最短のコードが勝ちます。連続する空白文字は単一の文字としてカウントされます。(したがって、空白で書かれたプログラムが自動的に勝ちます)

私は179文字を使用してややハック的なソリューションを持っています。不明な点がある場合は、コメント欄でお尋ねください。


最適な答えは「すべてが0」だと思います。あなたは特にそれを禁止したいかもしれません。
地下

1
すべてが0であることはどういう意味ですか?異なる文字は異なる番号を示す必要があります。
デビッドフランク14年

それを逃した、決して気にしない:)
地下

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値のそれぞれに対して1つのスペースと、それらを区切るタブです。タブで分割し、長さを見つけ、文字に変換して実行します。

SEはタブをそれぞれ4つのスペースに変換するため、コピーペーストは機能しません。あなたは私を信じる必要があります:)


1
ideoneへのリンク、またはコードの16進ダンプを提供できますか?
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1
また:Execがキーワードである、あなたは最初と最後のブラケットを除去することにより、2つの文字を救うことができる
ɐɔıʇǝɥʇuʎs

4

Ruby 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/,'')先行ゼロを削除するビットには特に不満がありますがeval、数字を8進数の整数として解釈することを防ぐことができるのはそれだけです。

ボーナス:evalを使用しているため、単なる加算ではなく、任意のRuby式で機能します!)


これを読んだときも同じ考えでしたが、〜170文字のコードを取得しました。0..9は10桁なので、制限は10 ** 10にすべきではありませんか?Array#permutationを使用して、可能なすべてのマッピングをループできますが、これによりコードが長くなる可能性があります。
blutorange

@blutorange 9 ** 9を選んだのは、数文字で書くことができる大きな数字だったからです。妥当なテストケースには十分すぎるはずです!私はに基づいたバージョンを試していませんpermutationが、あなたが言うように、私は主にコード長に関心がありました。
ポールプレスティッジ14年

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)

ランダムなブルートフォース。
しばらく時間がかかります(私の最高のショット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')]]ました。ソリューションのようなものを印刷し、存在しない場合は印刷し[]ます。これを変更する必要がある場合は教えてください。


この出力は許容範囲内だと思います。
デビッドフランク14年

2

CJam-17

"





























































































































































































































































































































    ""  
"f#3b127b:c~

合計975文字ですが、そのうちの960文字は2シーケンスの空白であるため、2文字としてカウントされ、他の15文字と一緒に17を取得します
。975は多くのように見えるかもしれませんが、 'ただ一行です:)

短い単語の場合は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

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

ゴルフされていないテストスクリプト:

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