オフラインどう書く第15回の解答

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

掲示板の上下の八個の16進数をそれぞれmap1/2で2進数のリストに直し、
空白の上位桁には0を入れ横につなぎます。
上の升の状態を示すリストと下の升の状態を示すリストができます。
maplistとcal/3で同じ位置の上の升のリストの要素*1+下の升のリストの要素*2を
新しい要素としたリストを作ります。
charは文字のリストです。各要素は、文字:[埋まったマスの情報]です。
埋まったマスの情報は各列上の升だけ->1、下の升だけ->2、上下の升にある->3です。
test/4で掲示板から作ったリストの要素を変数Tmに1個ずつ追加し、できたリストTm1を
char(X),member(P:Tm1,X)で文字のリストと比較します。Pが文字です。0の部分は飛ばします。
該当する文字があれば、もう一つ要素を加えて合致する文字がないか調べます。
あればそちらの方が求める文字、なければ先ほどの文字が求める文字です。
Tmを空にして続行します。
文字の種類が増えれば、testでは部分的に一致した候補に絞り込む必要があるかもしれません。

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

char(['L':[3,2],'R':[3,1],'J':[2,3],'T':[1,3,1],'U':[3,2,3],
    'N':[3,1,3],'S':[2,3,1],'Z':[1,3,2]]).

ntol(X,L):-
    concat_atom(['0x',X],S),atom_number(S,N),ntol1(N,L1),
    length(L1,M),M1 is 4-M,length(L2,M1),maplist(=(0),L2),append(L2,L1,L),!.

ntol1(0,[]).
ntol1(N,L):-N1 is N div 2,ntol1(N1,L1),N2 is N mod 2,append(L1,[N2],L).

mapl(L1,L12):-maplist(ntol,L1,L11),flatten(L11,L12).

cal(X,Y,Z):-Z is X+Y*2.

test([],_,L,R):-
    reverse(L,R).
test([0|T],Tm,L,R):-
    test(T,Tm,L,R).
test([A],Tm,L,R):-
    append(Tm,[A],Tm1),char(X),member(P:Tm1,X),L1=[P|L],test([],_,L1,R).
test([A,H|T],Tm,L,R):-
    append(Tm,[A],Tm1),char(X),member(P:Tm1,X),!,append(Tm1,[H],Tm2),
    (member(Q:Tm2,X)->(L1=[Q|L],T1=T);(L1=[P|L],T1=[H|T])),test(T1,[],L1,R).
test([H|T],Tm,L,R):-append(Tm,[H],Tm1),test(T,Tm1,L,R).

solve(L1,R):-maplist(mapl,L1,[L12,L22]),maplist(cal,L12,L22,L3),test(L3,[],[],R),!.

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

go([]).
go([_,B,Q|T]):-
    concat_atom(L,"/",B),maplist(atom_chars,L,L1),solve(L1,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  2ed8aeed/34b0ea5b       LTRSUNTSJ
1       00000200/00000300       L
2       00018000/00010000       R
3       00002000/00006000       J
4       00000700/00000200       T
5       01400000/01c00000       U
6       00003800/00002800       N
7       000c0000/00180000       S
8       00003000/00001800       Z
9       132eae6c/1a64eac6       LRJTUNSZ
10      637572d0/36572698       ZSNUTJRL
11      baddb607/d66b6c05       LTJZTSSSN
12      db74cd75/6dac6b57       ZZZTJZRJNU
13      3606c2e8/1b0d8358       ZZSSLTJ
14      ad98c306/e6cc6183       UZZZZZZ
15      4a4aaee3/db6eeaa6       JJLLUUNNS
16      ecd9bbb6/598cd124       TSSZZTTRR
17      e0000002/40000003       TL
18      a0000007/e0000005       UN
19      c0000003/80000006       RS
20      40000006/c0000003       JZ
21      01da94db/00b3b6b2       TSUJLRSR
22      76eeaaea/24aaeeae       TRNNUUNU
23      1dacaeee/1566e444       NRJZUTTT
24      26c9ac60/6c6d66c0       JSZLRJZS
25      6c977620/36da5360       ZZLLTNZJ
26      069aeae6/0db34eac       SJSLTUNS
27      06d53724/049da56c       RRULRNJJ
28      069b58b0/04d66da0       RLRSLZJR
29      1b6eced4/11b46a9c       RZZTZNRU
30      522e8b80/db6ad900       JLLJNLJT
31      6546cdd0/376c6898       ZULSZRTL
32      4e6d5b70/6ad9d620       LNSSURST
33      37367772/65635256       SNSZNTNJ
34      25535d58/377669cc       LUUSLTUZ
35      0ae6a55d/0eacedcb       UNSUJUTJ
36      76762edc/23536a88       TZNZJNRT").
```