题目:

外观数列是指具有以下特点的整数序列:
d, d1, d111, d113, d11231, d112213111, …
它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d,所以就是 d1;第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就是 d111。又比如第 4 项是 d113,其描述就是 1 个 d,2 个 1,1 个 3,所以下一项就是 d11231。当然这个定义对 d = 1 也成立。本题要求你推算任意给定数字 d 的外观数列的第 N 项。
输入格式:
输入第一行给出 [0,9] 范围内的一个整数 d、以及一个正整数 N(≤ 40),用空格分隔。
输出格式:
在一行中给出数字 d 的外观数列的第 N 项。
输入样例:
1 8
输出样例:
1123123111

思路:第一眼看上去题目很难懂,这里对题目进行一下分析。
下面是输入样例的答案,从第一项外观数列到第八项。我们可以看到,偶数位的数是对奇数位的一个计数,而这里计数的数据就是相邻的数的和。如果没有理解这个话,可以仔细看一下下面的输出。比如第三行的12就是由第二行的11得到,1代表数字1,2代表有连续的俩个1。依次类推。
1
11
12
1121
122111
112213
12221131
1123123111

d, N = input().split()
for _ in range(1, int(N)):
    re = ''  # 存储答案
    l = len(d)
    ix = 0
    while ix < l:
        char = d[ix]
        cn = 1  # 记录数字出现的次数
        while ix + 1 < l and d[ix + 1] == char:
            ix += 1
            cn += 1
        re += char  # 将出现数字连接
        re += str(cn)  # 将数字的个数连接
        ix += 1
    d = re
print(d)