RSS

 

RSS


パ:年賀問題1234567

  • いわいまさか
  • at 2011/1/22 10:05:23

有松さんからパズル年賀状が来た。
有松さんについては参考:パズル:世界選手権とは 日本が個人初優勝、団体準優勝 数字、記号中心 ...

問題:
数字の間にいくつかの記号を入れて、
2011にしてください。
使える記号は、+ - × ÷。
1つの記号を何回使っても良いですし、
使わなくても構いません。
1 2 3 4 5 6 7

というもの。
一旦、手で解こうとしたがうまく解けなかった。
去年の末に似たやつを考えていたのを思い出し、
パ:年賀2011prologでうじうじ
prologで解いてみた。でも、答えが出ない。なんか問題自体ひねってある可能性もわずかながらある。
 

同じ年賀状を受け取ってすでに解いているはずの武さんに聞いてみた。武さんは覆面算の大家、例えば:論理思考パズル 虫食算と覆面算―難易度別200選 大駒 誠一 武 純也

すると、「答えはあったよ」とのこと。

うにゃー、prologのプログラムを見直してみた。

割り算まわりがバグって動いていなかったのだった。恥ずい。

ゼロ割り防止のコードはV2!=0(オブジェクト自体の比較)ではなくてV2=\=0(評価値の比較)とすべきだったのだ。prologの初歩的な落とし穴笑。

このプログラムだとカッコありの答えまでみつけてしまうけど、まぁ、その中にカッコなしの答えもあるハズなのでまぁよしということで。

///////////////////////////

% shisoku

wake(A,B,C) :- A > 10, B is A div 10, C is A mod 10.
wake(A,B,C) :- A > 100, B is A div 100, C is A mod 100.
wake(A,B,C) :- A > 1000, B is A div 1000, C is A mod 1000.
wake(A,B,C) :- A > 10000, B is A div 10000, C is A mod 10000.
wake(A,B,C) :- A > 100000, B is A div 100000, C is A mod 100000.
wake(A,B,C) :- A > 1000000, B is A div 1000000, C is A mod 1000000.
wake(A,B,C) :- A > 10000000, B is A div 10000000, C is A mod 10000000.
wake(A,B,C) :- A > 100000000, B is A div 100000000, C is A mod 100000000.
wake(A,B,C) :- A > 1000000000, B is A div 1000000000, C is A mod 1000000000.
wake(A,B,C) :- A > 10000000000, B is A div 10000000000, C is A mod 10000000000.
wake(A,B,C) :- A > 100000000000, B is A div 100000000000, C is A mod 100000000000.

atai(N,N,N).
% atai(N,V,V) :- V is -(N).

atai(N,V,F):- wake(N,N1,N2),atai(N1,V1,F1),atai(N2,V2,F2),V is V1+V2,F = F1+F2.
atai(N,V,F):- wake(N,N1,N2),atai(N1,V1,F1),atai(N2,V2,F2),V is V1-V2,F = F1-F2.
atai(N,V,F):- wake(N,N1,N2),atai(N1,V1,F1),atai(N2,V2,F2),V is V1*V2,F = F1*F2.
atai(N,V,F):- wake(N,N1,N2),atai(N1,V1,F1),atai(N2,V2,F2),V2=\=0,V is V1/V2,F = F1/F2.

//////////////////

いざ、実行
:- atai(1234567,2011,Y).

答えが出た。1+2345*6/7

めでたし、めでたし。

と思ったが、ちょ待てよと。
割り算を含んでいるので誤差が入るのだった。2011ジャストで目標にすると、漏れがあるかも。

ということで値に範囲を設けて拾ってみると。

taro:- atai(1234567,X,Y),2010.9<X,X<2011.1,
  print(X),print(' '),print(Y),print('\n'),fail.

と定義して、そして、実行

 :-taro.

2011.0 1+2345* (6/7)
2011.0 1+2/3*45*67
2011.0 1+2/ (3/45)*67
2011.0 1+2/3* (45*67)
2011   1+2345*6/7
2011.0 1+2/ (3/45/67)
2011.0 1+2/ (3/ (45*67))
false.

ということで答えは実質2個で
1+2345*6/7の他に
1+2/3*45*67 があった

これを有松さんと武さんに連絡した。

有松さんの作為解は1+2/3*45*67の方だったとのこと。
 この式は先に3で割って途中分数を経由するという妙味あり。

武さんが見つけた解は1+2345*6/7だそうだ。
 こちらの式は4桁数字が現れて7で割るという。

どちらも、珍しい、おもしろい、楽しめた!!!!!



  • コメント (0)
  • トラックバック (0)
トラックバックURL :
http://www.iwai-masaka.jp/tb.cgi/55054