※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。
; S E N D + M O R E = M O N E Y
(domain range 0 9)
(int S range)
(int E range)
(int N range)
(int D range)
(int M range)
(int O range)
(int R range)
(int Y range)
(!= S 0)
(!= M 0)
(alldifferent S E N D M O R Y)
(=
(+ (+ (* (+ (* (+ (* S 10) E) 10) N) 10) D)
(+ (* (+ (* (+ (* M 10) O) 10) R) 10) E))
(+ (* (+ (* (+ (* (+ (* M 10) O) 10) N) 10) E) 10) Y))
これだけで、覆面算をやってくれる。
これだけ見ると括弧だらけで、まるでLispみたいだと思うだろう。$ sugar sendmoremoney.csp s SATISFIABLE a S 9 a E 5 a N 6 a D 7 a M 1 a O 0 a R 8 a Y 2 aSATISFIABLEと出ているので、解が存在したことを知らせており、その後ろに書く変数の名前と値がペアになって表示されている。
(domain range 0 9)
0から9の間の整数値に対して、rangeという名前をつける。(int S range)
整数型で定義域がrangeである変数Sを宣言する。(!= S 0)
Sは0でない。
Mも0でない。
(alldifferent S E N D M O R Y)
宣言した変数が互いに異なることを宣言している。
sugarでは、alldifferent はとても良く使われる。
(=
(+ (+ (* (+ (* (+ (* S 10) E) 10) N) 10) D)
(+ (* (+ (* (+ (* M 10) O) 10) R) 10) E))
(+ (* (+ (* (+ (* (+ (* M 10) O) 10) N) 10) E) 10) Y))
これは、とてもごちゃごちゃしているように見えるが、算術計算で普通の記述ができないので長くなっているだけで、下と同じ意味になる。
(((S*10) + E)*10 + N)*10 + D + (((M*10) + O)*10 + R)*10 + E == ((((M*10) + O)*10 + N)*10 + E)*10 + Y以上で、SEND + MORE = MONEY を定義した。