?- 'a##'. p_odai2-212#
このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/212
#  お題:与えられた数列を以下のルールで縮小せよ 
#  (a) 4つ以上連続した数を消す (複数ある場合は一番左を優先する) 
#  (b) (a)を繰り返す 
#  例: 
#  ------- 
#  in : 11233344433331111143322211 
#  out: 
#  11233344433331111143322211 
#  1123334441111143322211 
#  11233344443322211 
#  1123333322211 
#  11222211 
#  1111 
#   
#  ------- 
#  in : 1122224411112222 
#  out: 
#  1122224411112222 
#  114411112222 
#  11442222 
#  1144 
#  ------- 
#  in : 211222211333312 
#  out: 
#  211222211333312 
#  21111333312 
#  2333312 
#  212 
# 
# 

'4つ以上連続した数を消す (複数ある場合は一番左を優先する)'(_数_1,_数_2) :-
        number_chars(_数_1,Chars_1),
        '4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2),
        number_chars(_数_2,Chars_2),!.

'4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2) :-
        '4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3),
        '4要素以上の連続した文字ならびを切り取る'(Chars_3,Chars_2).
'4要素以上の連続した文字ならびを切り取る'(Chars,Chars).

'4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3) :-
        '4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3),
        切り取る(L1,L3,Chars_3).

'4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3) :-
        append(L1,L2,L3,Chars_1),
        all(L2,_文字),
        \+(L3 = [_文字|_]),
        L2 = [_,_,_,_|_],!.

切り取る(L1,L3,Chars_3) :-
        append(L1,L3,Chars_3).

append([],L2,L3,L4) :-
        append(L2,L3,L4).
append([U|L1],L2,L3,[U|L4]) :-
        append(L1,L2,L3,L4).

all([],_).
all([A|R],A) :-
        all(R,A).