0
0

More than 3 years have passed since last update.

オフラインリアルタイムどう書くE13 の問題

Last updated at Posted at 2017-10-04

ちょっと前の問題です。
問題はこちら->http://nabetani.sakura.ne.jp/hena/orde13hextet/
データ数がそれほど多くないので力づくで解きました。
assertを使いっぱなしにしていますのでご注意を。

% Date: 2017/08/29
%六角形のテトロミノ(へなちょこ)

solve:-data(D),rot0,solve(D),!.
solve([]).
solve([H|T]):-p(P,[P1,P2,P3]),member(A,H),delete(H,A,L1),member(B,L1),
              ok(A,P1,B),delete(L1,B,L2),member(C,L2),
              ok(A,P2,C),delete(L2,C,[D]),ok(A,P3,D),
              R=[P,A,B,C,D],write(P),solve(T).
solve([_|T]):-write("-"),solve(T).

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

rot0:-p(P,[P1,P2,P3]),rot(P,P1,P2,P3,5),fail. %回転した図形をassert
rot0.                                          %問題が存在の有無なので重複はチェックしない
rot(_,_,_,_,0):-!.
rot(P,P1,P2,P3,N):-rot1(P1,PN1),rot1(P2,PN2),rot1(P3,PN3),
                   B=p(P,[PN1,PN2,PN3]),assert(B),
                   N1 is N-1,rot(P,PN1,PN2,PN3,N1).
rot1([],[]).
rot1([H|L],NL):-m(H,H1),rot1(L,L1),NL=[H1|L1] .

p(b,[[lu],[rd],[r]]).     %元の図形のピース相互の関係
p(d,[[ld],[l],[ru]]).
p(i,[[l],[r],[r,r]]).
p(j,[[l],[ru],[ru,ru]]).
p(l,[[r],[lu],[lu,lu]]).
p(n,[[ld],[r],[r,rd]]).
p(o,[[ru],[r],[rd]]).
p(s,[[lu],[r],[r,rd]]).
p(y,[[lu],[r],[ld]]).
p(z,[[ld],[r],[r,ru]]).
m(r,ru).  % 60度反時計回りのmove
m(ru,lu).
m(lu,l).
m(l,ld).
m(ld,rd).
m(rd,r).
l(X,l,Y):-l(Y,r,X).            %経路
l(X,ld,Y):-l(Y,ru,X).
l(X,lu,Y):-l(Y,rd,X) .
l(X,r,Z):-l(X,ru,Y),l(Y,rd,Z).
l(X,r,Z):-l(X,rd,Y),l(Y,ru,Z) .
l(a,rd,f).
l(f,ru,b).
l(b,rd,g) .
l(g,ru,c).
l(c,rd,h).
l(h,ru,d) .
l(d,rd,i).
l(i,ru,e).
l(j,ru,f) .
l(f,rd,k).
l(k,ru,g).
l(g,rd,l).
l(l,ru,h).
l(h,rd,m).
l(m,ru,i).
l(i,rd,n).
l(j,rd,o).
l(o,ru,k).
l(k,rd,p).
l(p,ru,l).
l(l,rd,q).
l(q,ru,m).
l(m,rd,r).
l(r,ru,n).
l(s,ru,o).
l(o,rd,t).
l(t,ru,p).
l(p,rd,u).
l(u,ru,q).
l(q,rd,v).
l(v,ru,r).
l(r,rd,w).

data([[g,m,l,q],[f,h,o,q],[h,k,l,p],[h,k,l,m],[e,i,m,q],[g,l,q,r],[k,p,q,u],
      [u,t,s,v],[q,r,v,w],[n,q,r,w],[c,g,l,p],[c,h,l,q],[l,m,p,r],[d,h,k,l]]).

2021.02.18今更ですが
https://qiita.com/smallbigcats/items/77ee33dd8d4ebe37d025
からの参照先となるコードが抜けていたので追加。

%:-initialization(start).  %ideone
% start.
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),!.

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    -").
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