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)と言うらしい。