リアルタイムオフラインE27問題の解答

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

枚数の多いほうから幅優先探索して、得られた最初の値を答えにすれば早いと思いましたが、
コードがおかしいのか、かえって遅くなりましたので、
深さ優先で、findall/3ですべての値を得、その中の最大値を答えとしています。
まずスートを数字に変換しておいて、ストーリーではランクをソートした後でスートをソート、
カインドではその逆の準備をします。
n枚の役を抽出するには、ストーリーでは、n-1離れた二つの札のスートが同じで、
ランクがn-1違うものを選びます。
カインドではスートとトランクが逆になります。
後は順に残りの札から同様に役を抽出し、得点を合計していきます。

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

point([2:1,3:4,4:9,5:16,6:25,8:49]).

hand([],R,R):-!.
hand(L,S,R):-
     length(L,N),(story(L,N,N1,L1);kind(L,N,N1,L1)),
     point(P),member(N1:N2,P),S1 is N2+S,hand(L1,S1,R).

story(L,N,N,L1):-story1(L,N,L1).
story(L,N,M,L1):-N1 is N-1,N1>=2,story(L,N1,M,L1).

story1(L,N,R):-
     length(L,M),sort(2,@=<,L,L1),sort(1,@=<,L1,L2),N1 is M-N+1,between(1,N1,X),
     N2 is X+N-1,nth1(X,L2,V-Y1),nth1(N2,L2,V-Y2),Y2=:=Y1+N-1,del(L2,X,N,R).
      
kind(L,N,N,L1):-kind1(L,N,L1).
kind(L,N,M,L1):-N1 is N-1,N1>=2,kind(L,N1,M,L1).

kind1(L,N,R):-
     length(L,M),sort(1,@=<,L,L1),sort(2,@=<,L1,L2),N1 is M-N+1,between(1,N1,X),
     N2 is X+N-1,nth1(X,L2,Y1-V),nth1(N2,L2,Y2-V),Y2=:=Y1+N-1,del(L2,X,N,R).

del(R,_,0,R):-!.
del(L,X,N,R):-Y is X+N-1,nth1(Y,L,_,L1),N1 is N-1,del(L1,X,N1,R).

solve(L,R):-findall(R1,hand(L,0,R1),R2),(R2=[]->R=0;max_list(R2,R)).

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

split(S,L):-atomics_to_string(L,",",S).

pre([]).
pre([_,B,[C]|T]):-maplist(atom_chars,B,L),maplist(conv,L,L1),flatten(L1,L2),
     solve(L2,R),disp(R,C),pre(T).

conv([A,B],L):-atom_codes(A,X),X1 is X-65,atom_number(B,B1),L=[X1-B1].

disp(0,A):-!,S='-',disp1(S,A).
disp(R,A):-atom_number(S,R),disp1(S,A).

disp1(S,A):-(A==S->Str=" pass ";Str=" fail "),write(Str),writeln(S).

