このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301553333/7
#  [1] 授業単元:暇つぶし 
#  [2] 問題文(含コード&リンク): 
#  下記のような2chへの書き込み時刻のログを標準入力より受け取り、 
#  EOF がきたら現在の !ninja レベルがいくつであるか出力せよ 
#   
#  !ninja レベルについて 
#  最初の書き込み時にはレベル1である 
#  最後にレベルアップした書き込み時刻から24時間以上経過して書き込むと1レベルアップする 
#   
#  条件1 一番最初の書き込み時刻以前にはクッキーは存在しないものとする 
#  条件2 ●無しとする 
#  条件3 書き込み時刻のログは古いものから順に並んでいるものとする 
#   
#  2011/02/11 22:33:44 
#  2011/02/12 01:23:45 
#  2011/02/14 18:19:20 
#   

'下記のような2chへの書き込み時刻のログを標準入力より受け取り、 EOF がきたら現在の !ninja レベルがいくつであるか出力せよ' :-
        一番最初の書き込み時刻以前にはクッキーは存在しないものとする(_ninja_1),
        get_lines(Lines),
        ninjaレベルの計測(Lines,_ninja_1,_ninja),
        writef('現在の !ninja レベルは %t です\n',[_ninja]),!.

ninjaレベルの計測([],_ninja,_ninja) :- !.
ninjaレベルの計測([_],_ninja,_ninja) :- !.
ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :-
        '24時間以上経過'(_時刻_1,_時刻_2),
        _ninji_2 is _ninja_1 + 1,
        ninjaレベルの計測([_時刻_2|R],_ninja_2,_ninja),!.
ninjaレベルの計測([_時刻_1,_時刻_2|R],_ninja_1,_ninja) :-
        \+('24時間以上経過'(_時刻_1,_時刻_2)),
        ninjaレベルの計測([_時刻_2|R],_ninja_1,_ninja),!.

一番最初の書き込み時刻以前にはクッキーは存在しないものとする(1).

'24時間以上経過'(_時刻_1,_時刻_2) :-
        sub_atom(_時刻_1,0,10,_,_年月日_1),
        sub_atom(_時刻_2,0,10,_,_年月日_2),
        sub_atom(_時刻_1,11,8,_,_時分秒_1),
        sub_atom(_時刻_1,11,8,_,_時分秒_2),
        '24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2),

'24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :-
        _年月日_1 @< _年月日_2,
        _時分秒_1 @=< _時分秒_2,!.
'24時間以上経過診断'(_年月日_1,_年月日_2,_時分秒_1,_時分秒_2) :-
        \+(_月末日(_年月日_1)),
        _時分秒_1 @> _時分秒_2,
        翌日(_年月日_1,_翌日_1),
        _翌日_1 @< _年月日_2,!.

翌日(_年月日,_翌日の表示表現) :-
        sub_atom(_年月日,0,4,_年),
        sub_atom(_年月日,5,2,_月),
        sub_atom(_年月日,8,2,_日),
        翌日(_年,_月,_日,_翌日の表示表現).

翌日(_年,'12','31',_翌日の表示表現) :-
        atom_to_term(_年,_年整数,_),
        _年整数_2 is _年整数 + 1,
        concat_atom([_年整数_2,/,'01',/,'01'],_翌日の表示表現),!.
翌日(_年,_月,_日,_翌日の表示表現) :-
        月末日(_月,_日),
        次の数字に対応する二文字の頭部零文字列(_月,_翌月),
        concat_atom([_年,/,_翌月,/,'01'],_翌日の表示表現),!.
翌日(_年,_月,_日,_翌日の表示表現) :-
        \+(月末日(_月,_日)),
        次の数字に対応する二文字の頭部零文字列(_日,_翌日),
        concat_atom([_年,/,_翌月,/,_翌日],_翌日の表示表現),!.

次の数字に対応する二文字の頭部零文字列(_数値文字列,_次の数値文字列) :-
        length(L,2),
        atom_to_term(_数値文字列,_整数,_),
        _整数_2 is _整数 + 1,
        number_chars(_整数_2,Chars),
        append(L0,Chars,L),
        all(L0,'0').

月末日(_年,'02','29') :-
        atom_to_term(_年,_年整数,_),
        うるう年(_年整数),!.        
月末日(_年,'02','28') :-
        atom_to_term(_年,_年整数,_),
        \+(うるう年(_年整数)),!.        
月末日(_年,_月,30) :-
        append(_,[_月|_],['04','06','09','11']),!.
月末日(_年,_月,31) :-
        append(_,[_月|_],['01','03','05','07','08','10','12']),!.

うるう年(_年) :-
        0 is _年 mod 400,!.
うるう年(_年) :-
        0 is _年 mod 100,!,
        fail .
うるう年(_年) :-
        0 is _年 mod 4,!.
うるう年(_年) :-
        \+(0 is _年 mod 4),
        fail.