10266


ｎ進グレイコードの出力を行った  
（参考：[ｎ進グレイコードの出力について](https://ja.stackoverflow.com/questions/10238/%EF%BD%8E%E9%80%B2%E3%82%B0%E3%83%AC%E3%82%A4%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%87%BA%E5%8A%9B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)）  
ので、その逆をやってみました。

[code]

    # 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進表記に戻っているはず
    
[/code]

さて上記コードにおいて、  
① **n > 10 のとき上手くいかない** のですが、  
どのように修正すればよろしいでしょうか？  
②to_gray(n, k, str) の逆操作を to_n_ary(n, k, str)  
で行なっているわけですが、  
to_n_ary(n, k, str)  
をもう少し短く書くにはどうすればよろしいでしょうか？


CC BY-SA 3.0
2015-05-16T14:14:28.237
10263
2015-05-16T17:57:03.380
2017-04-13T12:52:39.113
-1
5363
question
ruby アルゴリズム
ｎ進グレイコードからｎ進表記へ戻すには？


(編集: `n > 10` に対応しました)

① `n > 10` の場合でも正しく動作させるには `to_i`, `to_s` に `n` を指定すれば良いです。

  1. `.to_i` を `.to_i(n)` にする
  2. `.join` の実行前に `.to_s(n)` を明示的に行う

`to_gray` も修正が必要になりますね:

[code]

    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
    
[/code]

② やっている事は質問のコードと基本的に同じで、書き方を変えただけですが:

[code]

    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
    
[/code]

n進数にした時の先頭の 0 を除くならば(この場合引数 k は使いませんね):

[code]

    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
    
[/code]


CC BY-SA 3.0
2015-05-16T16:17:35.740
10266
2015-05-16T17:57:03.380
2015-05-16T17:57:03.380
5300
5300
10263
answer