Ваша задача - интерпретировать принципиальную схему, дополненную логическими элементами.
Логические элементы (вам на самом деле не нужно знать, что они делают / являются для выполнения этой задачи):
- и ворота:
a
- или ворота:
o
- Нанд Гейт:
A
- ни ворота:
O
- xor gate:
x
- xnor gate:
X
- не ворота:
~
Каждый вход, кроме последнего, занимает два входа. Входные данные находятся .
в верхнем левом и нижнем левом углах квадрата 3 на 3 с центром на воротах. В противном случае вход находится слева от него. Выход находится .
прямо направо.
Провода представлены -|\/.=
-
соединяет два провода, один справа и один слева:c-c
|
контакты двух проводов, один сверху и один снизу:c | c
/
и\
работать следующим образом:c c \ / c c
.
контакты каждого окружающего провода:ccc c.c ccc
=
особенный; это соединяет смежные провода через это:-=-
соединяет два провода. В следующих
\|/ -=- /|\
каждый противоположный провод связан друг с другом, но не с другими (это то, чем он отличается
.
).- Чтобы ток протекал, два провода должны быть подключены к другому, поэтому
|-
ток не протекает.
Пример проводки:
.-.
= \
.--. .---=---
-. = .--
.--. .-------
вход разделен на два провода и затем разделен на три. В этом разделении нижний провод перемещается к середине, а внизу появляется разделение верхнего провода. Далее верхняя часть трех проводов перемещается в середину.
Пример проводки с воротами:
--.
o..~..
--. o.---
a.---.
--.
Формат ввода:
- каждый входной провод будет помечен цифрой. В конце (прямо перед новой строкой) каждый выход будет помечен
:
(и провод всегда будет идти прямо в него, т. Е.-:
Или.:
или=:
) - ввод всегда будет действительным; не будет петель или проводов, соединяющих друг с другом без ворот. Обратите внимание, что могут быть провода со свободными концами.
=
будет использоваться только при необходимости.
Выходной формат:
- на каждый вход ссылается соответствующий номер.
- выражение выводится. Например, если провода вычисляют вход 1 и вход 2, выход будет
1a2
. - все функции, которые выводятся, должны соответствовать логическим элементам в начале.
- чтобы не показывать, поставьте
~
перед правильным местом. для нескольких функций используйте скобки, чтобы показать порядок выполнения. Скобки также можно использовать, когда есть только одна функция. Например,
1-.~.-. A.~.-: . 2-. / x. 3-.
имеет один возможный выход
~((2x3)A(~1))
- несколько выходов должны быть разделены новой строкой (или эквивалентной)
Пример ввода:
1--.---.
x. \
2--. x.-=---------.
. .~. X.--.
3---. . a.----. /
O.~.-. \ /
. =
4-. / / .-:
X. .----:
5-.
Один возможный соответствующий вывод:
(~1)a(~(3O(4X5))
((1x2)x3)X((~1)a(~(3O(4X5))))
Ответы:
Питон
24881567806706697657653Yay для gzip + exec!
Ограничения и предположения
На самом деле поддерживается только до 9 входов - несколько цифр обрабатываются некорректно. Поскольку в спецификации указано, что входы помечены цифрой , а не цифрой , это разрешено.
Вход и выход
Вход берется через стандартный вход, а выход через стандартный выход.
тестирование
Пример ввода и вывода:
Протестировано здесь: http://ideone.com/gP4CIq
Алгоритм
Это в основном довольно наивный DFS с выходов. Для каждого вывода он начинается с символа один слева от него и отслеживает провод, разветвляясь (и добавляя к выражению) на каждом элементе. Когда он достигает вход, он добавляет его к выражению и откатывается до последнего момента она разветвленная, так как мы можем быть уверены , что ветвление не возможно без ворота. И, конечно же, любые недействительные дела отбрасываются. Ничего особенного в этом нет - и поэтому он, вероятно, дольше, чем мог бы быть.
Примечания
Вероятно, размер можно немного уменьшить с помощью некоторой реструктуризации, но я потратил достаточно времени на это сегодня. Версия для гольфа с ручным управлением была сжатой.
Сжатие gzip делает гольф интересным, потому что определенное кэширование (например
d=(-1,0,1)
) фактически занимает больше места, чем позволяет алгоритму сжатия позаботиться об этом. Тем не менее, я выбрал гольф-версию с ручным управлением как можно дальше, а не оптимизировал сжатие.Вручную (
909895840803):Полное разгул (2488):
источник
0
цифрой? Как насчет обмена местами так, чтобы он был2
раньше1
и т. Д..isdigit()
, который,[0-9]
насколько я могу судить, фактически эквивалентен регулярному выражению . Это правильно в соответствии с вашими требованиями? Что вы подразумеваете под обменом заказа? Как это реализовано, он сначала направится вверх по ветке любого логического элемента, но нет никакой гарантии упорядочения входов.isdigit()
согласуется. Сменный порядок означает что-то вроде2
первого входа и1
второго входа (отсортировано по вертикали).Ява:
15231512 символовЭто дает этот вывод для образца ввода:
Чтобы сжать его размер:
r
, без расширения файла в имени.Я уверен, что должно быть возможно уменьшить это больше, но только немного.
Интерпретатор реализован в виде своего рода клеточных автоматов. Он сканирует все значения настроек поля, повторяя их столько раз, сколько необходимо, пока не обнаружены изменения.
Вот негольфированная версия:
источник
try{}catch(Exception e){}
, чем дваthrows Exception
. Возможно, есть и другие вещи, но я понятия не имею, как играть в гольф на Яве.