一个循环标签系统是由两个符号的字母(我将使用一个微小的,图灵完备的计算模型{0,1}
的),一个有限的,非空的循环列表的制作是由这两个符号,以及无限的词也包括那两个符号。
在每一步:
- 单词中的第一个元素被删除
- 如果是
0
当前产量,则跳过 - 如果是
1
当前产生式,则附加在该词的末尾。 - 下一生产活动。如果这是最后一个作品,请返回第一个。
当单词变为空时,系统停止。
一个例子(来自维基百科):
Productions: (010, 000, 1111)
Initial word: 11001
Generation Production Word (before) Word (after)
0 010 11001 → 1001010
1 000 1001010 → 001010000
2 1111 001010000 → 01010000
3 010 01010000 → 1010000
4 000 1010000 → 010000000
5 1111 010000000 → 10000000
6 010 10000000 → 0000000010
7 000 0000000010 → 000000010
8 1111 000000010 → 00000010
9 010 00000010 → 0000010
您的任务(如果选择接受)是编写一个程序或函数,该程序或函数需要:
- 产品清单,
- 最初的单词,以及
- 一代人
并在该世代打印或返回单词。
例如,
cyclic_tag(
prod=[[0,1,0],[0,0,0],[1,1,1,1]],
word=[1,1,0,0,1],
gen=4) => [1,0,1,0,0,0,0]
实施细节:
字母无所谓。只要您保持一致,就可以使用
0
和1
,True
和False
,T
和NIL
,A
和B
,甚至1
和0
或可能想到的其他方法。所有输入和输出必须使用相同的字母,并且您必须指出要使用的内容0
和要使用的内容1
。从理论上讲,单词的长度必须不受限制。也就是说,您可能没有对最大字长进行硬编码。如果我在具有无限内存的理想计算机上运行您的程序,则您的程序理论上必须能够使用它。(您可以忽略翻译/编译器的限制。)
如果给定系统在达到给定代数之前暂停,则必须返回或打印空字。
空产品存在,并且您必须能够处理它。如果编写完整的程序,则您的I / O也必须能够处理它。
编辑:我原本打算将生成0
作为输入词本身,并将生成1
作为第一步的结果。即,我原本打算让您返回前一栏。但是,由于我还不太清楚说明这一点,因此我将接受两种选择。对于每一代,您都可以在before或after列中返回该值。如果要这样做,则必须声明您正在遵循after列。您还必须在选择的哪一列中保持一致。
从现在开始(2014年10月27日),我将授予最小的代码。