オフラインどう書く過去問　　　　　　(第3回、5回参考問題)

~~第五回の問題から~~第五回参考問題（2019.11.3修正）。
問題はこちら->http://nabetani.sakura.ne.jp/hena/ord5railsontiles/

どう書く第27回やE05に似ていますが、二次元の分やや複雑でしょうか。
tile/2は角タイル内のレールの入り口と出口、dir/4は出口から進む方法と次の入り口を示します。
タイル名からなる3x3のリストを作ります。
最初の位置と入り口は決まっていますので、タイル名が合致したtileから出口を選び、
dirで次の位置と入り口をもとめます。
これを繰り返してリストの範囲外に出たら終了です。

```Prolog
%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より単純とも言えます。

```prolog
%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").
```