Система циклических тегов - это крошечная, полная по Тьюрингу вычислительная модель, состоящая из двухсимвольного алфавита (я буду использовать {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
.Длина слова должна быть теоретически неограниченной. То есть вы не можете жестко задавать максимальную длину слова. Если я запускаю вашу программу на идеальном компьютере с бесконечным объемом памяти, ваша программа должна теоретически использовать ее. (Вы можете игнорировать ограничения вашего интерпретатора / компилятора.)
Если данная система останавливается до достижения данного поколения, вы должны вернуть или напечатать пустое слово.
Пустое производство существует, и вы должны быть в состоянии справиться с этим. Если вы пишете полную программу, ваш ввод / вывод также должен уметь ее обрабатывать.
Редактировать : изначально я хотел, чтобы поколение 0
было самим входным словом, а поколение 1
- результатом первого шага. То есть я намеревался вернуть вам столбец перед . Тем не менее , поскольку я не достаточно ясно сформулировал это, я приму оба варианта ; для каждого поколения вы можете возвращать значение в столбце « до» или « после» . Вы должны указать, что следите за колонкой после , если вы это делаете. Вы также должны быть уверены, в какой колонке вы выбираете.
Я присуждаю самый маленький кодекс через неделю (27.10.2014).