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.
(si le mod d'entrée 7 est 0, rien ne sort.)
code-golf
manufactoria
Keith Randall
la source
la source
Réponses:
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.
la source
5843 pièceshttp://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:
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:
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 parBB
).la source
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.
la source
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É
EDIT: optimisé 2 fois, un peu plus petit maintenant. (Déchets supprimés)
la source
111
, il sera toujours signalé comme étant divisible par 7. Ce n'est tout simplement pas vrai.