やること
配列["A", "B", "C"]が与えられたとする。その全ての順列を辞書順に並べると
["A", "B", "C"]
["A", "C", "B"]
["B", "A", "C"]
["B", "C", "A"]
["C", "A", "B"]
["C", "B", "A"]
となる。["A", "B", "C"]が1番目、["C", "B", "A"]が6番目というように番号をふることにする。
n番目の順列を返す関数を求める。
考え方
nを階乗進法になおすと簡単に求まることが知られている。省略。後で書く・・・はず
コード
function factoradic(num::Int)
ret_vec = Int[]
i = 1
my_div = 1
while my_div != 0
my_div, my_rem = divrem(num, i)
push!(ret_vec, my_rem)
num = my_div
i+=1
end
ret_vec
end
function my_rearrange{T}(my_vec::Array{T}, idx_vec::Array{Int})
ret_vec = T[]
for i=1:length(my_vec)
push!(ret_vec, splice!(my_vec, idx_vec[i]))
end
return ret_vec
end
function nth_perm(my_vec, n)
a = factoradic(n-1)
a = [a, zeros(Int, length(my_vec) - length(a))]
a.+=1
return my_rearrange(my_vec, reverse(a))
end
nth_perm(["A", "B", "C", "D", "E", "F", "G"], 5040)