Табло
Вот приблизительные оценки (то есть количество домино) для представления VisualMelon. Я превращу их в нормализованные оценки, описанные ниже, когда придет больше ответов. Существующее решение теперь может решить все схемы в тесте:
Author Circuit: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
VisualMelon 39 45 75 61 307 337 56 106 76 62 64 62 182 64 141 277 115 141 92 164 223 78 148 371 1482 232 107 782 4789 5035 1314 3213 200 172 1303 3732 97596 156889 857
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Legend:
I - invalid circuit
B - circuit too big
W - circuit computes wrong function
T - exceeded time limit
Соревнование
Это является возможным строить простые логические ворота от домино. Следовательно, комбинируя эти или иные, произвольные двоичные функции могут быть вычислены с помощью домино.
Но, конечно же, каждый, кто играл с домино (кроме Робина Пола Вейерса), испытывал разочарование, когда заканчивал их. Следовательно, мы хотим максимально эффективно использовать наши домино, чтобы мы могли сделать некоторые действительно интересные вычисления с имеющимся у нас материалом.
Обратите внимание, что вы не можете производить ненулевой вывод из нулевого ввода как такового, поэтому нам нужно добавить «линию питания», которая идет по вашей настройке и из которой вы можете получить 1
s в любое время.
Твое задание
Учитывая булеву функцию с M
входами и N
выходами ( f: {0,1}^M --> {0,1}^N
для математически наклонных), создайте схему домино с как можно меньшим количеством домино, которое вычисляет эту функцию. Вы будете использовать символы |
, -
, /
, \
представлять домино в различных направлениях.
вход
Вы получите ввод через аргументы командной строки:
[command for your solver] M N f
где M
и N
- положительные целые числа и f
таблица истинности, разделенная запятыми, в каноническом порядке. То есть f
будут содержать 2^M
значения длины N
. Например, если M = N = 2
и первый бит на выходе был функцией И, а второй бит был функцией ИЛИ, f
читал бы
00,01,01,11
Выход
Запишите в STDOUT сетку ASCII, представляющую установку домино. Ваша установка должна вписываться в следующую структуру
/////.../////
????...????
I????...????O
I????...????O
.............
.............
I????...????O
I????...????O
I????...????O
- Верхний ряд целиком состоит из
/
самого нижнего домино, который гарантированно будет опрокинут в самом начале - это ваша линия электропередачи. - Крайний левый столбец состоит из ваших входных данных. Каждый
I
может быть либо пробелом, либо a|
, таким, что есть ровноM
|
s. - Крайний правый столбец состоит из ваших выводов. Каждый
O
может быть либо пробелом, либо a|
, таким, что есть ровноN
|
s. - Обратите внимание, что перед
|
входом или выходом есть хотя бы один пробел перед первым . - Это
.
указывает на то, что сетка может быть сколь угодно большой. - Вы можете заполнить
?
любым способом.
Обратите внимание, что нижний вход является самым быстро меняющимся, пока вы идете по таблице истинности, в то время как верхний вход - 0
для первой половины выходов и 1
для второй половины.
правила
Домино размножается, как указано в разделе «Гольф для дня домино» . Короче говоря, если мы представляем падающие направления в виде букв
Q W E
A D
Z X C
тогда это все уникальные комбинации, которые могут распространяться (а также их вращения и отражения):
D| -> DD D\ -> DE D/ -> DC
C| -> CD C/ -> CC
C -> C C -> C C -> C
| D - X / C
Все вышеперечисленные правила применяются одновременно на каждом временном шаге. Если два из этих правил находятся в конфликте (т. Е. Плитка перемещается в два действительных противоположных направления одновременно), затронутая плитка не упадет и будет эффективно заблокирована в положении для остальной части симуляции.
ограничения
M
иN
никогда не будет превышать 6.- Ваш решатель должен создать цепь в течение N * 2 M секунд .
- Ваш решатель не должен использовать более 1 ГБ памяти . Это мягкий предел, так как я буду следить за этим вручную и уничтожать ваш процесс, если он значительно / постоянно превышает этот предел.
- Ни одна цепь не может содержать более 8 000 000 ячеек или 1 000 000 домино .
- Ваше представление должно быть детерминированным . Вам разрешено использовать генераторы псевдослучайных чисел, но они должны использовать жестко закодированное начальное число (которое вы можете оптимизировать столько, сколько захотите).
счет
Для каждого контура, пусть D
будет общее количество домино в вашем контуре и B
наименьшее количество домино, с которым этот контур был решен (вами или любым другим участником). Тогда ваш счет для этой схемы определяется 10,000 * B / D
округлением в меньшую сторону. Если вам не удалось решить схему, ваша оценка равна 0. Ваша общая оценка будет суммой по сравнению с набором контрольных тестов. Схемы, которые еще никто не решал, не будут включены в общий счет.
Каждый участник может добавить один контрольный пример в тест (и все другие материалы будут переоценены, включая этот новый контрольный пример).
Файл эталонных тестов можно найти на GitHub .
Примеры
Вот несколько неоптимально решенных примеров.
Постоянная 1
1 1
1,1
///////
/
| |||
Количество домино: 12
ИЛИ ворота
2 1
0,1,1,1
///////////
|||||/
|||||
|||||\
Количество домино: 28
И ворота
2 1
0,0,0,1
///////////////////
\-/
- -
|||||/|\ /|||/
/ -
- \-
\- \ -
|||||\ / \ /
|\ |||||
Количество домино: 62
Поменять полосы
2 2
00,10,01,11
////////////
||||/ \||||
/\
\/
||||\ /||||
Количество домино: 36
Дополнительные замечания
Правила распространения таковы, что диагональные полосы могут пересекаться с использованием ромбовидной формы (см. Последний пример), даже если одна из них падает раньше другой (в отличие от реальных домино).
В качестве отправной точки вы можете использовать (не минимизированные) логические элементы в этой сущности и попытаться объединить как можно меньше из них. Для простого (неоптимального) способа построения произвольных логических функций из вентилей AND, OR и NOT взгляните на конъюнктивные и дизъюнктивные нормальные формы.
В этом репозитории GitHub имеется верификатор для проверки вашего кода, который также будет использоваться для оценки всех представленных материалов. Это выводит необработанные оценки (количество домино) и сохраняет их в файл для обработки отдельным счетчиком (также в этом хранилище) для получения окончательных результатов.
Общая документация может быть найдена в двух файлах Ruby, но она controller.rb
занимает два параметра командной строки перед файлом теста:
-v
дает вам больше выходных данных, включая фактические схемы, созданные вашим решателем.-c
позволяет вам выбрать подмножество тестов, которые вы хотите протестировать. Укажите нужные схемы в виде списка разделенных запятыми индексов на основе 1. Вы также можете использовать диапазоны Ruby, чтобы вы могли сделать что-то вроде-c 1..5,10,15..20
.
Пожалуйста, включите в свой ответ:
- Ваш код
- Команда (скомпилировать и) запустить ваш код. Я спрошу вас, где взять необходимые компиляторы / интерпретаторы, если у меня их нет.
- Дополнительная таблица истинности с именем, которая будет добавлена в качестве контрольного примера к тесту. (Это необязательно, но настоятельно рекомендуется.)
Я буду тестировать все материалы на Windows 8.
источник
Ответы:
C # - Массивное, медленное и неэффективное решение
Исповедь: написал это решение некоторое время назад, когда вопрос был еще в песочнице, но это не очень хорошо: вы можете сделать лучше!
Изменить: заменить скучное решение на менее скучный, более гибкий и в целом лучший метод
Вы запускаете программу, компилируя,
csc dominoPrinter.cs
а затем передавая аргументы в исполняемый файл, например (4-битная простейшая проверка):Объяснение:
«Domino Printer» - это трехступенчатая программа:
Этап 1 : «решатель» генерирует дерево выражений «ifnot» и «или» бинарных операций с заданными входами и «1» от линии электропередачи, есть 2 способа сделать это, в зависимости от количества входов:
Если входов меньше, чем 4, программа обрабатывает наименьшее количество операций.
Если имеется 4 или более входных данных, программа обрабатывает каждый 8-битный блок вывода, а затем объединяет результаты, чтобы получить желаемый результат. Гибкие биты, если они гибкие: чем больше битов, тем меньше решение, но тем дольше время выполнения.
«Решатель» - это то, что занимает все время (или, по крайней мере, раньше), а также большую часть кода. Я полагаю, что есть хорошо документированное, быстрое, не очень требовательное к памяти и, возможно, оптимальное решение этой проблемы, но где было бы весело искать ее?
(Bruted) дерево выражений для 4-битной простой проверки
где числа являются индексами входов.
Этап 2 : «Организатор» принимает дерево выражений в качестве входных данных и собирает «скелетный» макет, который точно описывает макет домино, сделанный из некоторого набора перекрывающихся ячеек 4x5. Ниже приведен скелет для 4-битной простой проверки на основе bruted (вам нужно изменить
bruteBase
целочисленную переменную в строке 473 на 4 (или больше), чтобы получить этот результат).Этот вывод фактически состоит из двух частей: «оценщик» справа, который создается из дерева выражений на этапе 1, и «коммутатор» слева, который меняет местами входы и разделяет их так, чтобы они поступали в правильные места для "оценщика" для обработки.
На данный момент существует много возможностей для сжатия макета, но в настоящее время программа выполняет очень мало такой работы. Код для этого этапа ужасен, но довольно прост (см. Метод «orifnot»). Выходной сигнал передается на этап 3.
Этап 3 : «Принтер» принимает выходные данные «органайзера» и печатает соответствующие перекрывающиеся «ячейки» 4x5 вместе с линией питания. Ниже приведена анимация проверки 4-битного простого критерия, проверяющего, является ли 5 простым числом.
Кодируйте отсутствие отступов, чтобы избежать превышения предела SE 30k символов, который в противном случае был бы :
Дополнительный контрольный пример:
Это проверяет, являются ли два смежных (без переноса) биты равными 1 (например, true для 0110, но false для 0101 и 1001)
источник
I
и в чьих выходах указывается новый макет домино