これを見て自分でも書いてみた。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さん節を楽しみにしています。
追記
わさお先輩の