Mod 7 in Manufactoria


12

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.

http://pleasingfungus.com/Manufactoria/?ctm=Mod7;Input:_binary_number_big_endian._Output:_that_binary_number_mod_7;bbb:|brrr:b|brrr:brr|brrb:brb:brb:; 13, 3, 1 ;

(Wenn der Eingangsmodus 7 0 ist, wird nichts ausgegeben.)


"Code-Golf" bedeutet in diesem Fall "kleinste Teile"?
John Dvorak

Da ich das Inkrementierungsproblem noch nicht einmal gelöst habe, weiß ich nicht, wie ich es lösen soll. Manufactoria macht Spaß.
Justin

@ JanDvorak: ja.
Keith Randall

@KeithRandall Wir haben Code-Golf nie mit manufactoria getaggt . Wir sollten entweder das Tag hier entfernen oder es zu den anderen Fragen hinzufügen.
Howard

@Howard: Ich würde es sagen hinzufügen (oder am schnellsten Code oder busy-Biber oder Code-Herausforderung oder was auch immer am besten beschreibt den Scoring), und lassen Sie Manufactoria ein einfacher sein Sprach - Tag .
Ilmari Karonen

Antworten:


5

### Manufactoria, 85 Teile platziert

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.


5

58 43 Teile

Screenshot über 43-teilige Mod7-Reduzierung in 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; : | 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:

Screenshot des 58-teiligen Mod 7-Reduzierers in Manufactoria, mit Statusbezeichnung

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:

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

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 beginnen BB) kombinieren .


Ich habe keinen Fehler in Ihrem Design gefunden. Gute Arbeit beim Platzsparen.
John Dvorak

Ps. Hier ist ein guter Test für zustandsmaschinenbasierte Implementierungen wie diese: Die Zahl 8890 = BRRRBRBRBBBRBR sollte die Ausgabe 0 ergeben, wobei jeder Zustand zweimal (und Zustand 0 am Ende noch einmal) besucht und jeder mögliche Zustandsübergang einmal ausgeführt wird.
Ilmari Karonen


0

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

Bildbeschreibung hier eingeben

BEARBEITEN: 2-mal optimiert, jetzt etwas kleiner. (Müll entfernt)


Eigentlich weiß ich nicht, ob es mit größeren Zahlen (oder anderen als den Testfällen) funktioniert.
Leo Pflug

1
-1 funktioniert nur für die Testfälle. Wenn die Zahl mit beginnt 111, wird sie immer als durch 7 teilbar gemeldet. Dies ist einfach nicht wahr.
John Dvorak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.