n進グレイコードからn進表記へ戻すには?
n進グレイコードの出力を行った
(参考:n進グレイコードの出力について)
ので、その逆をやってみました。
# n進表記から n進グレイコードへ
def to_gray(n, k, str)
str.rjust(k + 1, '0').split('').each_cons(2).map{|d| (d[1].to_i - d[0].to_i) % n}.join
end
# n進グレイコードから n進表記へ
def to_n_ary(n, k, str)
ary0 = str.rjust(k, '0').split('')
d = ary0[0].to_i
n_ary = [d]
(1..k - 1).each{|e|
d = (d + ary0[e].to_i) % n
n_ary << d
}
n_ary.join
end
n, k = 2, 3
ary = []
(0..n ** k - 1).each{|i| ary << to_n_ary(n, k, to_gray(n, k, i.to_s(n)))}
p ary # n進表記に戻っているはず
さて上記コードにおいて、
①n > 10 のとき上手くいかないのですが、
どのように修正すればよろしいでしょうか?
②to_gray(n, k, str) の逆操作を to_n_ary(n, k, str)
で行なっているわけですが、
to_n_ary(n, k, str)
をもう少し短く書くにはどうすればよろしいでしょうか?