Un simple desafío de Manufactoria. Calcule el módulo de entrada 7. La entrada estará en binario big-endian (azul = 1, rojo = 0). La salida debe estar en el mismo formato.
Se proporcionan casos de prueba. El recuento de piezas más pequeño gana.
(si la entrada mod 7 es 0, no genera nada).
code-golf
manufactoria
Keith Randall
fuente
fuente
Respuestas:
El algoritmo es bastante sencillo: calcule el módulo utilizando una máquina de estados (la parte más grande con ocho ramas, uno de los estados está duplicado con fines logísticos), luego codifique y recopile los resultados. Como casi todos los resultados contienen un dígito, se emplea un paso de compresión adicional para reducir la cantidad de piezas.
Diseñado en yEd, luego transcrito a Manufactoria.
Utiliza demasiadas cintas transportadoras, en mi opinión.
fuente
5843 parteshttp://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; Entrada: _binary_number_big_endian._Outmod :_t_bmber__bq : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;
La idea de Keith Randall de convertir primero la entrada a unario fue bastante buena, así que la robé. ;-) Convenientemente, acabo de pasar un tiempo optimizando pequeños convertidores binarios a unarios en Manufactoria , así que elegí una de mis soluciones * casi operativas de ese desafío y la combiné con un contador mod-7 rápidamente optimizado.
Este diseño se encuentra ahora en el punto en el que simplemente llevar los robots de arriba hacia abajo comienza a requerir transportadores adicionales que de otra manera serían inútiles. Probablemente, cualquier otra reducción significativa de piezas vendrá de rediseñar el diseño para que sea más alto y estrecho.
(* Ese desafío requería a) que el diseño encajara en una placa de 7 × 7, yb) la salida unaria debía estar en marcadores rojos. Si observa la parte del convertidor binario a unario de la máquina anterior, notará que, con una o dos partes adicionales, puede cumplir fácilmente cualquiera de los requisitos, pero lamentablemente, no ambos).
Aquí está la versión anterior de 58 partes:
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 ; 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 ; Entrada: _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 ;
Al igual que la solución de Jan Dvorak , esto también se basa en un FSM de 7 estados. He etiquetado las puertas correspondientes a cada estado en la captura de pantalla para que sea más fácil de leer. La máquina de estado en sí misma, sin embargo, es realmente la parte fácil; La parte difícil es generar el resultado final con un número mínimo de puertas.
Un truco que encontré útil fue el bucle de copia final que desplaza todo lo escrito antes del marcador amarillo hasta el final (mientras también quita el marcador verde): esto me permitió hacer uso de la repetición en los bits de salida de alto orden generando las salidas como:
Esto me permite combinar principalmente las rutas de salida para las salidas 2, 4 y 5 (que comienzan con
BR
) y 3 y 6 (que comienzan conBB
).fuente
60 partes
Mi solución es bastante diferente. Convierte binario a unario primero, luego hace el mod 7. No puedo vencer a Ilmari.
fuente
En realidad no tenía idea de lo que estaba haciendo, pero funciona y podría ser el ganador (si solo los casos de prueba fueran prueba suficiente). :RE
EDITAR: optimizado 2 veces, un poco más pequeño ahora (basura eliminada)
fuente
111
, siempre se informará como divisible por 7. Esto simplemente no es cierto.