Um simples desafio Manufactoria. Calcule o módulo de entrada 7. A entrada será em binário big endian (azul = 1, vermelho = 0). A saída deve estar no mesmo formato.
Casos de teste fornecidos. A menor contagem de peças vence.
http://pleasingfungus.com/Manufactoria/?ctm=Mod7;Input:_binary_number_big_endian. 13; 3; 1 ;
(se o mod de entrada 7 for 0, não produza nada.)
code-golf
manufactoria
Keith Randall
fonte
fonte
Respostas:
O algoritmo é bastante direto: calcule o módulo usando uma máquina de estados (a maior parte com oito ramificações - um dos estados é duplicado para fins logísticos), depois codifique e colete os resultados. Como quase todos os resultados contêm um dígito, uma etapa extra de compressão é empregada para reduzir a quantidade de peças.
Projetado em yEd, depois transcrito para Manufactoria.
Usa muitas correias transportadoras, na minha opinião.
fonte
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._Output: _that_binary_number; : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;
A idéia de Keith Randall de primeiro converter a entrada em unária foi muito boa, então eu a roubei. ;-) Convenientemente, eu havia passado algum tempo otimizando pequenos conversores binários para unários em Manufactoria , então escolhi uma das minhas soluções quase em funcionamento * desse desafio e a combinei com um contador mod-7 rapidamente otimizado.
Esse projeto está agora no ponto em que apenas colocar os robôs de cima para baixo começa a exigir transportadores extras inúteis. Quaisquer reduções adicionais significativas de peças provavelmente virão da reformulação do layout para ser mais alto e mais estreito.
(* Esse desafio exigia a) o design para caber em uma placa 7 × 7 eb) a saída unária em marcadores vermelhos. Se você olhar a parte do conversor binário para unário da máquina acima, notará que, com uma ou duas partes extras, ela pode satisfazer facilmente qualquer um dos requisitos, mas, infelizmente, não os dois.)
Aqui está a versão 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 ; Input: _nome_binário_big_endiano._ Saída: _número_de_binário_mod_7; bbb: | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;
Como a solução de Jan Dvorak , isso também é baseado em um FSM de 7 estados. Marquei as portas correspondentes a cada estado na captura de tela para facilitar a leitura. A própria máquina de estado, no entanto, é realmente a parte mais fácil; a parte complicada é gerar a saída final com um número mínimo de portas.
Um truque que achei útil foi o loop de cópia final que muda tudo o que foi escrito antes do marcador amarelo até o fim (além de remover o marcador verde): isso me permitiu usar a repetição nos bits de saída de alta ordem gerando as saídas como:
Isso permite que eu combine principalmente os caminhos de saída das saídas 2, 4 e 5 (que começam com
BR
) e 3 e 6 (que começam comBB
).fonte
60 partes
Minha solução é um pouco diferente. Ele converte binário em unário primeiro, depois faz o mod 7. Não consigo derrotar Ilmari.
fonte
Na verdade, eu não tinha ideia do que estou fazendo, mas funciona e posso ser o vencedor (se apenas os casos de teste fossem prova suficiente). : D
EDIT: Otimizei-o 2 vezes, um pouco menor agora. (Lixo removido)
fonte
111
, ele sempre será relatado como divisível por 7. Isso simplesmente não é verdade.