Bild von mir, wie ich diese Herausforderung mit meinen fortgeschrittenen Zeichenfähigkeiten entwerfe.
Hintergrund
Die Stickman-Kriege ereigneten sich vor langer Zeit, als die dominierende Spezies der Erde nur aus Stöcken bestand. Historiker bedauern, dass es damals weder Maler noch Kameras gab. Wir könnten einige Bilder dieses Krieges in den heutigen Geschichtsbüchern verwenden. Hier werden Ihre Codierungsfähigkeiten nützlich. Strichmännchen lassen sich sehr leicht zeichnen, und Historiker konnten einige Daten darüber finden, wie viele Strichmännchen die Kriege geführt hatten¹. Jetzt liegt es an Ihnen, ein Bild des Augenblicks vor Kriegsbeginn zu erstellen!
Hier sind die mutigen Strichmännchen, die in den Krieg verwickelt sind:
O / | / | \ / | | / \ Schwertkämpfer OA / | \ | | | / \ | Spearman . . ' *. 'O * '\ | /. . | * './ \ *. Magier O / | \ | / \ Dorfbewohner O / | \ / \ Infant
Eingang
Erhalte über stdin oder ein Äquivalent eine Darstellung von jedem Stockmann, der auf jeder Seite des Schlachtfeldes erschien. Wenn zum Beispiel zwei Schwertkämpfer auf der rechten Seite und zwei Speermänner auf der linken Seite gekämpft haben, können Sie Folgendes eingeben {Sword: 2}, {Spear: 2}
: [2,0,0,0,0], [0,2,0,0,0]
oder a "WW", "SS"
.
Ausgabe
Eine Darstellung aller tapferen Strichmännchen auf einem Schlachtfeld gemäß den folgenden Regeln. Es kann auf stdout angezeigt oder in einer Datei gespeichert werden, unabhängig davon, was Ihr Boot bewegt.
Regeln
- Auf der linken Seite werden alle Stickmen des ersten Arrays / Strings / Objekts angezeigt, das Ihr Programm erhalten hat.
- Diese Strichmännchen müssen genau so aussehen wie die, die zuvor in dieser Frage gezeigt wurden.
- Die Reihenfolge der linken Armee muss sein
Infants Villagers Mages Swordsmen Spearmen
. - Die Armee der rechten Seite wird sich genauso verhalten, nur dass die Charaktere und die Reihenfolge gespiegelt sind.
- Jeder Strichmännchen wird durch 1 Leerzeichen getrennt.
- Jede Klasse wird durch 3 Leerzeichen getrennt.
- Die Armeen werden durch 8 Felder getrennt.
- Da Strichmännchen nicht fliegen, müssen Sie den Boden mit Bindestrichen zeichnen
-
. - Der Boden muss auf derselben Säule enden, auf der der letzte Stockmann der rechten Armee endet.
Beispiel
Nehmen wir an, mein Programm erwartet zwei Arrays mit der Länge 5 und jeder Wert im Array repräsentiert in der Reihenfolge Infants Villagers Mages Swordsmen Spearmen
.
Eingabe: [1,1,2,3,1] [0,0,1,1,1]
. . . . ' *. . ' *. . * '. O 'O *' O * O / O / O / OAAO \ O * O ' O / | \ '\ | /. '\ | /. | / | \ / | / | \ / | / | \ / / | \ | | / | \ \ / | \ | . \ | / ' / | \ | . | *. | * | | | | | | | | | | | | * | . / \ / \ './ \ *. './ \ *. / \ / \ / \ / \ | | / \ / \. * / \ '. -------------------------------------------------- -------------------------------------
Schlussbetrachtungen
Bitte beachte, dass Standardlücken gelten und der Magier nur deshalb völlig asymmetrisch ist.
Das Ergebnis der am besten bewerteten Antwort wird das "Titelbild" dieser Herausforderung sein. Die kürzeste Antwort bis zum Ende des Monats (31.08.2014) wird als Gewinner ausgewählt.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
¹Zitat erforderlich
quelle
IVMMWWWS SWM
im Rahmen von "irgendetwas, das Ihnen hilft"?Antworten:
JavaScript (E6) 336
344 356 369 424 478 522 570Änderung 6 Die letzte Änderung war fehlerhaft. Bugfix und verkürzt. Das ist alles was ich hoffe.
Edit 5 Endlich einen Weg gefunden, um die Multiplikation mit 23 loszuwerden - hat mich von Anfang an gestört. Plus eine weitere Änderung am Eingang (@William schreien, wenn es zu viel ist). Jetzt erwartet die Funktion einen Array-Parameter, der 2 Subarrays enthält. Ohne diese Änderung ist es 349 - immer noch eine Verbesserung
Edit 4 Rasiert noch ein paar Bytes und etwas Änderung am Eingabeformat. Mit dem neuen Eingabeformat wird eine fehlende Klasse als leeres Arrayelement dargestellt. Also
D([1,,2,3,1],[,3,1,1,2])
stattD([1,0,2,3,1],[0,3,1,1,2])
. Ich denke, es gehorcht immer noch den Regeln.Bearbeiten Sie 3 Golf mehr. Keine Änderungen am Algorithmus, aber Missbrauch vieler array.map- und lokaler Funktionen, um Schleifen zu vermeiden.
2- String-Komprimierung richtig bearbeiten ...
Bearbeiten Zusätzliche Komprimierung der Zeichenfolge, viel Arbeit und wenig Gewinn. Nun werden die Mirror Stickmen aus einer Vorlage generiert, nicht gespeichert.
Ich habe ein paar Versuche gemacht, als ich anfing zu rennen.
Golf spielen.NB Kolmogorow-Geschäft noch in Angriff genommen werden.Test In FireFox - Konsole.
Ändern Sie 'return' mitAdd 'alert (...)', um eine Ausgabeanweisung zu erhalten (wenn auch überhaupt nicht nützlich).console.log(D([[1,,2,3,1],[,3,1,1,2]]))
Ausgabe
Golf Code
Code (bearbeiten 2)
Ungolfed Code (1. Version)
quelle
Python
362353Bearbeiten: Entfernen einer for-Schleife und Verwenden der Exec-Anweisung, 9 Bytes gespeichert
Eingang:
Ausgabe:
quelle
C
418414Beispiel Eingabe:
Beispielausgabe:
Golfed Code (Zeilenumbrüche dienen nur der Lesbarkeit; es sollte eine lange Codezeile sein):
Die maximale Breite des Schlachtfeldes beträgt 999 (ich könnte 2 Zeichen sparen, indem ich es auf 99 beschränke). Ich habe eine Kontrollstruktur von 1 Byte pro Ausgabezeichen (ohne Leerzeichen) verwendet und die Zahlen von unten nach oben gezeichnet.
Es gibt 5 Offsets in der Kontrollstruktur.
Einige andere dunkle Teile:
f%27%5
übersetzt die ZeichenVWSMI
in Zahlen0, 1, 2, 3, 4
t*3%12%5+4
berechnet die Breite des Stickman vom Typt
t^3|~o||(s=d[5]+p,*s--=46,*s=39)
berücksichtigt die Links / Rechts-Asymmetrieargc=3
um Zeichenrichtungsflags1
und zu generieren-1
Ungolfed-Code:
quelle
*a
in ein Komma ändern ? Das beseitigt eine Warnung und hat die gleiche Anzahl von Bytes.f=*a
als Stoppbedingung; Compiler kann sich beschweren, aber ich meine es ernst. Ich kann es nicht entfernen, da diefor
-loop-Syntax zwei Semikolons enthalten sollte.Haskell, 556
Eingabeformat
Befehl: [Infant, Villager, Mage, Schwertkämpfer, Speermann], [Speermann, Schwertkämpfer, Magier, Dorfbewohner, Infant]
Beispielausgabe
Code
Ungolfed
quelle
Haskell (
736733720 Bytes)Rufen Sie mit ./stickmanwars 2 3 1 3 4 -1 3 2 4 1 0 4 2 1 an . Das -1 markiert das Trennzeichen für die beiden Arrays. Ich hoffe das ist okay.
Nun, meine erste Code-Golf-Herausforderung und das erste Mal, dass ich haskell für eine echte Anwendung verwendet habe, nachdem ich es in diesem Semester an meiner Universität gelernt habe. Wahrscheinlich nicht annähernd die beste oder kürzeste Lösung, aber ich hatte Spaß beim Erstellen und es war eine gute Übung :) Kritik und Feedback werden sehr geschätzt.
Golf daraus:
quelle
Haskell, 450
Coole Herausforderung! Ich könnte in der Lage sein, ein bisschen mehr Golf zu spielen. Grundsätzlich speichere ich die Zahlen spaltenweise, so dass ich sie leicht aneinander anhängen kann, und
String
drehe dann die gesamte Reihe mit Haskells umtranspose
.Das Eingabeformat ist
([Infants,Villagers,Mages,Swordsmen,Spearmen],[Infants,Villagers,Mages,Swordsmen,Spearmen])
Hier ist das Beispiel aus dem OP:
Und hier ist meine Lieblingsdarstellung des berüchtigten rituellen Kindermords in der zweiten Ära!
quelle
Python (
612,522,460, 440)Jede "Zeile" wird von Rechtspolstern befreit, und dies wird bei der Rekonstruktion wieder hinzugefügt.
Ich habe die Stickmen in meiner internen Codierung vorab umgekehrt, da ich sie beim Rendern im Code nicht einzeln umkehren musste.
Probelauf:
Code:
quelle
Python (476)
Ein anderer Löser als mein vorheriger; länger, aber funktionaler.
Code:
quelle