オフラインどう書くE07の解答

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

test/4が候補の数字の選択、gen/3で最小値と最大値を作っています。
空白（すべてのランプが非点灯）を'J'で表しています。
gen(A,B,C)は
A->パネルの数字の候補（含空白）のリストのリスト,
B->最小値のリストと最大値のリストの経過中の値,
C->最小値のリストと最大値のリストの戻り値
となっています。

ランプの数字が2の倍数ですので、ビット論理演算ができます。
パネルの数字のビット表示をA、点灯しているランプのビット表示をB、
非点灯のランプのビット表示をCとすると、BはAに含まれるのでA or B = A、
CはAとは重ならないのでA and C = 0となります。
testでこの両方を満たすパネルの数字を選んでリストにしています。

最小値と最大値は基本的には前から順にセグメントの値を求めるのですが、
0は数字のリストの最初に来ないが、最後のパネルは例外。
最小値の場合最初から空白が含まれている場合空白を選ぶが最後のパネルは例外。
候補が数字しかないパネル（当然最小の数字を選ぶ）の後はすべて数字を選ぶ。
その時候補が空白しかないパネルが現れたら表示されている可能性がある数値がひとつもない。
最大値の場合最大の数を選ぶが、候補が空白だけのパネルが出現したら、上位桁がリセットされる。

具体的にはgenで
最小値のリストが空
　候補に空白を含むパネルが来たら最大値のみ選ぶ。
　空白以外の候補がなければ上位桁リセット。
最小値のリストが空でなければ
　空白以外の数字を選ぶ。
　空白以外の候補がなければ、表示されている可能性がある数値がひとつもない。

genの4節目はなくても10節目を通って2節目に行くのでokです。

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

su(['J':0x0,'0':0x3f,'1':0x06,'2':0x5b,'3':0x4f,'4':0x66,'5':0x6d,
   '6':0x7d,'7':0x27,'8':0x7f,'9':0x6f]).

ston(X,N):-concat_atom(['0x',X],Z),atom_number(Z,N).

gen([],R,R).
gen([[]|_],_,[[],[]]):-!.
gen([['J']|T],[[],_],R):-
   !,gen(T,[[],[]],R).
gen([['J']|_],_,[[],[]]):-!.
gen([['J'|T]],L,R):-
   !,gen([T],L,R).
gen([['J'|T1]|T2],[[],LL],R):-
   !,last(T1,Z),append(LL,[Z],LL1),gen(T2,[[],LL1],R).
gen([['J'|T1]|T2],[SL,LL],R):-
   !,gen([T1|T2],[SL,LL],R).
gen([['0'|T]],[[],LL],[['0'],LL1]):-
   !,last(['0'|T],Z),append(LL,[Z],LL1).
gen([['0'|T1]|T2],[[],LL],R):-
   !,gen([T1|T2],[[],LL],R).
gen([[H|T1]|T2],[SL,LL],R):-
   append(SL,[H],SL1),last([H|T1],Z),append(LL,[Z],LL1),gen(T2,[SL1,LL1],R).

cal(L21,L):-L is 0x7f-L21.

test(_,[],[],[]).
test(L,[H1|T1],[H2|T2],R):-test(L,T1,T2,R1),test1(L,H1,H2,R2),R=[R2|R1].

test1([],_,_,[]).
test1([N:H|T],X,Y,R):-test1(T,X,Y,Z),((H \/ X =:= H,H /\ Y=:=0)->R=[N|Z];R=Z).

solve([L1,L2],R):-
   maplist(ston,L1,L11),maplist(ston,L2,L21),
   su(L),test(L,L11,L21,R0),gen(R0,[[],[]],R). % one pass de kotae wo dasu


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

go([]).
go([_,B,C|T]):-concat_atom(B1,",",B),maplist(mtoa,B1,L),solve(L,R),disp(R,C),go(T).

disp(R,Q):-
   (R=[[],[]]->S="-";(maplist(atomics_to_string,R,R1),atomics_to_string(R1,",",S))),
   (Q=S->Str=" pass ";Str=" fail  "),write(Str),writeln(S).

mtoa(L,R):-concat_atom(R,":",L).
str("0  06:4b:46:64:6d,79:20:10:10:02   12345,13996
1       41:00,3e:01     -
2       00:00,79:79     1,11
3       02:4b:46:64,20:20:10:10         1234,3399
4       06:2f:3f:27,40:00:00:40         1000,7987
5       00:3d:2d:26,00:00:00:00         600,9899
6       40:20:10,00:00:00       200,998
7       00:00:00,40:20:10       1,739
8       08:04:02:01,00:00:00:00         2000,9999
9       00:00:00:00,08:04:02:01         1,7264
10      08:04:02:01,01:02:04:08         -
11      04:02:01,02:04:08       527,627
12      04:02:01:40:10,02:04:08:10:20   52732,62792
13      00:30:07,00:01:10       -
14      37,00   0,8
15      3f,40   0,0
16      3f:3f,40:40     -
17      00:3f,40:40     0,70
18      00:3f,38:00     0,18
19      18,07   -
20      08,10   3,9
21      42,11   4,4
22      18,05   -
23      10:00,0b:33     -
24      14:02,00:30     61,83
25      00:1a,3d:04     2,2
26      00:28,38:40     0,10
27      20:08:12,4f:37:24       -
28      02:4c:18,00:00:04       132,992
29      4a:7a:02,10:00:30       381,983
30      00:00:06,0b:11:08       1,47
31      04:20:2c:14,39:08:50:09         -
32      02:06:02:02,00:31:18:11         1111,9174
33      00:04:48:50,03:02:20:02         526,636
34      00:58:42:40,00:20:08:12         245,9245
35      08:08:60:00:32,76:67:02:16:04   -
36      00:00:00:08:02,06:1a:3b:20:11   21,34
37      08:58:12:06:12,10:20:20:00:04   32202,92292
38      00:10:74:4e:10,10:04:02:00:24   2632,92692
39      44:76:0a:00:0c:44,39:08:11:09:02:11     -
40      00:00:44:0a:04:00,79:06:02:04:79:28     5211,6211
41      30:02:02:2c:0e:02,00:08:04:02:20:01     612531,872634
42      00:00:04:10:00:60,25:19:01:02:24:00     1624,44629
43      04:18:54:38:00:14:70,10:65:09:01:6c:00:0d       -
44      18:04:26:20:04:24:1a,02:21:50:48:02:08:00       6177540,6177678
45      00:08:34:00:00:64:06,18:24:02:00:61:08:61       260141,7269141
46      00:02:0a:04:4a:00:20,18:21:24:02:04:60:19       125214,7126214").
```