#P1512. Keeps Going and Going and ...

Keeps Going and Going and ...

本题没有可用的提交语言。

题目描述

惰性函数式编程语言(如Haskell和Miranda)支持一些其他编程语言所不具备的特性,包括无限列表。考虑以下简单的(且实用的)递归声明:

letrec
    count n = cons n (count (n+1))
in
    count 0

函数conscons用于构造列表,因此上述声明会创建以下结构:

cons 0 (count 1)
= cons 0 (cons 1 (count 2))
= cons 0 (cons 1 (cons 2 ...))
= [0,1,2,...]

惰性语言之所以能实现这一点,是因为它们只计算实际需要用到的表达式。如果程序创建了一个无限列表,但只访问其中的第2和第3个元素,那么位置0和1的值永远不会被计算,列表结构也只会计算到第四个节点为止。

还可以使用多个函数来构建无限列表。以下是一个创建列表["even","odd","even",...]["even","odd","even",...]的声明:

letrec
    even = cons "even" odd
    odd = cons "odd" even
in
    even

还有一些操作无限列表的函数。函数taketakedropdrop可以分别用于从列表头部移除元素,返回被移除的前部分元素或列表的剩余部分。另一个实用的函数是zipzip,它将两个列表像拉链的滑块一样组合起来。例如:

zip (count 0) (count 10) = [0,10,1,11,2,12,...]

你的任务是实现这一功能的一个子集。

输入格式

第一行输入包含两个正整数nnmmnn表示接下来的声明数量,mm表示测试用例的数量。

每个声明的形式为name=exprname = exprexprexpr有两种形式:

  1. zip name1 name2zip\ name1\ name2:表示namename是将name1name1name2name2两个列表拉链式组合的结果。
  2. x0 x1 ... xi name3x0\ x1\ ...\ xi\ name3:表示列表namename的前i+1i+1个非负整数为x0,x1,...,xix0, x1, ..., xi,后续部分由列表name3name3定义(name3name3是必须的——所有列表都是无限的)。

测试用例的形式为name s ename\ s\ e,其中ssee是非负整数,满足ses \leq ees<250e - s < 250

输入中每行的长度不超过80个字符。名称由单个大写字母组成。

输出格式

对于每个测试用例,输出列表namename中位置ssee的整数。列表元素的编号从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