Mod 7 em Manufactoria


12

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


"código-golfe", neste caso, significa "menos peças"?
John Dvorak

Como ainda não resolvi o problema de incremento, não faço ideia de como resolver isso. Manufactoria é divertido.
Justin

@JanDvorak: sim.
Keith Randall

@KeithRandall Nós nunca etiquetamos code-golf com manufactoria. Devemos remover a tag aqui ou adicioná-la às outras perguntas.
Howard

@Howard: Eu diria que adicioná-lo (ou mais rápido código ou ocupado-castor ou código-desafio ou o que melhor descreve o placar), e deixe manufactoria ser uma simples marca de idioma .
Ilmari Karonen

Respostas:


5

Manufactoria, 85 peças colocadas

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.


5

58 43 partes

Captura de tela no mod7 de 43 partes reduz em 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._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:

Captura de tela do redutor de 58 partes mod 7 em Manufactoria, com os estados rotulados

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:

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

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


Não encontrei nenhuma falha no seu design. Bom trabalho para economizar espaço.
John Dvorak

Ps. Aqui está um bom teste para implementações baseadas em máquina de estado como esta: o número 8890 = BRRRBRBRBBBRBR deve fornecer a saída 0, visitando todos os estados duas vezes (e o estado 0 mais uma vez no final) e realizando uma única transição de estado possível.
Ilmari Karonen


0

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

insira a descrição da imagem aqui

EDIT: Otimizei-o 2 vezes, um pouco menor agora. (Lixo removido)


Na verdade, não sei se funcionará com números maiores (ou diferentes dos casos de teste).
Leo Pflug

1
-1 funciona apenas para os casos de teste. Se o número começar 111, ele sempre será relatado como divisível por 7. Isso simplesmente não é verdade.
John Dvorak
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.