Мод 7 у мануфактурі


12

Простий виклик мануфактури. Обчисліть вхідний модуль 7. Вхід буде у двійковій програмі big-endian (синій = 1, червоний = 0). Вихід повинен бути в одному форматі.

Надані тестові справи. Найменша кількість рахунків виграє.

http://pleasingfungus.com/Manufactoria/?ctm=Mod7;Input:_binary_number_big_endian._Output:_that_binary_number_mod_7; 13; 3; 1 ;

(якщо вхідний модуль 7 дорівнює 0, нічого не виводиться.)


"Код-гольф" в даному випадку означає "найменше деталей"?
Джон Дворак

Оскільки я навіть не вирішив проблему збільшення, я не знаю, як це вирішити. Мануфактура - це весело.
Джастін

@JanDvorak: так.
Кіт Рендалл

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

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

Відповіді:


5

### Manufactoria, розміщено 85 частин

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

Розроблений в YEd, а потім був переписаний в Manufactoria.

На мою думку, використовується занадто багато конвеєрних стрічок.


5

58 43 частини

Знімок екрана на 43-х частинному режимі mod7 зменшують у мануфактурі

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; c16: 11f1; i15: 11f7; q14: 11f7; q13: 11f7; q12: 11f7; c11: 11f2; r15: 12f3; b14: 12f3; c12: 12f3; c15: 13f0; c14 : 13f0; c13: 13f0; r13: 12f3; y10: 3f3; c10: 4f2; g10: 5f1; q10: 6f4; y11: 3f0; q11: 4f6; r11: 5f3; p11: 6f4; b11: 7f1; i12: 4f7 ; c12: 5f3; q12: 6f0; g12: 2f3; c12: 3f3; p13: 4f6; y13: 3f0; c13: 5f0; c12: 7f3; b12: 8f3; & ctm = Mod7; Input: _binary_number_big_endian._Output_ _tbb_nb7 : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;

Ідея Кіта Рандалла про перше перетворення вхідного сигналу в одинарний була досить хорошою, тому я його вкрав. ;-) Зручно, що я просто витратив деякий час на оптимізацію невеликих бінарних перетворень на одинарний перетворювач у Manufactoria , тому просто вибрав одне з моїх майже працюючих рішень * із цього завдання та поєднав його з швидко оптимізованим лічильником mod-7.

Ця конструкція зараз в тій точці, коли для отримання роботів зверху вниз починають вимагати інакше марних додаткових конвеєрів. Будь-яке суттєве зменшення деталей, ймовірно, відбуватиметься завдяки перепроектуванню макета на високий і вужчий.

(* Цей виклик вимагав: а) дизайн повинен бути встановлений на дошці 7 × 7, і b) одинарний вихід має бути червоними маркерами. Якщо ви подивитеся на частину версії бінарного до одинарного перетворювача машини, ви зауважте, що, маючи одну або дві додаткові частини, вона може легко задовольнити будь-яку вимогу, але на жаль, не обидві.)


Ось попередня версія на 58 частин:

Знімок екрана з 58-частинним редуктором мод 7 у Виробництві із зазначенням станів

http://pleasingfungus.com/Manufactoria/?lvl=32&code=g12:2f3;q13:13f5 ;c14:13f0 ;c15:12f3;c9:6f2;c9:7f1;c9:8f1;c9:9f1;c10 Meridianf3 ; c10: 5f3; i10: 6f5; c10: 7f2; c10: 9f0; b11: 3f2; p11: 4f1; c11: 5f1; p11: 6f2; p11: 7f2; c11: 8f3; p11: 9f3; b11: 10f2; c12 : 3f2; c12: 4f2; c12: 5f0; r12: 6f3; c12: 7f3; i12: 8f1; i12: 9f5; y12: 10f3; c13: 3f2; c13: 4f3; i13: 5f1; c13: 6f3; c13: 7f2 ; i13: 8f0; c13: 9f1; c14: 3f3; c14: 4f2; p14: 5f5; c14: 6f1; p14: 7f6; p14: 8f7; r14: 9f3; c15: 4f3; q15: 5f0; c15: 6f3; c15 : 7f3; i15: 8f6; c15: 9f3; q15: 10f7; c15: 11f3; r12: 12f2; p13: 12f7; b14: 12f0; b14: 11f3; b12: 11f3; y14: 10f3; y15: 13f0; & ctm = Mod7 ; Вхід: _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:  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).


Я не знайшов вад у вашому дизайні. Гарна робота з економії місця.
Джон Дворак

Пс. Ось приємний тест для реалізацій на основі стану, таких як число: число 8890 = BRRRBRBRBBBRBR повинно дати вихід 0, відвідування кожного стану двічі (і стан 0 ще раз в кінці) та взяття кожного можливого переходу стану один раз.
Ільмарі Каронен


0

Я насправді не мав уявлення, що я роблю, але це працює, і я міг би стати переможцем (якби тільки тестові випадки були б достатними доказами). : D

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

EDIT: Оптимізовано 2 рази, зараз трохи менше. (Вилучено сміття)


Насправді я не знаю, чи буде вона працювати з більшою кількістю (або відрізняється від тестових випадків).
Лев Плуг

1
-1 працює лише для тестових випадків. Якщо число починається з 111, воно завжди буде повідомлятися як поділене на 7. Це просто не відповідає дійсності.
Джон Дворак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.