Eine einfache Manufactoria-Herausforderung. Berechnen Sie das Eingangsmodul 7. Die Eingabe erfolgt im Big-Endian-Binärformat (blau = 1, rot = 0). Die Ausgabe sollte dasselbe Format haben.
Testfälle zur Verfügung gestellt. Die kleinste Teilezahl gewinnt.
(Wenn der Eingangsmodus 7 0 ist, wird nichts ausgegeben.)
code-golf
manufactoria
Keith Randall
quelle
quelle
Antworten:
Der Algorithmus ist recht einfach: Berechnen Sie den Modul mithilfe einer Zustandsmaschine (der größte Teil mit acht Zweigen - einer der Zustände wird zu logistischen Zwecken dupliziert), und codieren Sie dann die Ergebnisse und sammeln Sie sie. Da fast jedes Ergebnis eine Ziffer enthält, wird ein zusätzlicher Komprimierungsschritt angewendet, um die Anzahl der Teile zu verringern.
Entworfen in yEd, dann transkribiert nach Manufactoria.
Verwendet meiner Meinung nach viel zu viele Förderbänder.
quelle
5843 Teilehttp://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; : | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrb: brb | bbrb: bbr; 13; 3; 1 ;
Keith Randalls Idee , die Eingabe zuerst in unary umzuwandeln, war ziemlich gut, also habe ich sie gestohlen. ;-) Praktischerweise hatte ich gerade einige Zeit damit verbracht, kleine Binär-Unär-Wandler in Manufactoria zu optimieren , also wählte ich einfach eine meiner fast funktionierenden Lösungen * aus dieser Herausforderung und kombinierte sie mit einem schnell optimierten Mod-7-Zähler.
Diese Konstruktion ist jetzt an dem Punkt angelangt, an dem nur die Roboter von oben nach unten bewegt werden müssen, um ansonsten unnütze zusätzliche Förderbänder zu benötigen. Alle wesentlichen weiteren Teileeinsparungen ergeben sich wahrscheinlich aus der Neugestaltung des Layouts, damit es größer und schmaler wird.
(* Diese Herausforderung erforderte, dass a) das Design auf eine 7 × 7-Platine passt und b) die unäre Ausgabe in roten Markierungen vorliegt. Wenn Sie sich den obigen Binär-zu-Unär-Konverter-Teil der Maschine ansehen, werden Sie feststellen, dass er mit ein oder zwei zusätzlichen Teilen problemlos beide Anforderungen erfüllen kann, aber leider nicht beide.)
Hier ist die vorherige 58-teilige Version:
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 ; Eingabe: _binary_number_big_endian._Output: _that_binary_number_mod_7; bbb: | brrr: b | brrrr: br | bb: bb | bbrrb: brr | brrrb: brb | bbrb: bbr; 13; 1 ;
Wie die Lösung von Jan Dvorak basiert auch diese auf einem FSM mit sieben Zuständen. Ich habe die Gates für jeden Status im Screenshot beschriftet, um das Lesen zu erleichtern. Die Staatsmaschine selbst ist jedoch wirklich der einfache Teil; Der knifflige Teil ist das Erzeugen der endgültigen Ausgabe mit einer minimalen Anzahl von Gattern.
Ein Trick, den ich nützlich fand, war die letzte Kopierschleife, die alles, was vor dem gelben Marker geschrieben wurde, tonnenweise ans Ende verschiebt (und gleichzeitig den grünen Marker abstreift): Dadurch konnte ich die Wiederholung in den höherwertigen Ausgabebits von nutzen Generieren der Ausgaben als:
Dadurch kann ich meistens die Ausgabepfade für die Ausgänge 2, 4 und 5 (die alle mit beginnen
BR
) und 3 und 6 (die mit beginnenBB
) kombinieren .quelle
60 Teile
Meine Lösung ist ganz anders. Zuerst wandelt es Binär in Unär um, dann den Mod 7. Ich kann Ilmari nicht ganz schlagen.
quelle
Ich hatte eigentlich keine Ahnung, was ich tue, aber es funktioniert und ich könnte der Gewinner sein (wenn nur die Testfälle Beweis genug wären). : D
BEARBEITEN: 2-mal optimiert, jetzt etwas kleiner. (Müll entfernt)
quelle
111
, wird sie immer als durch 7 teilbar gemeldet. Dies ist einfach nicht wahr.