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