Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

第五回の問題から第五回参考問題(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").
smallbigcats
30年以上の日曜プログラマ。 スパゲッティプログラムの癖が抜けません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away