質問: [] (0..n ** k - 1).each{|i| ary << to_n_ary(n, k, to_gray(n, k, i.to_s(n)))} p ary # n進表記に戻っているはず ``` さて上記コードにおいて、 1**n > 10 のとき上手くいかない**のですが、 どのように修正すればよろしいでしょうか? 2to_gray(n, k, str) の逆操作を to_n_ary(n, k, str) で行なっているわけですが、 to_n_ary(n, k, str) をもう少し短く書くにはどうすればよろしいでしょうか?
回答: (編集: `n > 10` に対応しました) 1 `n > 10` の場合でも正しく動作させるには `to_i`, `to_s` に `n` を指定すれば良いです。 1. `.to_i` を `.to_i(n)` にする 2. `.join` の実行前に `.to_s(n)` を明示的に行う `to_gray` も修正が必要になりますね: ``` def to_gray(n, k, str) str.rjust(k + 1, '0').split('').each_cons(2).map{|d| ((d[1].to_i(n) - d[0].to_i(n)) % n).to_s(n) }.join end ``` 2 やっている事は質問のコードと基本的に同じで、書き方を変えただけですが: ``` def to_n_ary(n, k, str) a = 0 str.rjust(k, '0').split('').map{|d| ((a += d.to_i(n)) % n).to_s(n)}.join end ``` n進数にした時の先頭の 0 を除くならば(この場合引数 k は使いませんね): ``` def to_n_ary(n, k, str) a = 0 str.sub(/^0+(?!$)/, '').split('').map{|d| ((a += d.to_i(n)) % n).to_s(n)}.join end ```