このディレクトリの索引
#  出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/444
# 【課題】課題は3つあります。
# http://www.dotup.org/uploda/www.dotup.org318192.zip
% 問題1 星ピラミットの表示

入力された段数になるように星文字でピラミッドを築く :-
    入力された段数に(_入力された段数),
    なるように星文字でピラミッドを築く(_入力された段数).

なるように星文字でピラミッドを築く(_入力された段数) :-
    _最終行の星数 is (_入力された段数 - 1) * 2 + 1,
    length(L,_最終行の星数),
    between(1,_入力された段数,N),
    星文字でピラミッドを築く(N),
    N = _入力された段数.

入力された段数に(_入力された段数) :-
    write('段数を入れてください : '),
    get_integer(_段数).

星文字でピラミッドを築く(N) :-
    length(L1,N),
    all(L1,'*'),
    append(L0,L1,L0,L),
    all(L0,' '),
    atom_chars(Atom,L),
    writef('   %t   \n',[Atom]).

乱数を使って発生させた2つの整数のたし算を5問示しそれぞれの回答診断と5問答えるのに要した時間を表示 :-
    _開始時刻 is time,
    for(1,N,5),
    一問答える,
    N = 5,
    _終了時刻 is time,
    _回答するのに要した時間 is _終了時刻 - _開始時刻,
    writef('5問回答までの時間は%t秒でした。\n',[_回答するのに要した時間]).

一問答える :-
    A is random(100),
    B is random(100),
    writef('%t + %t =? ',[A,B]),get_integer(_答え),
    _正解 is A + B,
    回答診断(_正解,_答え,_診断),
    writef('%t\n',[_診断]).

回答診断(_正解,_正解,'正解です!!').
回答診断(_正解,_答え,_診断) :-
    1 is abs(_正解 - _答え),
    concat_atom(['惜しいです。正解は',_正解],_診断).
回答診断(_正解,_答え,_診断) :-
    \+(_答え=_正解),
    \+(1 is abs(_正解 - _答え)),
    concat_atom(['間違いです。正解は',_正解],_診断). 

'ファイル名を入力させてそのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する' :-
    'ファイル名を入力させて'(_ファイル名),
    get_chars(_ファイル名,Chars).
    '行数、小文字数、大文字数、その他文字数の集計'(Chars,_行数,_小文字数,_大文字数,_その他文字数),
    そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数).

'ファイル名を入力させて'(_ファイル名) :-
    write('ファイル名を入力してください\n'),
    get_line(_ファイル名).

そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数) :-
    writef('%t行ありました\n',[_行数]),
    writef('小文字の数は%t\n',[_小文字数]),
    writef('大文字の数は%t\n',[_大文字数]),
    writef('その他の数は%t\n',[_その他文字数]).

'行数、小文字数、大文字数、その他文字数の集計'([],0,0,0,0).
'行数、小文字数、大文字数、その他文字数の集計'(['\n'|R],S1,S2,S3,S4) :-
    行数の加算(R,S1,S2,S3,S4).
'行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :-
    小文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14).
'行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :-
    大文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14).
'行数、小文字数、大文字数、その他文字数の集計'([_|R],S1,S2,S3,S4) :-
    その他文字数の加算(R,S1,S2,S3,S4).

行数の加算(R,S1,S2,S3,S4) :-
    '行数、小文字数、大文字数、その他文字数の集計'(R,S11,S2,S3,S4),
    S1 is S11 + 1,!.

小文字数の加算([A|R],S1,S2,S3,S4) :-
    A @>= 'a',A @=< 'z',
    '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S21,S3,S4),
    S2 is S21 + 1,!.

大文字数の加算([A|R],S1,S2,S3,S4) :-
    A @>= 'A',A @=< 'Z',
    '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S31,S4),
    S3 is S31 + 1,!.

その他文字数の加算(R,S1,S2,S3,S4) :-
    '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S3,S41),
    S4 is S41 + 1,!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
get_integer(N) :-
    repeat,
    get_line(Line),
    atom_to_term(Line,M,_),
    get_integer_診断(M,N),!.

get_integer_診断(end_of_file,-1).
get_integer_診断(N,N) :- integer(N).

get_line(X) :-
    get_char(C),
    get_line_1(C,Chars),
    atom_chars(X,Chars).

get_line_1('\n',[]) :- !.
get_line_1(end_of_file,[]) :- !.
get_line_1(C,[C|R]) :-
    get_char(C2),
    get_line_1(C2,R).