LoginSignup
0
0

More than 5 years have passed since last update.

オフラインどう書くE27参考問題解答

Posted at

問題はこちら->http://nabetani.sakura.ne.jp/hena/orde27ligmir/

box/3で進行方向の変化を記述、d/3で実際の進行先を記述しています。
初期値として進行方向が決まっていますので、d/3で次の升を求め、nth1/3でそこの記号を決め、
box/3で次の進行方向を求め、Rに追加します。
進めない場合は同じ升をRに追加して、停止条件とします。(path/5の一行目)
Pに経路を記録し、循環したら停止します。(path/5の二行目)

%swi-Prolog version 7.4.2
%start.
%:-initialization(start).   %ideone

box('0',u,l):-!.
box('0',r,d):-!.
box('1',u,r):-!.
box('1',l,d):-!.
box(S,X,Y):-(S=='0';S=='1'),box(S,Y,X),!.
box(_,X,X).

d(u,X,X1):-X>5,X1 is X-5.
d(d,X,X1):-X<21,X1 is X+5.
d(l,X,X1):-not(1 is X mod 5),X1 is X-1.
d(r,X,X1):-not(0 is X mod 5),X1 is X+1.
d(_,X,X).

path(_,_,_,R,R1):-R=[X,X|T],reverse([X|T],R1).
path(_,_,P,R,R):-msort(P,P1),not(sort(P1,P1)).
path(L,D1,P,R1,R):-R1=[X1|_],d(D1,X1,X),nth1(X,L,V),P1=[X1;X|P],
    (V==x->path(_,_,P,[X1|R1],R);(box(V,D1,D),R2=[X|R1],path(L,D,P1,R2,R))).

ch(X,Y):-X1 is X+96,atom_codes(Y,[X1]).

solve(L,R):-nth1(N,L,'Y'),path(L,u,[],[N],R1),maplist(ch,R1,R2),sort(R2,R),!.

start:-str(S),split_string(S,"\n,\s","\s",L0),pre(L0).

pre([]).
pre([_,B,C|T]):-atomics_to_string(L,"/",B),maplist(atom_chars,L,L1),flatten(L1,L2),
    solve(L2,R),disp(R,C),pre(T).

disp(R,Q):-atom_chars(S,R),atom_chars(Q1,Q),
    (S==Q1->Str=" pass ";Str=" fail "),write(Str),write(S),write("\n").

str("0       x...x/.1.0./..0../.Y.../0..x.   ghilnqs
1       ..Y../...../...../...../.....   c
2       ..x../..Y../...../...../.....   h
3       ..Y.x/..1x0/11.../....0/1..1.   c
4       ....1/....Y/...../...../.....   ej
5       .10../x.1../x.1x./.Y.1./...0.   bcghlq
6       0.x10/00..x/x0x.0/....0/...Y1   deinsx
7       1.01./01Y.1/..1.1/..10./0.0..   abcfgh
8       x..../x1x../0...0/....Y/.1..0   klmnot
9       ...../..10./.1Y1./.01../.....   hilmnqr
10      ...../..10./x.11./...../..Y..   hilmnrw
11      ...../x.10x/...../x.Y1x/.....   himnqrs
12      ..010/...Y1/..0../0.x../.....   defghij
13      1.0../...../.0x../Y.1x./..1..   abcfhkp
14      ...../101../0.0../..Y../.....   fgklmqrv
15      1.0../00.../.x..0/0.Y1./...10   abcfghmr
16      x101./1..../.Y.x./..01./.00.1   bcghlmrs
17      x11../x.x../.0.01/..x../...Y.   bcglmnsx
18      ..1.0/x0.x./0.0../x...Y/.10.1   cdehjmnot
19      ..x.0/.0.../1..0x/1..1./Y.00.   klmnpqrsu
20      0.1.0/.0.xY/0...0/01..1/x00.x   cdehjmrwx
21      ...0./.0.0./..101/...10/..01Y   mnpqrstwxy
22      10..0/.Y.0./0..1./....x/000..   abfghiklmn
23      10..1/...../.1010/110.1/x..Yx   lmnopqrstx
24      110../....1/x1..x/0.0.0/....Y   bcghlmrsty
25      x.101/1..../..001/010Yx/..1.1   cdehijmnos
26      x.111/x10../...0./00.1x/x.Y.1   ghklmnqrsw
27      11.../....0/11..1/1.1../.Y..1   fghijlmnoqv
28      ...x1/.1.0./11.1./.01../Y..x.   cghiklmnpqru
29      .0.../110x./11..0/01.x./..Y.x   ghklmnopqrtw
30      .01.0/.110x/0...0/.01Y./x.1x.   cdeghilmnqrs
31      .1100/..1.0/1.11Y/0..1./.0..0   hijklmnopqrs
32      1..00/..11./.100./1..Y1/.....   abcdfhikmnps
33      1.0../.11x0/.00.x/Y.10./.10x0   abcfghklmpqr
34      11110/11.../.x.../.0111/0.Y0.   deijnorstwxy
35      ...1./.1.0x/10..0/0Y.11/.0.x0   ghiklmnopqrst
36      ...10/x111./0x.11/.0.../0.0Y.   dehijmnorswxy
37      .1x../.x1.0/0x.x./x11.1/x0Y.1   hijmoqrstvwxy
38      x.x../x110./1.1.0/0.Y.1/0.00x   hiklmnopqrstx
39      ...0./11.00/10..x/..0.1/Y0.10   ghiklmnpqsuvwx
40      .110./....0/x..../.0001/11.Y.   cdfghijmnorstx
41      1.00./....1/.1.../0...0/0..1Y   abcfhkmpqrstwy
42      .1.01/..x../..100/..Y../...01   bcdgilmnoqrstvxy
43      1...0/Y..../...../...../0...1   abcdefjkoptuvwxy
44      x1..0/1..0./.Yx../0...1/.0.1.   bcdefghijklnopqrstvwx
45      1...0/.1.0./..1../..01./Y0..1   abcdefghijklmnopqrstuvwxy").
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0