このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1245853701/660
# [1] 授業単元:情報 
# [2] 問題文(含コード&リンク): 
# パソコン甲子園 2008 予選問題 問7 ふしぎな虫 
# http://www.pref.fukushima.jp/pc-concours/2009/03/pdf/2008yosen.pdf 
2008パソコン甲子園予選問題

ふしぎな虫(_虫,_分後) :-
    atom_chars(_虫,Chars),
    同じ時間の虫変化(0,_分後,[Chars],Chars2),
    atom_chars(_同色の虫,Chars2),!.
ふしぎな虫(_,'NA').

同じ時間の虫の変化(M,_,_) :- M > 10,!,fail.
同じ時間の虫の変化(N,N,_虫ならび) :-
    member(_すべて同色の虫,_虫ならび),
    すべて同じ色(_すべて同色の虫),!.
同じ時間の虫の変化(M,N,_虫ならび) :-
    findall(_変化した虫ならび,
               (   member(_虫,_虫ならび),
                   ふしぎな虫の色変化(_虫,_変化した虫ならび)),L3),
    平坦化(L3,L4),
    同一要素のない整列(L4,L5),
    M2 is M + 1,
    同じ時間の虫の変化(M2,N,L5).

ふしぎな虫の色変化(_虫,_変化した虫ならび) :-
    findall(L2,色違いの2つの体節のペア(_虫,L2),_変化した虫ならび).

色違いの2つの体節のペア([A,B|R1],[C,C|R1]) :- 三色組み合わせ(A,B,C).
色違いの2つの体節のペア([A|R1],[A|R2]) :-
    色違いの2つの体節のペア(R1,R2).

三色組み合わせ(A,B,C) :-
    not(A==B),
    member(C,[r,g,b]),
    not(A==C),
    not(B==C).

すべて同じ色([],_).
すべて同じ色([A|R],A) :- すべて同じ色(R,A).

平坦化([],[]) :- ! .
平坦化([A|R],L) :- A=[_|_],!,平坦化(A,L1),平坦化(R,L2),append(L1,L2,L).
平坦化([A|R],[A|R1]) :- 平坦化(R,R1) .

同一要素のない整列([],[]).
同一要素のない整列([X|Xs],Ys) :-
    同一要素のない分割(Xs,X,Littles,Bigs),
    同一要素のない整列(Littles,Ls),
    同一要素のない整列(Bigs,Bs),
    append(Ls,[X|Bs],Ys) .

同一要素のない分割([],Y,[],[]).
同一要素のない分割([X|Xs],Y,[X|Ls],Bs) :-
    X @< Y,
    同一要素のない分割(Xs,Y,Ls,Bs) .
同一要素のない分割([X|Xs],Y,Ls,[X|Bs]) :-
    X @> Y,
    同一要素のない分割(Xs,Y,Ls,Bs) .
同一要素のない分割([X|Xs],Y,Ls,Bs) :-
    X = Y,
    同一要素のない分割(Xs,Y,Ls,Bs).