このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1294061094/666
#  [1] 授業単元:  
#  [2] 問題文: http://ime.nu/ux.getuploader.com/sanada1678/download/17/%E3%82%B3%E3%83%94%E3%83%BC+%EF%BD%9E+%E8%AA%B2%E9%A1%8C.csv 
#  
#  ある駐車場が昼間20分100円の料金で駐車場を貸しています。
#  左のデータは入出庫のデータです。
#  駐車時間の長さの分類はおもに
#  20分,40分,1時間,2時間,6時間,12時間,24時間以上
#  です。これをもとに次の問題を解決せよ。
#  
#  毎時00分時点での(つまり1時間ごとの)
#  駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。
#  
#  1.1時間の間(たとえばその日の13時から14時)に入場してきた車の台数
#    その時間内に清算して出場して行った台数を自動計算するように表計算の
#    プログラムを作成せよ。その結果として、00分時点での駐車台数が自動計算できる
#    ようにプログラムを作成せよ。
#  
#  2.一定期間内(例えば1日や一週間と特定して)での
#     駐車時間の長さで分類した台数
#     たとえば 30分以内,1H,2H,6H,12H,24H以上
#    が自動計算できるようにプログラムを作成せよ。
#  
#  3.とりあえず最初に駐車していた台数を0台として表を作成せよ。
#    それが出来たら最初に駐車していた台数を任意に設定することで
#    その後の駐車している台数を自動計算できるように表を作成せよ。
#  
#  11月、12月などのデータを入力しても瞬時に計算できるようにしておく。
#  夜間の駐車料金などもデータから推測せよ。
#  
#  2010/10/31 20:38,2010/10/31 23:24,,300,300,,,,,,,,,
#  2010/10/31 10:47,2010/10/31 22:12,,600,600,,,,,,,,,
#  2010/10/31 12:25,2010/10/31 22:06,,600,600,,,,,,,,,
#  2010/10/31 19:13,2010/10/31 21:52,,500,500,,,,,,,,,
#  2010/10/31 18:49,2010/10/31 21:50,,600,600,,,,,,,,,
#  2010/10/31 15:30,2010/10/31 21:45,,600,600,,,,,,,,,
#  2010/10/31 10:06,2010/10/31 21:37,,600,600,,,,,,,,,
#  2010/10/30 21:57,2010/10/31 21:32,,600,600,,,,,,,,,
#  2010/10/31 13:02,2010/10/31 21:29,,600,600,,,,,,,,,
#  2010/10/31 20:25,2010/10/31 21:16,,100,100,,,,,,,,,
#  2010/10/30 21:19,2010/10/31 21:02,,600,600,,,20,,,,,,
#  2010/10/31 9:43,2010/10/31 20:53,,600,600,,,,,,,,,
#  2010/10/31 17:45,2010/10/31 20:43,,600,600,,,,,,,,,
#  2010/10/31 18:38,2010/10/31 20:38,,600,600,,,00,,,,,,
#  2010/10/29 6:53,2010/10/31 20:23,,1800,1800,,,,,,,,,
#  2010/10/31 8:04,2010/10/31 19:53,,600,600,,,,,,,,,
#  2010/10/31 5:32,2010/10/31 19:25,,600,600,,,,,,,,,
#  2010/10/31 12:19,2010/10/31 19:15,,600,600,,,,,,,,,
#  2010/10/31 5:53,2010/10/31 19:09,,600,600,,,00,,,,,,


/*
'ある駐車場が昼間20分100円の料金で駐車場を貸しています。'.
*/

'左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび) :-
        get_split_lines(_入出庫データファイル,[','],_入出庫データならび).

/*

'駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :-
        駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻).

'駐車時間の長さの分類はおもに20分,40分,1時間,2時間,6時間,12時間,24時間以上です。'(_駐車開始時刻,_駐車終了時刻,_駐車時間) :-
        \+(駐車時間は同一日である(_駐車開始時刻,_駐車終了時刻)).
*/

'毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(_毎時00分時点での駐車している駐車台数ならび) :-
        '左のデータは入出庫のデータです。'(_入出庫データファイル,_入出庫データならび),
        '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算するように表計算のプログラムを作成したい。'(_入出庫データならび,_毎時00分時点での駐車している駐車台数ならび).

'毎時00分時点での(つまり1時間ごとの)駐車している駐車台数を自動計算する'(LL,LL2) :-
        findsetof([_年,_月,_日,_時],(
                    append(_,[L|R1],LL),
                    発生した年・月・日・時(L,_年,_月,_日,_時)),
                  LL1),
        findall([_年,_月,_日,_時,_駐車台数],(
                    append(_,[[_年,_月,_日,_時]|_],LL1),
                    '毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数)),
                LL2).

発生した年・月・日・時([_時刻|_],_年,_月,_日,_時) :-
        split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]).
発生した年・月・日・時([_,_時刻|_],_年,_月,_日,_時) :-
        split(_時刻,[' ','/',':'],[_年,_月,_日,_時|_]).

'毎時00分時点での(つまり1時間ごとの)駐車している駐車台数'(LL,_年,_月,_日,_時,_駐車台数) :-
        count((
                    member([A,B|_],LL),
                    split(A,['/',' ',':'],LA),
                    split(B,['/',' ',':'],LB),
                    LA @=< [_年,_月,_日,_時,0],
                    LB @>= [_年,_月,_日,_時,0]),
               _駐車台数),!.

'1時間の間(たとえばその日の13時から14時)に入場してきた車の台数その時間内に清算して出場して行った台数を自動計算する'(LL,_年,_月,_日,_時,_入場車数,_出場車数) :-
        count((
                    member([A|_],LL),
                    split(A,['/',' ',':'],LA),
                    LA @>= [_年,_月,_日,_時,0],
                    LA @=< [_年,_月,_日,_時,59]),
               _入場車数),
        count((
                    member([_,A|_],LL),
                    split(A,['/',' ',':'],LA),
                    LA @>= [_年,_月,_日,_時,0],
                    LA @=< [_年,_月,_日,_時,59]),
               _出場車数),!.

'一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :-
        '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(LL,_時刻下限,_時刻上限,0,0,0,0,0,0,0,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上).

'一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([],_時刻下限,_時刻上限,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :- !.
'一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([[_入場時刻,_出場時刻|_]|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :-
        split(_入場時刻,[' ','/',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]),
        split(_出場時刻,[' ','/',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]),
        [_年_1,_月_1,_日_1,_時_1,_分_1] @>= _時刻下限,
        [_年_2,_月_2,_日_2,_時_2,_分_2] @=< _時刻上限,
        入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位),
        時間差単位(_時間差分単位,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_2H_2,_2H_2,_6H_2,_22H_2,_24H_2,_24H以上_2),
        '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_2,_1H_2,_2H_2,_6H_2,_12H_2,_24H_2,_24H以上_2,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上).
'一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'([_|R],_時刻下限,_時刻上限,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内,_1H,_2H,_6H,_12H,_24H,_24H以上) :-
        '一定期間内(例えば1日や一週間と特定して)での駐車時間の長さで分類した台数たとえば30分以内,1H,2H,6H,12H,24H以上を自動計算する'(R,_時刻下限,_時刻上限,_30分以内_1,_1H_1,_1H_1,_6H_1,_12H_1,_14H_1,_14H以上_1,_30分以内,_1H,_1H,_6H,_12H,_14H,_14H以上).


時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_2,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :-
        _分 =< 30,
        _30分以内_2 is _30分以内_1 + 1,!.
時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_2,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1) :-
        _分 >= 30,_分 < 60,
        _1H_2 is _1H_1 + 1,!.
時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_2,_6H_1,_12H_1,_24H_1,_24H以上_1) :-
        _分 >= 60,_分 < 120,
        _2H_2 is _2H_1 + 1,!.
時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_2,_12H_1,_24H_1,_24H以上_1) :-
        _分 >= 120,_分 < 360,
        _6H_2 is _6H_1 + 1,!.
時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_2,_24H_1,_24H以上_1) :-
        _分 >= 360,_分 < 720,
        _12H_2 is _12H_1 + 1,!.
