Електричні схеми
Розгляньмо цифрову електричну схему, яка працює з двійковими сигналами в дискретному часі. Вона складається з вхідних сигналів, дротів, з'єднань та логічних елементів. Ми будемо використовувати шість типів логічних елементів: NOT, AND, NAND, OR, NOR, DFF. Кожен з них повертає один вихідний сигнал. Кількість вхідних сигналів та інформація про повернене значення наведені в таблиці нижче.
NOT: 1 вхід. Повертає протилежне значення вхідного сигналу.
AND: 1 або більше входів. Повертає кон'юнкцію значень вхідних сигналів.
NAND: 1 або більше входів. Повертає заперечення кон'юнкції значень вхідних сигналів.
OR: 1 або більше входів. Повертає диз'юнкцію значень вхідних сигналів.
NOR: 1 або більше входів. Повертає заперечення диз'юнкції значень вхідних сигналів.
DFF: 1 вхід. Повертає те ж значення, що й вхідний сигнал, але із затримкою на один тик дискретного часу.
Схема працює наступним чином. Перед першим тиком дискретного часу кожен елемент DFF ініціалізується нульовим значенням. Потім, протягом кількох тиків, на деякі з'єднання (вхідні контакти) подаються вхідні значення. Ви повинні написати програму, яка обчислюватиме двійкові значення на певному наборі вузлів (вихідних з'єднань).
Програмі буде надано опис логічної схеми, набір з'єднань, які нас цікавлять, та вхідні значення для кожного послідовного тика дискретного часу.
Вхідні дані
Складаються з двох блоків. Перший блок містить кілька рядків. Якщо перший символ рядка - диез (#), то рядок є коментарем. Ігноруйте його. Також ігноруйте порожні рядки. Рядок, що описує вхідні сигнали, має вигляд INPUT(junction), де junction - ім'я з'єднання. Рядок, що описує з'єднання, які нас цікавлять, має вигляд OUTPUT(junction), де junction - ім'я з'єднання. Ім'я з'єднання складається з прописних і заголовних латинських літер, цифр і символу підкреслення (_). Довжина імені менше 64 символів.
Усі інші рядки першого блоку містять опис нових з'єднань. Такий рядок виглядає як j1 = op(j2), де j1 і j2 - імена з'єднань, а op - це або NOT, або DFF. Він також може виглядати як j1 = op(j2[, j3...]), де j-ки - імена з'єднань, а op - це AND, NAND, OR або NOR. Існує не більше 5000 з'єднань.
Другий вхідний блок починається з рядка INPUT VALUES. Кожен з наступних рядків містить послідовність нулів і одиниць. Кількість цифр дорівнює кількості вхідних сигналів. Ви повинні співставляти ці двійкові значення зі значеннями вхідних сигналів у порядку їх слідування на вході. Блок містить не більше 500 рядків. Для більш детальної інформації дивіться приклади.
Вважайте, що вхідні дані коректні. Вважайте, що дана схема буде працювати правильно.
Вихідні дані
Для кожного рядка значень вхідних сигналів виведіть один рядок, що містить нулі та одиниці. Цифри повинні відповідати значенням вихідних сигналів, зберігаючи їх вхідний порядок.