このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/775
#  お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 
#  半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。 
# 
# 


'文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。'(_文字列) :-
        atom_chars(_文字列,_文字ならび),
        文字盤を用意する(_文字ならび,_文字盤),
        文字盤に円形に文字を書き込む(_文字ならび,_文字盤),
        文字を表示する(_文字盤).

文字盤を用意する(_文字ならび,_文字盤) :-
        length(_文字ならび,_文字数),
        '_文字数+1の文字盤を作る'(_文字数,_文字盤).

'_文字数+1の文字盤を作る'(_文字数,_文字盤) :-
        _文字数_1 is _文字数 + 1,
        length(_文字盤,_文字数_1),
        findall(L,(
                    length(L,_文字数_1)),
                _文字盤).

円形に文字を書き込む(_文字ならび,_文字盤) :-
        length(_文字ならび,_文字ならびの要素数),
        _半径 is _文字ならびの要素数 // 2,
        点に文字を書き込む(0,_文字ならび,_文字ならびの要素数,_半径,_文字盤).

点に文字を書き込む(_,[],_,_,_文字盤) :- !.
点に文字を書き込む(_n,[_文字|R],_分割数,_半径,_文字盤) :-
        '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y),
        '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤),
        _n_2 is _n + 1,
        点に文字を書き込む(_n_2,R,_分割数,_半径,_文字盤).

'_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y) :-
        _x is truncate(sin((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5),
        _y is truncate(cos((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5).

'文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤) :-
        nth1(_y,_文字盤,L),
        nth1(_x,L,_文字),!.

文字を表示する([]) :- !.
文字を表示する([L|R]) :-
        forall(member(A,L),変数は空白に埋めて文字を出力する(A)),
        write('\n'),
        文字を表示する(R).

変数は空白に埋めて文字を出力する(A) :-
        var(A),
        write(' '),!.
変数は空白に埋めて文字を出力する(A) :-
        write(A).