#P1512. Keeps Going and Going and ...
Keeps Going and Going and ...
本题没有可用的提交语言。
题目描述
惰性函数式编程语言(如Haskell和Miranda)支持一些其他编程语言所不具备的特性,包括无限列表。考虑以下简单的(且实用的)递归声明:
letrec
count n = cons n (count (n+1))
in
count 0
函数用于构造列表,因此上述声明会创建以下结构:
cons 0 (count 1)
= cons 0 (cons 1 (count 2))
= cons 0 (cons 1 (cons 2 ...))
= [0,1,2,...]
惰性语言之所以能实现这一点,是因为它们只计算实际需要用到的表达式。如果程序创建了一个无限列表,但只访问其中的第2和第3个元素,那么位置0和1的值永远不会被计算,列表结构也只会计算到第四个节点为止。
还可以使用多个函数来构建无限列表。以下是一个创建列表的声明:
letrec
even = cons "even" odd
odd = cons "odd" even
in
even
还有一些操作无限列表的函数。函数和可以分别用于从列表头部移除元素,返回被移除的前部分元素或列表的剩余部分。另一个实用的函数是,它将两个列表像拉链的滑块一样组合起来。例如:
zip (count 0) (count 10) = [0,10,1,11,2,12,...]
你的任务是实现这一功能的一个子集。
输入格式
第一行输入包含两个正整数和。表示接下来的声明数量,表示测试用例的数量。
每个声明的形式为。有两种形式:
- :表示是将和两个列表拉链式组合的结果。
- :表示列表的前个非负整数为,后续部分由列表定义(是必须的——所有列表都是无限的)。
测试用例的形式为,其中和是非负整数,满足且。
输入中每行的长度不超过80个字符。名称由单个大写字母组成。
输出格式
对于每个测试用例,输出列表中位置到的整数。列表元素的编号从0开始。
示例输入 1
5 3
S = 4 3 2 1 A
O = 1 O
E = 0 E
A = zip E O
Z = zip Z S
A 43455436 43455438
S 2 5
Z 1 10
示例输出 1
0 1 0
2 1 0 1
4 4 3 4 2 3 1 4 0 2
来源
East Central North America 1998