Циклічна система тегів крихітна, Тьюринг обчислювальна модель , що складається з алфавіту два-символу (я буду використовувати {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).