str("0  A1,A2,A3,A4,B3,C3,D5,E5         11
1       A1,B2,C3,D4,E5,F6,G7,A8         -
2       A3,A5,A4,A6,A7,A1,A2,A8         49
3       G2,G1,A1,F1,C1,E1,B1,D1         26
4       E3,G3,D4,F3,D3,C3,B3,A3         9
5       A1,C1,C2,E3,B1,B2,A2,D3         9
6       D2,E2,C1,B2,C2,B1,A2,A1         20
7       C2,B3,B4,A1,A2,B2,B1,C1         11
8       D1,B1,D3,C3,D2,B2,C1,B3         4
9       C1,F5,F6,B2,C2,D2,F4,C3         -
10      D2,A2,C2,E2,F2,B2,C3,C1         9
11      D6,E7,D8,F7,C7,G7,D7,D5         -
12      B2,B3,B4,D5,D2,D4,D3,C3         -
13      C3,D3,B2,B1,E4,E5,D4,C2         4
14      D3,E4,E2,C1,F4,D2,E3,C2         4
15      B4,C3,D5,C4,A4,C5,B5,B6         4
16      E9,D8,D9,D7,F8,F9,E8,E7         9
17      F9,C9,D7,D9,D8,E7,E9,F8         -
18      D4,C5,B5,B6,D3,D2,D5,B7         11
19      B8,D8,D7,A7,A8,D9,C8,A9         9
20      F3,E3,F7,E5,E6,E4,E7,F6         11
21      A9,G9,B8,A7,G7,C8,A8,G8         9
22      G8,G2,G3,G9,G6,G4,G5,G7         49
23      E9,E1,B9,D1,C9,G9,D9,F9         26
24      B9,B7,G3,A7,G4,B1,B8,B2         4
25      A1,B4,B3,A4,A2,B5,A3,A5         20
26      B3,D3,F3,G2,C3,A3,E3,G3         26
27      E8,D8,E7,D7,G8,G7,F7,F8         18
28      D4,B3,E4,A3,C4,E3,D3,C3         20
29      B7,B5,E4,B6,D4,A4,B4,C4         20
30      B2,B1,B7,C8,F2,B9,B8,F1         -
31      C4,C3,C5,E3,E1,E2,E4,C2         18
32      G1,E1,D1,A1,F1,A2,B1,C1         26
33      E4,C5,C4,B4,D4,D5,E5,F5         18
34      D4,G4,A4,F4,C4,A3,E4,B4         26
35      B3,A9,G4,F4,A8,B4,G8,A3         -
36      B4,E3,F4,E4,G3,A4,G4,F3         9
37      E4,B3,E3,C3,A3,G3,F3,A2         4
38      C5,C4,C6,C8,C1,C2,C7,C3         49
39      C4,D4,E4,F3,E3,F4,D3,G4         20
40      F2,F6,F9,F7,F5,F3,F8,F4         49
41      A9,A3,A8,A2,B9,B8,A7,A1         9
42      G9,A8,G8,A6,A9,G6,G7,A7         18
43      B8,C4,D5,D4,C8,D8,E8,B4         11
44      B1,B2,F6,E4,C1,C2,F4,F5         4
45      B4,B3,B5,B1,B7,B8,B6,B2         49
46      G8,A8,G7,A7,F7,G6,A6,F8         9
47      B7,E7,D7,G7,C7,A7,F7,E8         11
48      F3,D7,B7,D3,C3,G3,E3,D9         -
49      B3,A6,C5,A3,A4,A2,B5,A5         -
50      A8,D6,B8,C8,D7,C7,D8,E8         4
51      B4,D9,C4,E9,E2,G9,F9,D2         11
52      B3,G9,A9,G1,A1,F1,F9,A3         -
53      G1,B1,A2,G2,B2,A1,A4,A3         11
54      A7,A6,C7,B7,B5,G5,A5,F5         4
55      D1,D9,D4,E4,E8,B4,F8,F4         -
56      B4,A8,C8,G8,B7,A3,B3,C7         -
57      D3,G3,D7,F3,D9,B7,E3,C3         -
58      B9,B1,F2,B7,B2,C8,F1,B8         -
59      F6,E4,F4,F5,B1,B2,C1,C2         4
60      A5,G5,B5,B4,G6,C4,G7,A6         -
61      C4,G3,F4,B7,A1,G4,D4,D5         -
62      D7,G2,A4,A3,A7,A5,A6,F7         -
63      F7,E5,E4,E3,E7,F3,F6,E6         11
64      C1,E9,D4,G5,A5,C5,C6,B5         -
65      E4,B6,A4,B4,B7,B5,C4,D4         20
66      G9,B4,D9,D2,E2,C4,F9,E9         11
67      B9,B2,B7,B1,G3,A7,B8,G4         4
68      B2,C1,E7,E6,A2,D2,C2,A1         -
69      A4,B4,F4,G4,E3,G3,E4,F3         9
70      A8,D8,D6,D7,C8,B8,E8,C7         4").
```