リアルタイムどう書く過去問(E13)


問題はこちら->http://nabetani.sakura.ne.jp/hena/orde13hextet/
以前書いていたのを修正したものです。
まず座標(のようなもの)をどうするかですが、
問題のアルファベットのアスキーコードに、二列目は10,三列目は20....と足して、
右上の六角形との差が14、左上との差が15、隣との差が1となるようにしてみました。
それぞれのテトロミノは、基準とした任意の六角形と他の六角形間の経路で表しました(p/2)。
またrot/6で基本形を回転した図形を作っています。
一致する図形の存在のみが問題ですので、重複は無視しています。
調べる図形は、select/3で4つの六角形の順列を作り、一致する図形が見つかるまで、
ok/3で突き合わせています。
同じ組み合わせで順番が違う突き合わせをしていて効率は悪いですが、速度は問題ありません。

ston([X],X):-X<102,!.
ston([X],Y):-X<106,!,Y is X+10.
ston([X],Y):-X<111,!,Y is X+20.
ston([X],Y):-X<115,!,Y is X+30.
ston([X],Y):-Y is X+40.

l(X,N,Y):-Y is X+N.         %経路

rot(P1,P2,P3,PN1,PN2,PN3):-rot1(P1,PN1),rot1(P2,PN2),rot1(P3,PN3),!.
rot1([],[]):-!.
rot1([H|L],NL):-m(H,H1),rot1(L,L1),NL=[H1|L1] .

ok(A,[T],B):-l(A,T,B),!.      %相互の関係を満たすピースがあるか
ok(A,[H|T],B):-l(A,H,C),ok(C,T,B).

solve2(H,P1,P2,P3):-select(A,H,L1),select(B,L1,L2),ok(A,P1,B),
                    select(C,L2,[D]),ok(A,P2,C),ok(A,P3,D),!.

solve1(_,_,_,_,0):-!,fail.
solve1(H,P1,P2,P3,N):-
      solve2(H,P1,P2,P3);
      (rot(P1,P2,P3,PN1,PN2,PN3),N1 is N-1,solve1(H,PN1,PN2,PN3,N1)).

solve(H,P):-p(P,[P1,P2,P3]),solve1(H,P1,P2,P3,6),!.
solve(_,"-"):-!.

solve0(B3,C,R):-solve(B3,R),(R==C->write("pass ");write(" fail ")),writeln(R),!.

pre([]):-!.
pre([_,B,C|T]):-
    atom_chars(B,B1),maplist(atom_codes,B1,B2),maplist(ston,B2,B3),solve0(B3,C,R),pre(T).

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

%start.

p("B",[[-15],[15],[1]]).     %基本の図形のピース相互の関係
p("D",[[14],[-1],[-14]]).
p("I",[[-1],[1],[1,1]]).
p("J",[[-1],[-14],[-14,-14]]).
p("L",[[1],[-15],[-15,-15]]).
p("N",[[14],[1],[1,15]]).
p("O",[[-14],[1],[15]]).
p("S",[[-15],[1],[1,15]]).
p("Y",[[-15],[1],[14]]).
p("Z",[[14],[1],[1,-14]]).

m(1,-14).  % 60度反時計回りのmove
m(-14,-15).
m(-15,-1).
m(-1,14).
m(14,15).
m(15,1).

str("0       glmq    B
1       fhoq    -
2       lmpr    N
3       glmp    Y
4       dhkl    J
5       glpq    D
6       hlmq    O
7       eimq    I
8       cglp    S
9       chlq    Z
10      glqr    L
11      cdef    -
12      hijk    -
13      kpqu    B
14      hklm    B
15      mqrw    B
16      nrvw    B
17      abfj    B
18      abcf    B
19      mrvw    D
20      ptuv    D
21      lmnr    D
22      hklp    D
23      himr    D
24      dhil    D
25      hlpt    I
26      stuv    I
27      bglq    I
28      glmn    J
29      fghm    J
30      cdgk    J
31      lpst    J
32      imrw    J
33      dinr    J
34      cdin    L
35      eghi    L
36      cdeg    L
37      bgko    L
38      eimr    L
39      jotu    L
40      kotu    N
41      lqtu    N
42      cdim    N
43      klot    N
44      kloq    N
45      kmpq    N
46      qrvw    O
47      mnqr    O
48      kopt    O
49      mnpq    S
50      bfko    S
51      chin    S
52      hmnq    Y
53      nqrw    Y
54      bchi    Z
55      inrw    Z
56      cfgj    Z
57      jnpv    -
58      flmp    -
59      adpw    -
60      eilr    -
61      bejv    -
62      enot    -
63      fghq    -
64      cjms    -
65      elov    -
66      chlm    D
67      acop    -
68      finr    -
69      qstu    L
70      abdq    -
71      jkln    -
72      fjkn    -
73      ijmn    -
74      flqr    -").