問題はこちら->http://nabetani.sakura.ne.jp/hena/ord14linedung/
だいぶ前に書いていたのを一部修正
入力をmanda/3で武器のリストとモンスターのリストに分け、
battle/3でmon/1とパターンマッチさせて、
持っている武器で倒せるモンスターがあれば、モンスターのリストから該当のモンスターを除き、
そのモンスターを倒して得られる武器を持っている武器に加えることをくりかえし、
倒せるモンスターがないか、すべて倒したら終了。
%SWI-Prolog (version 7.4.2)
%start
%:-initialization(start). %ideone
mon(['B',a,c]).
mon(['D',c,e]).
mon(['F',e,g]).
mon(['H',g,i]).
mon(['J',i,k]).
mon(['L',k,a]).
solve(Input,N):-
manda(Input,Arms,Monster),length(Monster,N0),
battle(Monster,Arms,Result),length(Result,N1),N is N0-N1,!.
manda(Input,Arms,Monster):-
atom_chars(Input,Output),
findall(X,(member(X,Output),char_type(X,lower)),Arms),
subtract(Output,Arms,Monster).
battle([],_,[]).
battle(Monster,Arms,Result):-
(member(Arm1,Arms),mon([M,Arm1,Arm2]),select(M,Monster,Monster1)
->(Arms1=[Arm2|Arms],battle(Monster1,Arms1,Result));Result=Monster).
start:-str(S),split_string(S,"\s,\n","\s",L),pre(L),!.
pre([]):-!.
pre([_,B,C|T]):-solve(B,R),number_chars(CN,C),
(R=:=CN->Str=" pass";Str=" fail"),write(Str),write(" "),writeln(R),pre(T).
str("0 gLDLBgBgHDaD 6
1 DBcDLaLgDBH 6
2 JJca 0
3 FJDLBH 0
4 HJBLFDg 6
5 HBaDLFJ 6
6 DJaHLB 2
7 gDLHJF 3
8 cJFgLHD 5
9 FFBJaJJ 1
10 FJeJFBJ 2
11 iJFFJJB 3
12 JBJiLFJF 5
13 JDiFLFBJJ 8
14 BDFDFFDFFLLFFJFDBFDFFFFDDFaDBFFB 28
15 DDFBFcBDFFFFFFLBFDFFBFLFDFDJDFDF 24
16 FDLBFDDBFFFeFFFFFDFBLDDFDDFBFFJF 16
17 FDBFFLFDFFDBBDFFBJDLFgDFFFDFFDFF 0
18 FDiFLDFFFFBDDJDDBFBFDFFFBFFDFLFF 31
19 FDFDJBLBLBFFDDFFFDFFFFFDDFBkFDFF 30
20 HBkFFFFHBLH 3
21 FBHHFFFHLaB 2
22 LFHFBBcHFHF 0
23 LFBHFFeFHBH 7
24 LgFHHHBFBFF 3
25 FFiFHBHLBFH 0
26 BFHHFFHBeFLk 10
27 FHFaBBHFHLFg 5
28 FFgacaFg 0
29 JHDaDcBJiiHccBHDBDH 9
30 FHJJLckFckFJHDFF 12
31 DeDHJHDFHJBLHDLLDHJLBDD 22
32 gJLLLJgJgJLJL 0
33 DaaaDDD 0
34 HFeJFHiBiiBJeJBBFFB 9
35 FJFFJDBHBHaLJBHJHDLHkLLLFFFgJgHJLHkJkB 32
36 giFLBiBJLLJgHBFJigJJJBLHFLDLL 23
37 cgkLJcLJJJJgJc 2
38 LDFHJHcFBDBLJBLFLcFJcDFBL 22
39 JJHHHkHJkHLJk 1
40 kHHBBaBgHagHgaHBBB 11
41 HDBFFDHHHDFLDcHHLFDcJD 20
42 HFFFHeFFee 7
43 gLLDHgDLgFL 1
44 JJJBBaBBHBBHaLBHJ 7
45 FBFBgJBDBDgF 0
46 LLLLakakLakLL 7
47 HeJHeJe 0
48 LDFLBLLeBLDBBFFBLFBB 4").