このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1301553333/483
#  [1] 授業単元:プログラミング 
#  [2] 問題文(含コード&リンク): 
#  ttp://www.dotup.org/uploda/www.dotup.org1575096.jpg 
#  

'ヒット&ブロー' :-
        コンピュータが四桁の整数を決める(_数字ならびの一),
        遊び手が数字を入力する(_数字ならびのニ),
        'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ).

コンピュータが四桁の整数を決める(_数字ならび) :-
        M is random mod 10000,
        number_chars(M,L),
        頭部に零を詰める(L,_数字ならび).

頭部に零を詰める(L,_数字ならび) :-
        length(_数字ならび,4),
        append(L0,L,_数字ならび),
        all(L0,'0').

遊び手が数字を入力する(_数字ならび) :-
        get_line(Line),
        findall(A,(
                    append(_,[A|_],Line)),
                _数字ならび).

'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ) :-
        ヒット数(_数字ならびの一,_数字ならびのニ,_ヒット数),
        ブロー数(_数字ならびの一,_数字ならびのニ,_ブロー数),
        'ヒット&ブロー表示'(_ヒット数,_ブロー数),!.

ヒット数(L1,L2,_ヒット数) :-
        count((     append(L0_1,[A|_],L1),
                    append(L0_2,[A|_],L2),
                    length(L0_1,N),
                    length(L0_2,N)),
                _ヒット数).

ブロー数(L1,L2,_ブロー数) :-
        count((     append(L0_1,[A|R_1],L1),
                    append(L0_2,[A|R_2],L2),
                    length(L0_1,N_1),
                    length(L0_2,N_2),
                    \+(N_1 == N_2)),
                _ブロー数).

'ヒット&ブロー表示'(4,_) :-
        writef('ゲームオーバー\n',[]),!.        
'ヒット&ブロー表示'(_ヒット数,_ブロー数) :-
        writef('%tH%tB\n',[_ヒット数,_ブロー数]),
        fail.