2013/02/23

Re: ドラクエVIIのバロックタワーのパズルを解く

これを見て自分でも書いてみた。schemeっちゅーかGaucheです。

元ネタはこれらしい。


書いてみたはいいけど、ドラクエ7やったことないのでよくわからん。ので、コマンドにして表示用のオプションも付けてみた。
 % ./baroque 3 2 2 3  | head
(0 0 0 1 1 2 2 3)
(0 0 0 1 1 2 3 2)
(0 0 0 1 1 3 2 2)
(0 0 0 1 2 1 2 3)
(0 0 0 1 2 1 3 2)
(0 0 0 1 2 2 1 3)
(0 0 0 1 2 2 3 1)
(0 0 0 1 2 3 1 2)
(0 0 0 1 2 3 2 1)
(0 0 0 1 3 1 2 2)
 % ./baroque 3 2 2 3 | wc                      
   1680   13440   30240
 % ./baroque -d 10 2 3 2 3 | wc
    878    7000   15756
 % ./baroque -g 3 2 2 3                        
 <
< V
 V
 % ./baroque -g -r "(0 0 0 1 1 2 2 3)"  3 2 2 3
solve start.
 <
< V
 V
button 0 pushed.
 ^
^ V
 <

button 0 pushed.
 >
> V
 ^

button 0 pushed.
 V
V V
 >

button 1 pushed.
 <
< <
 >

button 1 pushed.
 ^
^ ^
 >

button 2 pushed.
 >
^ >
 V

button 2 pushed.
 V
^ V
 <

button 3 pushed.
 V
> <
 ^
ソースはこちら。
回転方向のリストdirectionsは循環リストにしているので、turn手続きでは常に現在の要素(方向)の次の要素を参照すれば良い。
% rlwrap gosh
gosh> (use srfi-1)
#
gosh> (define directions (circular-list 0 1 2 3))
directions
gosh> (~ directions 0)
0
gosh> (~ directions 3)
3
gosh> (~ directions 4)
0
gosh> (~ directions 7)
3
gosh> (~ directions 100)
0
gosh> (~ directions 101)
1
make-button手続きは回転させる彫像のインデックスを渡してあげれば、それらの彫像を回転させる手続きを返してくれる。
探索手続きsearchでは常にrouteに経路を保存しつつ再帰しているので、routeの要素数を数えれば探索の深さがわかるため、routeの要素数が制限depth-limitに達したら止まる。

そう言えば今日はオライリーのLand of Lispの発売日らしいですね!amazonで予約しとりますがいつ届くのかなー。shiroさん翻訳らしいので、shiroさん節を楽しみにしています。

追記

わさお先輩の

0 件のコメント:

コメントを投稿