第五回の問題から第五回参考問題(2019.11.3修正)。
問題はこちら->http://nabetani.sakura.ne.jp/hena/ord5railsontiles/
どう書く第27回やE05に似ていますが、二次元の分やや複雑でしょうか。
tile/2は角タイル内のレールの入り口と出口、dir/4は出口から進む方法と次の入り口を示します。
タイル名からなる3x3のリストを作ります。
最初の位置と入り口は決まっていますので、タイル名が合致したtileから出口を選び、
dirで次の位置と入り口をもとめます。
これを繰り返してリストの範囲外に出たら終了です。
%swi-Prolog version 7.4.2
%start.
%:-initialization(start). %ideone
cl([['A','B','C'],['D','E','F'],['G','H','I']]).
tile('0',[u-d,r-l]).
tile('1',[u-r,l-d]).
tile('2',[u-l,r-d]).
dir(d,1,0,u).
dir(r,0,1,l).
dir(A,X,Y,B):-dir(B,X1,Y1,A),Y is -Y1,X is -X1,!.
ltos(_,[],[]).
ltos(C,[(N1,N2)|T],R):-ltos(C,T,R1),nth1(N1,C,L),nth1(N2,L,S),R=[S|R1].
rout(_,N1,N2,_,L,R):-(N1<1;N1>3;N2<1;N2>3),reverse(L,R).
rout(F,N1,N2,M,L,R):-
nth1(N1,M,XL),nth1(N2,XL,Na),tile(Na,Ti),(member(T-F,Ti);member(F-T,Ti)),
dir(T,Y,X,NF),N11 is N1+Y,N21 is N2+X,L1=[(N1,N2)|L],rout(NF,N11,N21,M,L1,R).
map([],L,R):-reverse(L,R).
map(L,LR,R):-map1(3,L,L1,[],R1),LR1=[R1|LR],map(L1,LR1,R).
map1(0,L,L,LR,R):-reverse(LR,R).
map1(N,[H|T],L,L1,R):-L2=[H|L1],N1 is N-1,map1(N1,T,L,L2,R).
solve(L,R):-map(L,[],M),rout(u,1,2,M,[],L1),cl(C),ltos(C,L1,R).
start:-str(S),split_string(S,"\n\s","\s",L),go(L),!.
go([]).
go([_,B,Q|T]):-atom_chars(B,SL),solve(SL,R),disp(R,Q),go(T).
disp(R,Q):-atom_string(R,S),(Q==S->Str=" pass ";Str=" fail "),write(Str),writeln(S).
str("#0 101221102 BEDGHIFEH
#1 000000000 BEH
#2 111111111 BCF
#3 222222222 BAD
#4 000211112 BEFIHEDGH
#5 221011102 BADGHIFEBCF
#6 201100112 BEHIFCBADEF
#7 000111222 BEFIH
#8 012012012 BC
#9 201120111 BEDABCFI
#10 220111122 BADEHGD
#11 221011022 BADG
#12 111000112 BCFIHEBA
#13 001211001 BEFI
#14 111222012 BCFEHIF
#15 220111211 BADEHI
#16 211212212 BCFEBAD
#17 002112210 BEFC
#18 001010221 BEF
#19 100211002 BEFIHG
#20 201212121 BEFCBAD").
次に第三回の問題。だいぶ前に解いた問題です。
問題はこちら->http://nabetani.sakura.ne.jp/hena/ord3ynode/
二次元の問題に見えますが、結局、三点間の接続を必要なだけ並べて、
それをつないでゆく方法しか思いつきませんでしたので、
この方法しかないとすると第27回やE05より単純とも言えます。
%start.
%:-initialization(start). %ideone
d(b,A,_,A).
d(l,A,B,D):-d(r,A,B,C),d(r,C,B,D).
d(r,'B','A','C').
d(r,'A','C','B').
d(r,'C','B','A').
d(r,'A','D','F').
d(r,'D','F','C').
d(r,'C','A','D').
d(r,'B','E','D').
d(r,'E','D','A').
d(r,'F','E','B').
d(r,'A','B','E').
d(r,'B','C','F').
d(r,'C','F','E').
d(r,A,B,C):-d(r,D,B,A),d(r,C,B,D).
solve([],_,_,S,S):-!.
solve([H|T],F,V,S,RS):-d(H,F,V,To),concat(S,To,S1),solve(T,V,To,S1,RS).
start:-str(S),split_string(S,"\n,\s","\s",L0),pre(L0).
pre([]).
pre([_,A,B|T]):-atom_chars(A,L0),solve(L0,'B','A','A',S),disp(B,S),pre(T).
disp(B,S):-atomics_to_string([S],"",S1),(S1==B->write("yes ");write(" no ")),write(S),write("\n").
str("#0 b AB
#1 l AD
#2 r AC
#3 bbb ABAB
#4 rrr ACBA
#5 blll ABCAB
#6 llll ADEBA
#7 rbrl ACADE
#8 brrrr ABEDAB
#9 llrrr ADEFDE
#10 lrlll ADFEDF
#11 lrrrr ADFCAD
#12 rllll ACFDAC
#13 blrrrr ABCFEBC
#14 brllll ABEFCBE
#15 bbbrrlrl ABABEDFCB
#16 rbllrrrr ACABCFEBC
#17 lbrlrrblr ADABCFEFCA
#18 rlbrrrrbl ACFCADFCFD
#19 bllrlrbrrb ABCADEFEBCB
#20 rllrllllbb ACFDEBADEDE
#21 blblrlrrlbr ABCBEDFCABAC
#22 lrlrrrrrbrb ADFEBCFEBEDE
#23 rblllrlrrlrr ACABCADEFDABE
#24 rbrrlrblrllb ACADFEBEFDACA
#25 lrrrlrllrrllr ADFCABEFCADEBC
#26 rrlblllrrlrrb ACBEBADEFDABEB
#27 brbllrrbbrlrll ABEBADFCFCABEFC
#28 rrrbbrlbrlblrb ACBABACFCABADFD
#29 lllllllllllblrr ADEBADEBADEBEFDE
#30 llllllrllrlbrrr ADEBADEFCBADABED").