このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1245853701/243 
# [1] 授業単元: プログラミング演習   
# [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9605.txt   
# ある宝くじ売り場は窓口が1つだけあり、10::00〜15:00の5時間営業している
# この宝くじ売り場には平均して4分に1人の客がやってくる
# また、1人の客が宝くじの購入に要する時間tは以下に従うようにする
# 
# 購入に要する時間  割合
#    1分     20%
#    3分     60%
#    5分     13%
#   10分      5%
#   15分      2%
# 
# この宝くじ売り場にできるだろう行列の変化の様子をシュミレーションし、
# 下記の実行結果のように売り場に並んでいる客の行列の状態を15分刻みで表示するプログラムを作成せよ
# 
# 実行結果
# $ ./a.out ※rand()関数を使っているため、実行環境によって全く同じ結果にはならない
# 10:00 :
# 10:15 : *
# 10:30 : 
# 10:45 : **
# 11:00 : 
# 11:15 : ***
# 11:30 : ***
# 11:45 : ****
# 12:00 : **
# 12:15 : ****
# 12:30 : *****
# 12:45 : ******
# 13:00 : *******
# 13:15 : *******
# 13:30 : *******
# 13:45 : *******
# 14:00 : *****
# 14:15 : *
# 14:30 : ****
# 14:45 : *********
# 15:00 : ******
# 時間内に来た客の数       : 92
# 時間内に対応できた客の数 : 86

'宝くじ売り場にできるだろう行列の変化の様子をシュミレーションし、
下記の実行結果のように売り場に並んでいる客の行列の状態を15分刻みで表示する'(_レジならび記録) :-
        待ち時間付き顧客ならびの生成(_顧客ならび),
        レジのシミュレーション(0,300,L2,[],RL,_レジならび記録),
        '15分ごとにグラフ表示'(_レジならび記録).

待ち時間付き顧客ならびの生成(L) :-
        findall([T,W,N],(between(1,75,N),顧客ならびの生成(T,W)),L1),
        sort(L1,L).

顧客ならびの生成(_開店N分後,_購入に要する時間) :-
        _開店N分後 is random(300),
        購入に要する時間(_購入に要する時間).

レジのシミュレーション(N,N,_,L,L,[[N|L]]) :- !.
レジのシミュレーション(N1,N,[[N1,W,_]|R1],L1,L2,R2) :-
        レジのシミュレーション(N1,N,R1,[W|L3],L2,R2).
レジのシミュレーション(N1,N,[[N2,W,Z]|R1],L1,L2,[[N1,L1]|R2]) :-
        N2 > N1,
        '1分経過した待ち列'(L1,L3),
        N3 is N1 + 1,
        レジのシミュレーション(N3,N,[[N2,W,Z]|R1],L3,L2,R2).

'15分ごとにグラフ表示'([]) :- !.
'15分ごとにグラフ表示'([[N,L]|R]) :-
        0 is N mod 15,
        '時・分を得る'(N,_時,_分),
        星の生成(L,_星文字列),
        writef('%w:%w : %w\n',[_時,_分,_星文字列]),
        '15分ごとにグラフ表示'(R),!.
'15分ごとにグラフ表示'([[N,L]|R]) :-
        \+(0 is N mod 15)),
        '15分ごとにグラフ表示'(R),!.

'時・分を得る'(N,_時,分) :-
        D is N // 60,
        _時 is 10 + D,
        _分 is N mod 60.

星の生成(L,_星文字列) :-
        length(L,Len),
        length(L1,Len),
        all(L1,'*'),
        atom_chars(_星文字列,L1),!.

購入に要する時間(_購入に要する時間) :-
        N is random(100),
        乱順発生番号(A,N),
        購入に要する時間(A,_購入に要する時間).        

購入に要する時間('1分客',1).
購入に要する時間('3分客',3).
購入に要する時間('5分客',5).
購入に要する時間('10分客',10).
購入に要する時間('15分客',15).

乱順発生番号('1分客',N) :- N>=0,N=<19.
乱順発生番号('3分客',N) :- N>=20,N=<79.
乱順発生番号('5分客',N) :- N>=80,N=<92.
乱順発生番号('10分客',N) :- N>=93,N=<97.
乱順発生番号('15分客',N) :- N>=98,N=<99.

'1分経過した待ち列'([],[]) :- !.
'1分経過した待ち列'([1|R1],R2) :-
        '1分経過した待つ列'(R1,R2),!.
'1分経過した待ち列'([N|R1],[N2|R2]) :-
        N2 is N - 1,
        '1分経過した待ち列'(R1,R2).

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