Mod 7 à Manufactoria

12

Un simple défi Manufactoria. Calculez l'entrée modulo 7. L'entrée sera en binaire big-endian (bleu = 1, rouge = 0). La sortie doit être au même format.

Cas de test fournis. Le plus petit nombre de pièces gagne.

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|brrrrbb:b| 13, 3, 1 ;

(si le mod d'entrée 7 est 0, rien ne sort.)

Keith Randall
la source
"code-golf" dans ce cas signifie "le moins de pièces"?
John Dvorak
Comme je n'ai même pas résolu le problème d'incrémentation, je ne sais pas comment résoudre ce problème. Manufactoria est amusant.
Justin
@JanDvorak: oui.
Keith Randall
@KeithRandall Nous n'avons jamais tagué code-golf avec manufactoria. Nous devons soit supprimer la balise ici, soit l'ajouter aux autres questions.
Howard
@Howard: Je dirais l'ajouter (ou le code le plus rapide ou le castor occupé ou le défi de code ou tout ce qui décrit le mieux la notation), et laisser manufactoria être une simple balise de langue .
Ilmari Karonen du

Réponses:

5

### Manufactoria, 85 pièces placées

L'algorithme est assez simple: calculer le module à l'aide d'une machine à états (la plus grande partie avec huit branches - l'un des états est dupliqué à des fins logistiques), puis encoder et collecter les résultats. Étant donné que presque chaque résultat contient un chiffre, une étape de compression supplémentaire est utilisée pour réduire la quantité de pièces.

Conçu en yEd, puis transcrit à Manufactoria.

Utilise beaucoup trop de bandes transporteuses, à mon avis.

John Dvorak
la source
5

58 43 pièces

Capture d'écran sur le mod7 en 43 parties réduit à 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; Entrée: _binary_number_big_endian._Output: _that_b__bb_mod : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrrb: brb | bbrb: bbr; 13; 3; 1 ;

L'idée de Keith Randall de convertir d'abord l'entrée en unaire était assez bonne, alors je l'ai volée. ;-) Commodément, je venais de passer un peu de temps à optimiser les petits convertisseurs binaires-unaires à Manufactoria , alors je viens de choisir l'une de mes solutions presque fonctionnelles * de ce défi et de la combiner avec un compteur mod-7 rapidement optimisé.

Cette conception est maintenant au point où le simple fait de déplacer les robots de haut en bas commence à nécessiter des convoyeurs supplémentaires autrement inutiles. Toute autre réduction importante des pièces proviendra probablement de la refonte de la disposition pour qu'elle soit plus haute et plus étroite.

(* Ce défi nécessitait a) la conception pour s'adapter sur une carte 7 × 7, et b) la sortie unaire soit en marqueurs rouges. Si vous regardez la partie convertisseur binaire-unaire de la machine ci-dessus, vous remarquerez qu'avec une ou deux pièces supplémentaires, elle peut facilement satisfaire l'une ou l'autre des exigences, mais hélas, pas les deux.)


Voici la version précédente en 58 parties:

Capture d'écran du réducteur mod 7 en 58 parties à Manufactoria, avec les états étiquetés

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 ; Entrée: _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 ;

Comme la solution de Jan Dvorak , celle-ci est également basée sur un FSM à 7 états. J'ai étiqueté les portes correspondant à chaque état dans la capture d'écran pour en faciliter la lecture. La machine d'état elle-même, cependant, est vraiment la partie facile; la partie délicate génère la sortie finale avec un nombre minimal de portes.

Une astuce que j'ai trouvée utile était la boucle de copie finale qui déplace tout ce qui est écrit avant le marqueur jaune à la fin (tout en supprimant le marqueur vert): cela m'a permis d'utiliser la répétition dans les bits de sortie d'ordre supérieur par générer les sorties comme:

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

Cela me permet principalement de combiner les chemins de sortie pour les sorties 2, 4 et 5 (qui commencent toutes par BR) et 3 et 6 (qui commencent par BB).

Ilmari Karonen
la source
Je n'ai trouvé aucun défaut dans votre conception. Bon travail pour économiser de l'espace.
John Dvorak
Ps. Voici un bon test pour les implémentations basées sur une machine à états comme celle-ci: le nombre 8890 = BRRRBRBRBBBRBR devrait donner la sortie 0, visiter chaque état deux fois (et l'état 0 une fois de plus à la fin) et prendre chaque transition d'état possible une fois.
Ilmari Karonen du
2

60 pièces

Ma solution est un peu différente. Il convertit d'abord le binaire en unaire, puis le mod 7. Je ne peux pas vraiment battre Ilmari.

entrez la description de l'image ici

Keith Randall
la source
Vous savez, vous pourriez probablement le faire si vous optimisiez ce convertisseur .
Ilmari Karonen
0

En fait, je n'avais aucune idée de ce que je fais, mais cela fonctionne et je serais peut-être le gagnant (si seulement les cas de test pouvaient suffire) :RÉ

entrez la description de l'image ici

EDIT: optimisé 2 fois, un peu plus petit maintenant. (Déchets supprimés)

Leo Pflug
la source
En fait, je ne sais pas si cela fonctionnera avec des nombres plus grands (ou différents que les cas de test).
Leo Pflug
1
-1 ne fonctionne que pour les cas de test. Si le nombre commence par 111, il sera toujours signalé comme étant divisible par 7. Ce n'est tout simplement pas vrai.
John Dvorak