Мод 7 в Мануфактуре


12

Простой мануфактурный вызов. Вычислить вход по модулю 7. Вход будет в двоичном формате с прямым порядком байтов (синий = 1, красный = 0). Вывод должен быть в том же формате.

Тестовые случаи предоставлены. Наименьшая часть подсчета выигрывает.

http://pleasingfungus.com/Manufactoria/?ctm=Mod7;Input:_binary_number_big_endian._Output:_that_binary_number_mod_7;bbb:|brrr:b|brrrr:br|bb:bb|bbrrb:brr|brrrrb:brb|bbrb:bbr; 13; 3; 1 ;

(если входной мод 7 равен 0, ничего не выводить.)


«код-гольф» в данном случае означает «наименьшее количество частей»?
Джон Дворак

Поскольку я даже не решил проблему увеличения, я понятия не имею, как ее решить. Мануфактура это весело.
Джастин

@JanDvorak: да.
Кит Рэндалл

@KeithRandall Мы никогда не отмечали код-гольф с мануфактурой. Мы должны либо удалить тег здесь, либо добавить его к другим вопросам.
Говард

@Howard: Я бы сказал , что добавить (или быстрый код или занят-бобра или кода вызов или любой другой лучше всего описывает скоринг), и пусть Manufactoria быть простым языком тегов .
Ильмари Каронен

Ответы:


5

### Мануфактура, размещено 85 деталей

Алгоритм довольно прост: вычисление модуля с использованием конечного автомата (большая часть с восемью ветвями - одно из состояний дублируется для логистических целей), затем кодирование и сбор результатов. Поскольку почти каждый результат содержит одну цифру, дополнительный шаг сжатия используется для уменьшения количества частей.

Разработан в YEd, затем переписан в Мануфактуру.

На мой взгляд, слишком много конвейерных лент.


5

58 43 части

Скриншот 43-х частей мод7 уменьшен в Мануфактуре

http://pleasingfungus.com/Manufactoria/?lvl=33&code=c16:9f0;q15:9f3;q14:9f3;q13:9f3;c12:9f3;c16:10f1;r15:10f3;r14:10f3;b13:10f3 ; Q12: 10f4; P11: 10f4; С16: 11f1; I15: 11f7; Q14: 11f7; Q13: 11f7; Q12: 11f7; с11: 11f2; r15: 12f3; B14: 12f3; с12: 12f3; с15: 13f0; с14 : 13f0; с13: 13f0; R13: 12f3; Y10: 3F3; с10: 4F2; G10: 5f1; q10: 6f4; Y11: 3f0; Q11: 4f6; r11: 5F3; P11: 6f4; B11: 7F1; I12: 4f7 ; с12: 5F3; Q12: 6f0; G12: 2F3; с12: 3F3; р13: 4f6; Y13: 3f0; с13: 5f0; с12: 7F3; b12: 8f3; & CTM = Mod7; Входной сигнал: _binary_number_big_endian._Output: _that_binary_number_mod_7; БББ : | бррр: б | бррр: бр | бб: бб | ббррб: бр | брррб: брб | ббрб: ббр; 13; 3; 1 ;

Идея Кейта Рэндалла о первом преобразовании ввода в унарный была довольно хороша, поэтому я украл ее. ;-) Для удобства я просто потратил некоторое время на оптимизацию небольших двоичных и унарных преобразователей в Manufactoria , поэтому просто выбрал одно из моих почти работающих решений * из этой задачи и объединил его с быстро оптимизированным счетчиком mod-7.

Эта конструкция сейчас находится в точке, когда для того, чтобы просто доставить робота сверху вниз, требуются дополнительные бесполезные дополнительные конвейеры. Любое существенное дальнейшее сокращение частей, вероятно, произойдет из-за изменения макета, чтобы он стал выше и уже.

(* Эта задача требовала, чтобы: a) дизайн поместился на плате 7 × 7, и б) унарный вывод имел красные маркеры. Если вы посмотрите на приведенную выше часть двоичного к унарному преобразователю, то заметите, что с одной или двумя дополнительными частями она может легко удовлетворить любое требование, но, увы, не оба.)


Вот предыдущая версия из 58 частей:

Снимок экрана редуктора мод 7 из 58 частей в Мануфактуре с пометкой состояний

http://pleasingfungus.com/Manufactoria/?lvl=32&code=g12:2f3;q13:13f5;c14:13f0;c15:12f3;c9:6f2;c9:7f1;c9:8f1;c9:9f1;c10:4f3 ; с10: 5F3; i10: 6f5; с10: 7f2; с10: 9f0; B11: 3F2; P11: 4F1; с11: 5f1; P11: 6F2; P11: 7f2; с11: 8f3; P11: 9F3; B11: 10f2; с12 : 3F2; с12: 4F2; с12: 5f0; r12: 6f3; с12: 7F3; I12: 8F1; I12: 9f5; Y12: 10f3; с13: 3F2; с13: 4F3; I13: 5f1; с13: 6f3; с13: 7f2 ; I13: 8f0; с13: 9F1; с14: 3F3; с14: 4F2; P14: 5f5; с14: 6F1; P14: 7F6; P14: 8f7; R14: 9F3; с15: 4F3; Q15: 5f0; с15: 6f3; с15 : 7F3; I15: 8f6; с15: 9F3; Q15: 10f7; с15: 11f3; r12: 12f2; р13: 12f7; B14: 12f0; B14: 11f3; b12: 11f3; Y14: 10f3; Y15: 13f0; & CTM = Mod7 ; Input: _binary_number_big_endian._Output: _that_binary_number_mod_7; bbb: | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;

Как и решение Яна Дворака , оно также основано на FSM из 7 штатов. Я пометил ворота, соответствующие каждому состоянию на скриншоте, чтобы их было легче читать. Сам конечный автомат, однако, действительно легкая часть; сложная часть генерирует окончательный результат с минимальным количеством ворот.

Один трюк, который я нашел полезным, заключительный цикл копирования, который смещает все, что написано до желтого маркера до конца (при этом также удаляя зеленый маркер): это позволило мне использовать повторение в старших битах вывода: генерирование выходов как:

0:  Y   ->
1: BY   ->   B
2:  YBR ->  BR 
3:  YBB ->  BB
4: RYBR -> BRR
5: BYBR -> BRB
6: RYBB -> BBR

Это позволяет мне в основном комбинировать выходные пути для выходов 2, 4 и 5 (которые все начинаются с BR) и 3 и 6 (которые начинаются с BB).


Я не нашел недостаток в вашем дизайне. Хорошая работа по экономии места.
Джон Дворжак

Ps. Вот хороший тест для реализаций на основе конечного автомата, например, такой: число 8890 = BRRRBRBRBBBRBR должно выдавать результат 0, дважды посещая каждое состояние (и еще раз состояние 0 в конце) и принимая каждый возможный переход состояния один раз.
Ильмари Каронен


0

На самом деле я понятия не имел, что я делаю, но это работает, и я мог бы стать победителем (если бы только тестовые случаи были достаточным доказательством). : D

введите описание изображения здесь

РЕДАКТИРОВАТЬ: Оптимизировано 2 раза, теперь немного меньше. (Удален мусор)


На самом деле я не знаю, будет ли он работать с большими числами (или отличаться от тестовых случаев).
Лео Пфлуг

1
-1 работает только для тестовых случаев. Если число начинается с 111, оно всегда будет делиться на 7. Это просто неверно.
Джон Дворак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.