このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712
#  以前どこかで見かけた問題だけど 
#  「デジタル式の時計をアナログ式に変換する」 
#  入出力サンプル 
#  http://ime.nu/codepad.org/XcWCtEF5 
#  目盛りをo、短針をX、長針をxで表す 
#  重なったときはXで表す 
#  ただし短針は最も近い目盛りを指すようにする 
# 
#  
#           X
#      o         o
#  
#   o               o
#  
#  o                 o
#  
#   o               o
#  
#      o         o
#           o
#  
#        (0時0分)
#  


時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,
[[' ',' ',' ',' ',' ',' ',' ',' ',' ',_0,' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',_11,' ',' ',' ',' ',' ',' ',' ',' ',' ',_1,' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',_10,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_2,' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[_9,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_3],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',_8,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_4,' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',_7,' ',' ',' ',' ',' ',' ',' ',' ',' ',_5,' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',_6,' ',' ',' ',' ',' ',' ',' ',' ',' ']]).


'デジタル式の時計をアナログ式に変換する。
目盛りをo、短針をX、長針をxで表す。
重なったときはXで表す。
ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :-
        時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_時計板),
        '目盛りをo、短針をX、長針をxで表す。
重なったときはXで表す。
ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11),
        時計板の表示(_時計板).

'目盛りをo、短針をX、長針をxで表す。
重なったときはXで表す。
ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11) :-
        '短針をXで表す。
ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]),
        '長針はxで表す。
重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]),
        変数として残っている所にoを埋める([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]).

'短針をXで表す。
ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :-
        '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]),!.
'短針をXで表す。
ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :-
        '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]).

'0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :-
        _分 < 30,
        nth0(_時,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X').

'30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :-
        _分 >= 30,
        _時_2 is (_時 + 1) mod 12,
        nth0(_時_2,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X').

'長針はxで表す。
重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :-
        _分_1 is truncate((_分 / 12) + 0.5),
        分を埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]).

分をxで埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :-
        nth0(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'x'),!.
分をxで埋める(_,_).

変数として残っている所にoを埋める([]).
変数として残っている所にoを埋める([o|R]) :-
        変数として残っている所にoを埋める(R),!.
変数として残っている所にoを埋める([_|R]) :-
        変数として残っている所にoを埋める(R).

時計板の表示(_時計板) :-
        forall(member(_行,_時計板),行を表示する(_行)).

行を表示する(_行) :-
        atomic_list_concat(_行,_表示行),
        writef('%t\n',[表示行]).