Mod 7 en Manufactoria

12

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.

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:brbbr; 13; 3; 1 ;

(si la entrada mod 7 es 0, no genera nada).

Keith Randall
fuente
"código-golf" en este caso significa "menos partes"?
John Dvorak
Como ni siquiera he resuelto el problema de incremento, no tengo idea de cómo resolverlo. Manufactoria es divertida.
Justin
@ JanDvorak: sí.
Keith Randall
@KeithRandall Nunca etiquetamos code-golf con manufactoria. Deberíamos eliminar la etiqueta aquí o agregarla a las otras preguntas.
Howard
@Howard: diría que lo agregue (o código más rápido o castor ocupado o desafío de código o lo que mejor describa la puntuación), y deje que manufactoria sea ​​una simple etiqueta de idioma .
Ilmari Karonen

Respuestas:

5

### Manufactoria, 85 piezas colocadas

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.

John Dvorak
fuente
5

58 43 partes

Captura de pantalla sobre la reducción de mod7 de 43 partes en Manufactoria

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; 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:

Captura de pantalla del reductor mod 7 de 58 partes en Manufactoria, con estados etiquetados

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:

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

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 con BB).

Ilmari Karonen
fuente
No he encontrado ningún defecto en su diseño. Buen trabajo en ahorrar espacio.
John Dvorak
PD. Aquí hay una buena prueba para implementaciones basadas en máquinas de estado como esta: el número 8890 = BRRRBRBRBBBRBR debe dar la salida 0, visitar cada estado dos veces (y el estado 0 una vez más al final) y tomar una vez cada transición de estado posible.
Ilmari Karonen 01 de
2

60 partes

Mi solución es bastante diferente. Convierte binario a unario primero, luego hace el mod 7. No puedo vencer a Ilmari.

ingrese la descripción de la imagen aquí

Keith Randall
fuente
Sabes, probablemente podrías si optimizases ese convertidor .
Ilmari Karonen
0

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

ingrese la descripción de la imagen aquí

EDITAR: optimizado 2 veces, un poco más pequeño ahora (basura eliminada)

Leo Pflug
fuente
En realidad, no sé si funcionará con números más grandes (o diferentes a los casos de prueba).
Leo Pflug
1
-1 solo funciona para los casos de prueba. Si el número comienza con 111, siempre se informará como divisible por 7. Esto simplemente no es cierto.
John Dvorak