このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/449
#  お題:与えられた配列をなるべくN等分せよ。 
#  要素の順番は入れ替えず、配列の配列として返す。 
#  Nは1以上とする。 
#  データ構造は、リスト、ベクタ、タプルなどでも可。 
#   
#  回答例およびチェック用出力例: ruby 1.8.6 
#  def narudiv(a, n) 
#   d, m = a.size.divmod(n) 
#   (1..n).map {|i| a.slice!(0, d + (i <= m ? 1 : 0))} 
#  end 
#  p narudiv((1..10).to_a, 3) 
#  p narudiv((1..15).to_a, 4) 
#  ↓ 
#  [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]] 
#  [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]] 
# 
# 

'与えられた配列をなるべくN等分せよ。
要素の順番は入れ替えず、配列の配列として返す。
Nは1以上とする。
データ構造は、リスト、ベクタ、タプルなどでも可。'(_N,_ならび,_N等文されたならび) :-
        length(_ならび,_要素数),
        _D is _要素数 // _N,
        _M is _要素数 mod N,
        '_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび),
        flatten(_N等分されたならび,_ならび).

'_Mを各_Dに割り振る'(_D,_M,_N,_N等分されたならび) :-
        length(_N等分されたならび,_N),
        findall(_n,between(1,_N,_n),L1),
        組合せ(L1,_M,_組合せ),
        '_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび).

'_N等分されたならびを充実させる'(_D,_組合せ,_N等分されたならび) :-
        findall(L2,(
                    nth1(_nth1,_N等分されたならび,L),
                    length(L,_D),
                    '_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,L2)),
                _N等分されたならび).

'_nth1が_組合せに存在するときには枠を追加する'(_nth1,L,_組合せ,[_|L]) :-
        member(_nth1,_組合せ),!.
'_nth1が_組合せに存在するときには枠を追加する'(_,L,_組合せ,L).

組合せ(L,1,[A]) :-
        member(A,L).
組合せ([A|R1],N,[A|R3]) :-
        N > 1,
        M is N - 1,
        組合せ(R1,M,R3).
組合せ([_|R1],N,L) :-
        N > 1,
        組合せ(R1,N,L).