LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-10-07

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

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

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