#P2682. Tomato Automata
Tomato Automata
题目描述
Tomato Automata 是很酷的小程序。你给他们一个 1 和 0 的无限序列,他们给你一个数字序列。它们广泛用于 Stanescu 操作系统(SOS)。它们是用非常简单的 Tomato 编程语言 编写的。以下是它的规范、教程和参考:
- Tomato 是一种非常简单但功能强大的语言。
- Tomato 程序 中的行按照它们在输入中出现的顺序用 1 到 N()的整数进行编号。
- 一行上只有一个命令。
- 从第一行开始执行。
- 正好有五个 Tomato 命令 - ifgo、jump、pass、loop 和 die。
- 执行时,每个命令都会打印其行号(到输出序列中)。
- ifgo 命令有一个参数 – 另一条指令的行号。它从 input 流中读取 1 位。如果该位为 1,则执行跳转到具有给定行号的行。否则,将继续执行下一行。
- jump 命令有一个参数 – 另一条指令的行号。执行时,执行将跳转到具有给定行号的行。
- pass 命令没有参数。它什么都不做(除了像所有其他命令一样打印它的行号)。然后继续执行下一行。
- die 命令没有参数。它终止程序的执行(在此之前打印其行号)。die 命令不能在循环中使用。
- loop 命令是唯一一个有两个参数的命令。它可用于构造循环。第一个参数是 <起始行号>(小于 loop 命令的行号),第二个参数是 (正整数)。执行时,它会从起始行循环 ─1 次(因为它已经执行过一次)。当循环执行给定次数时,执行将继续执行下一行。
- jump 和 ifgo 命令只能与包含它们的最内层循环范围内的行号一起使用(它们不能跳转到最内层循环之外或嵌套在不包含该命令的最内层循环中的循环内部)。
- loop 命令不能用于创建重叠的循环。嵌套的循环必须严格嵌套(它们不能使用相同的起始行)。
- 当程序的最后一行执行时,除了最后一行是 die 命令时,将从第一行继续执行。
- 空格可以在命令名称及其参数之前或之后自由出现。
- Tomato 编程语言 中一行的最大长度为 80 个字符,包括空格。
Stanescu 有很多 Tomato 项目。他对特定程序可以生成的输出序列的最大长度感兴趣,其中长度是打印的行号的数量。显然,不可能测试每个可能的输入序列(1 和 0),因此他需要一个计算它的程序。
输入
输入包含多个程序,用空行分隔。他们每个人都是一个正确的 Tomato 程序。
输出
对于每个给定的程序,您的解决方案必须在单独的行上打印该程序可以生成的输出序列的最大长度。如果输出序列没有最大长度,则打印 无穷大。当有限时,最大长度不会超过 。
输入数据 1
Ifgo 2
loop 1 3
die
ifgo 2
ifgo 3
pass
die
pass
ifgo 4
jump 5
ifgo 3
loop 2 2
pass
loop 1 2
die
输出数据 1
7
4
23
来源
2005 年东南欧