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)
このコードを書いた後、以下の大変短いコードをネットで見つけた。
(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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。