Python Challenge(10)
続いてレベル10。
牛をクリックすると、以下の数列が現れる。
a = [1, 11, 21, 1211, 111221,
5分ぐらい眺めてたら法則が分かった。
1⇒1個の1 11⇒2個の1 21⇒1個の2、1個の1 1211⇒1個の1、1個の2、2個の1 1112221⇒
まずは愚直に、
ans = ['1'] for n in range(0, 30): a = ans[-1] counter = [] next = [] for c in str(a): if counter: if counter[1] == c: counter[0] = counter[0] + 1 else: next.extend([str(counter[0]), counter[1]]) counter = [1, c] else: counter = [1, c] next.extend([str(counter[0]), counter[1]]) ans.append(''.join(next)) print(len(ans[-1]))
お次は正規表現で、
import re a = '1' for n in range(0, 30): a = "".join([str(len(s)) + c for (s, c) in re.findall(r'((\d)\2*)', a)]) print(len(a))
解説ページによると見て言う数列(look-and-say sequence)と言うらしい。