2015年6月7日日曜日

150607(3)

Ruby


Look-and-say sequence

(過去にも書いた気がするが、)オンライン整数列大辞典に
紹介されているPythonのコードをベースに書いてみた。
A005150(http://oeis.org/A005150/list)
と比較し、答え合わせしてみる。

def A005150(n)
  m = 1
  p = '1'
  ary = [1]
  while m < n
    q = ''
    idx = 0
    s = p.size
    while idx < s
      # 塊を見つける
      start = idx
      idx += 1
      while idx < s && p[idx] == p[start]
        idx += 1
      end
      # 塊 = (idx - start個のp[start])
      q = q + (idx - start).to_s + p[start]
    end
    p = q
    ary.push(p.to_i)
    m += 1
  end
  return ary
end
ary = A005150(15)

# OEIS A005150のデータ
ary0 =
[1,11,21,1211,111221,312211,13112221,1113213211,
 31131211131221,13211311123113112211,
 11131221133112132113212221,
 3113112221232112111312211312113211,
 1321132132111213122112311311222113111221131221,
 11131221131211131231121113112221121321132132211331222113112211,
 311311222113111231131112132112311321322112111312211312111322212311322113212221]
# 一致の確認
p ary == ary0

このコードを書いた後、以下の大変短いコードをネットで見つけた。
(http://rosettacode.org/wiki/Look-and-say_sequence#Ruby)

def lookandsay(str)
  str.gsub(/(.)\1*/) {$&.length.to_s + $1}
end
 
num = "1"
10.times do
  puts num
  num = lookandsay(num)
end

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。