時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_2,_24H以上_1) :-
        _分 >= 720,_分 < 1440,
        _24H_2 is _24H_1 + 1,!.
時間差単位(_分,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_1,_30分以内_1,_1H_1,_2H_1,_6H_1,_12H_1,_24H_1,_24H以上_2) :-
        _分 >= 1440,
        _24H以上_2 is _24H以上_1 + 1,!.


'とりあえず最初に駐車していた台数を0台として表を作成せよ。それが出来たら最初に駐車していた台数を任意に設定することでその後の駐車している台数を自動計算できるように表を作成せよ。'.

'11月、12月などのデータを入力しても瞬時に計算できるようにしておく。夜間の駐車料金などもデータから推測せよ。'.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

入場時刻と出場時刻の時間差分単位(_入場時刻,_出場時刻,_時間差分単位) :-
        atom(_入場時刻),
        atom(_出場時刻),
        split(_入場時刻,['/',' ',':'],[_年_1,_月_1,_日_1,_時_1,_分_1]),
        split(_出場時刻,['/',' ',':'],[_年_2,_月_2,_日_2,_時_2,_分_2]),
        出場時刻と入場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位).

入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時,_分_1],[_年,_月,_日,_時,_分_2],_時間差分単位) :-
        _時間差分単位 is _分2 - _分1,!.        
入場時刻と出場時刻の時間差分単位([_年,_月,_日,_時_1,_分_1],[_年,_月,_日,_時_2,_分_2],_時間差分単位) :-
        _時間差分単位 is (60 * _時_2 + _分_2) - (60 * _時_1 + _分1),!.
入場時刻と出場時刻の時間差分単位([_年,_月,_日_1,_時_1,_分_1],[_年,_月,_日_2,_時_2,_分_2],_時間差分単位) :-
        _時間差分単位 is (1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分1),!.
入場時刻と出場時刻の時間差分単位([_年,_月_1,_日_1,_時_1,_分_1],[_年,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :-
        _月_2_1 is _月_2 - 1,
        findsum(_月日数,(
                    for(_月_1,_月,_月_2_1),
                    月日数(_年_1,_月,_月日数)),
                _月日数合計の一),
        _月日数合計 is truncate(_月日数合計の一),
        _時間差分単位 is (1440 * _月日数合計 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _日_1 + 60 * _時_1 + _分_1),!.
入場時刻と出場時刻の時間差分単位([_年_1,_月_1,_日_1,_時_1,_分_1],[_年_2,_月_2,_日_2,_時_2,_分_2],_時間差分単位) :-
        _年_2_1 is _年_2 - 1,
        findsum(_年日数,(
                    for(_年_1,_年,_年_2_1),
                    年日数(_年,_年日数)),
                _年日数合計の一),
        _年日数合計 is truncate(_年日数合計の一),
        _月_1_1 is _月_1 - 1,
        findsum(_月日数,(
                    for(0,_月,_月_1_1),
                    月日数(_年_1,_月,_月日数)),
                _月日数合計の一),
        _月日数合計_1 is truncate(_月日数合計の一),
        _月_2_1 is _月_2 - 1,
        findsum(_月日数,(
                    for(0,_月,_月_2_1),
                    月日数(_年_2,_月,_月日数)),
                _月日数合計の二),
        _月日数合計_2 is truncate(_月日数合計の二),
        _時間差分単位 is (1440 * _年日数の合計 + 1440 * _月日数合計_2 + 1440 * _日_2 + 60 * _時_2 + _分_2) - (1440 * _月日数合計_1 + 1440 * _日_1 + 60 * _時_1 + _分_1),!.


年日数(_年,366) :-
        うるう年(_年),!.
年日数(_年,365).

月日数(_年,2,29) :-
        うるう年(_年),!.
月日数(_年,2,29) :-
        \+(うるう年(_年)),!.
月日数(_年,_月,31) :-
        append(_,[_月|_],[1,3,5,7,8,10,12]),!.
月日数(_年,_月,30) :-
        append(_,[_月|_],[4,6,9,11]),!.
月日数(_,0,0).


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