58 43 части
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 частей:
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
).