このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/998
#  [1] 授業単元:C++ 
#  [2] 問題文(含コード&リンク): 
#  入力:二つの整数n,m 
#  出力:1からnまでの番号札を持った人が、番号順に円陣を組んでいる。 
#       最初に、1番札の人からm番目の人が退席する(円陣は1減) 
#       続いて、その次からm番目の人が退席する。これを繰り返したときの、 
#       退席者の順番を求め、出力せよ。 
#      -例:n = 9,m = 5のとき、退席者の順番は5,1,7,4,3,6,9,2,8 
#  

'入力:二つの整数n,m 
出力:1からnまでの番号札を持った人が、番号順に円陣を組んでいる。
     最初に、1番札の人からm番目の人が退席する(円陣は1減)
     続いて、その次からm番目の人が退席する。これを繰り返したときの、
     退席者の順番を求め、出力せよ。'(_n,_m) :-
        findall(N,(
                    between(1,_n,N)),
                L1),
        '最初に、1番札の人からm番目の人が退席する(円陣は1減)
     続いて、その次からm番目の人が退席する。これを繰り返したときの、
     退席者の順番を求め、'(L1,_m,L2),
        '出力せよ。'(L2).

'最初に、1番札の人からm番目の人が退席する(円陣は1減)
     続いて、その次からm番目の人が退席する。これを繰り返したときの、
     退席者の順番を求め、'([],_,[]) :- !.
'最初に、1番札の人からm番目の人が退席する(円陣は1減)
     続いて、その次からm番目の人が退席する。これを繰り返したときの、
     退席者の順番を求め、'(L1,_m,[N|R]) :-
        _m_1 is _m - 1,
        ならびの回転(左方向,_m_1,L1,[N|L3]),
        '最初に、1番札の人からm番目の人が退席する(円陣は1減)
     続いて、その次からm番目の人が退席する。これを繰り返したときの、
     退席者の順番を求め、'(L2,_m,R).

ならびの回転(_方向,N,L1,L2) :-
        length(Ln,N),
        ならびの回転_2(_方向,Ln,L1,L2).

ならびの回転_2(_方向,[],L,L).
ならびの回転_2(_方向,[_|Ln],L1,L2) :-
        ならびの回転(_方向,L1,L1_1),
        ならびの回転_2(_方向,L2,L1_1,L2).

ならびの回転(左方向,[A|R],L) :-
        append(R,[A],L).
ならびの回転(右方向,L1,L) :-
        append(R,[A],L1),
        append([A],R,L).

'出力せよ。'(L2) :-
        writef('%t\n',[L2]).