オフラインリアルタイムどう書くの過去問（E03）

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

オフラインリアルタイムどう書くの過去問で、
40角形の周りに多数の6角形が相互に接し、その凸頂点の数を調べる問題です。
図形が面白く、単純そうでもあり複雑そうでもありますので挑戦してみました。
凸頂点は多角形が接していない部分ですので、重複していない頂点のみ残します。
座標を使うのだろうがどうすればよいか考えながら暫時眺め床に入ったところ、
夜中に目覚めて、円座標を使えばよいことに気が付きました。
角度座標は、単位を360/40=9度にとれば、0と39以下の自然数で表せます。
solve/4のLはすべての頂点を保持、Reは重複のない頂点を保持します。
6角形はcheck1/5で、40角形はcheck2/5で調べます。

```prolog
forty(L):-forty(39,L),!.
forty(-1,[]).
forty(N,L):-forty(N1,L1),N is N1+1,(is(0,mod(N,2))->L=[(1,N)|L1];L=[(2,N)|L1]).
hex(R00,A,L):-
       atom_codes(A,S0),atom_number(R00,R0),R is R0*2-1,plus(R,1,R1),plus(R1,1,R2),plus(R2,1,R3),
       s(S0,R0,S),pms(S,1,S1),pms(S,-1,S2),L=[(R,S),(R1,S1),(R1,S2),(R2,S1),(R2,S2),(R3,S)].

s(S0,R0,S1):-S is (S0-97)*2+R0-1,S1 is S mod 40.
pms(S,X,S1):-S1 is (S+X) mod 40.

solve([],_,R,R).
solve([R0,A|T],L,RL,Re):-
       (R0=='0'->(forty(V),check2(V,L,L1,RL,RL1));
       (hex(R0,A,V),check1(V,L,L1,RL,RL1))),solve(T,L1,RL1,Re).

check1([],L,L,R,R).
check1([H|T],L0,L,R0,R):-
       (member(H,L0)->(L1=L0,delete(R0,H,R1));
       (append(L0,[H],L1),append(R0,[H],R1))),check1(T,L1,L,R1,R). 

check2([],L,L,R,R).
check2([H|T],L0,L,R0,R):-
       (member(H,L0)->(L1=L0,delete(R0,H,R1));(append(L0,[H],L1),
       (H=(1,_)->R1=R0;append(R0,[H],R1)))),check2(T,L1,L,R1,R).

del([],V,V).
del([H|T],V,R):-del(T,V,V1),delete(V1,H,R).

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

go([]):-!.
go([A,B,C|T]):-
       atom_chars(B,L),solve(L,[],[],R),length(R,N),number_chars(N1,C),
       (N==N1,Str="good ";Str=" bad "),write(" "),write(Str),writeln(N),go(T).

str("0       1a2t3s2s        11
1       1a1c1d00        22
2       00      20
3       3q      6
4       3t2a    8
5       3t3a    8
6       3t4a    12
7       004q2g  32
8       4c2g2k4i        24
9       1o1a4f4i1t      26
10      4t3a4g2a2o2p    24
11      4i4o3i3c3n3h2c  30
12      4m3n3m002b1b3a  34
13      001b2a3t4s3s2s1s        27
14      1n1j3o4o1h2n2r1k        36
15      4o2a2j1m2e4l2l3m3o      42
16      1j2p1a4r4b1i3h4e3i2i    42
17      001a1c1e1g1i1k1m1o1q1s  30
18      3n2j3e3a2n1f1p2q3t4t3h  53
19      4a4b4c3d2e1e1d1c3a2a1b  22
20      3n3e3t4i3m2d2g3i1j4o2i4t        52
21      3t2m4n2l4g4h1a1n2t4m2h3a1m      44
22      1p1i2n3q1d2o2c1q3m3f003k3l2s    53
23      3r1q3p2d4k4n1r3o4l2j2c1a4o3q4f  56
24      4d2f4r3f2p4t1j1p4g1q4f1k2j2s4i4j        62
25      002c2d1f2f3e4d4c4b4a3a1b2t1t2a2g1h      40
26      3r2i2j3d2t3j3g2s1p2o2p1n1m2d1k1r3i      59
27      4o4s1i4p3p3s3b4n3r1k4a3t4g3n1o2m3i2o    66
28      3k2j1i2p2n3l2f2s3f1n4s2h3s1l1m4n4k4q2k  65
29      1a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t        40
30      4n3f1c1a3o2s1h2p2k3g3n2e4s2t1j1b3h2a1n3k        73
31      1a1b1c1d1e1f1g1h1i1j1k1l1m1n1o1p1q1r1s1t00      20
32      2a2b2c2d2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t00      60
33      2m1p2c2o2n4n002s1m3i2t4l2b3r2h1j4q1c4t1s1a      65
35      1c004g1k4o3p3l3h1r4d2t2c2d1n4t2e1s1j2p1d4j1h1f  74
36      1s3j4a4h3h3q3n3b3f2m3o3c4i3r2r1f1c2p4s1e3a2j2o3e        80
37      2c1b3b3k2f1e4q1d1m4n3t4b4s3h3d3g3n1f4p4j2e4f4c3e1k      78
38      2p4k3t1h4e1n3g4p2j1a1k1p4f1o3a4s4q4i3p2t4l3k2k3s2r4h    77
39      1d1p4o3n3m4d1m2f3c1o3f3g3a2o1f4n2c4e2j4p4f1b1j1i1k1h2m  74
40      3m4d4e1i3t4f1f3n2p2g1q4g2c2m1s2r2i3f3o1h3g2e1o3a4r3h3r4o        75      ").
```