Hier ist ein einfacher ASCII-Kunstschneemann :
_===_
(.,.)
( : )
( : )
Machen wir ihm ein paar Freunde. Dies wird das allgemeine Muster für unsere ASCII-Kunstschneefahrer sein:
HHHHH
HHHHH
X(LNR)Y
X(TTT)Y
(BBB)
Die führenden Leerzeichen und die Klammern sind für alle Schneemänner immer gleich. Die verschiedenen Buchstaben stellen Abschnitte des Musters dar, die sich individuell ändern können. Jeder Abschnitt verfügt über genau vier Vorgaben, mit denen ASCII-Zeichen gefüllt werden können. Durch Mischen und Anpassen dieser Voreinstellungen für alle acht Abschnitte können wir eine Vielzahl von Schneemännern erstellen.
Alle Voreinstellungen
(Beachten Sie, dass Leerzeichen in ansonsten leere Zeilen gesetzt werden, damit die Abschnittsform immer korrekt ist.)
H ist für Hut
Strohhut
_===_
Mexikanischer Hut
___ .....
Fez
_ /_\
-
___ (_*_)
N ist für Nase / Mund
Normal
,
Punkt
.
Linie
_
Keiner
L steht für das linke Auge
Punkt
.
Größerer Punkt
o
Größter Punkt
O
Geschlossen
-
R steht für das rechte Auge
(Gleiche Liste wie linkes Auge.)
X steht für den linken Arm
Normaler Arm
<
Arm nach oben
\
Arm nach unten
/
Keiner
Y steht für den rechten Arm
Normaler Arm
>
Arm nach oben
/
Arm nach unten
\
Keiner
T ist für Torso
Tasten
:
Weste
] [
Innere Arme
> <
Keiner
B steht für Base
Tasten
:
Füße
" "
Eben
___
Keiner
Herausforderung
Schreiben Sie ein Programm, das HNLRXYTB
eine achtstellige Zeichenfolge (über stdin oder Befehlszeile) in dem Format enthält , in dem jeder Buchstabe eine Ziffer von 1 bis 4 ist, die angibt, welche Voreinstellung für den entsprechenden Abschnitt des Schneemanns verwendet werden soll. Drucken Sie den vollen Schneemann auf stdout.
Die Eingabe 11114411
ist beispielsweise der Schneemann oben auf der Seite. (Erstens 1
: Er hat einen Strohhut, zweitens 1
: Er hat eine normale Nase usw.)
Ein weiteres Beispiel, der Schneemann für die Eingabe 33232124
:
_
/_\
\(o_O)
(] [)>
( )
Einzelheiten
Beliebige Mengen und Kombinationen von führenden / nachfolgenden Leerzeichen und führenden / nachfolgenden Zeilenumbrüchen sind zulässig, solange ...
- der Schneemann hat alle seine Abschnitte richtig zueinander angeordnet, und
- Es gibt nie mehr als 64 Whitespace-Zeichen insgesamt (das allgemeine Muster ist nur 7 × 5, sodass Sie dieses Limit wahrscheinlich nicht erreichen werden).
Sie müssen keine Zeilen / Spalten des Musters drucken, wenn sie nur Leerzeichen enthalten. zB die Leerzeile des Strohhutes wird nicht benötigt.
Sie müssen die oben angegebene Reihenfolge der Teile verwenden.
Anstelle eines Programms können Sie eine Funktion schreiben, die die Ziffernfolge als Argument verwendet. Die Ausgabe sollte normal gedruckt oder als Zeichenfolge zurückgegeben werden.
- Bei Bedarf können Sie die Eingabe als Ganzzahl anstelle einer Zeichenfolge behandeln.
Wertung
Der kürzeste Code in Bytes gewinnt.
Bonusfrage : Welcher der 65536 verschiedenen Schneemänner ist Ihr Favorit?
Antworten:
CJam,
135134132130126125 ByteUm die Datei auf Ihrem Computer zu erstellen, führen Sie aus
xxd -r > snowman.cjam
, fügen Sie den reversiblen Hexdump von oben ein, drücken Sie Enterund schließlich Ctrl+ D.Alternativ können Sie den Code online mit dem CJam-Interpreter testen .
Bonus
Mein Lieblingsschneemann ist Olaf:
Der Winter ist eine gute Zeit zum Kuscheln und Verweilen, aber wenn ich in den Sommer komme, werde ich ein… glücklicher Schneemann sein!
Idee
Die Hex-Zeichenfolge
codiert die möglichen Auswahlen für alle Teile des Schneemanns, einschließlich der festen. Lassen Sie uns diese Zeichenfolge nennen P .
Um es zu dekodieren, konvertieren wir P (hier als ein Array von Ganzzahlen behandelt) von der Basis 256 zur Basis 20 und ersetzen jede der resultierenden Ganzzahlen durch das entsprechende Zeichen der Zeichenkette M :
Dies ergibt den String T :
Die erste Zeile kodiert alle Hutwahlen, die letzten alle festen Körperteile. Die anderen Zeilen enthalten die 28 variablen Körperteile.
Wir teilen T in Zeilenvorschübe und teilen die Strings des resultierenden Arrays in vier Teile gleicher Länge. Dann lesen wir die Eingabe von STDIN, verschieben das Array seiner Ziffern in Basis 10 und wählen die entsprechenden Elemente der geteilten Zeichenfolgen aus. Wir machen uns die Tatsache zunutze, dass Arrays in CJam herumlaufen, sodass das Element am Index 4 eines Arrays der Länge 4 tatsächlich das erste Element ist. Die zuletzt geteilte Zeichenfolge entspricht keiner Eingabe und wird daher vollständig ausgewählt.
Wir behandeln den Hut, indem wir das erste Element aus dem resultierenden Array herausschieben. Der Index in M des ersten Zeichens, der als Zahl zur Basis 4 gelesen wird, gibt die Anzahl der Leerzeichen und Unterstriche in der ersten Zeile des Hutes an. Wir drucken diese Zeichen, einen Zeilenvorschub, ein Leerzeichen und den Rest der verschobenen Zeichenfolge. Dann schieben wir einen zusätzlichen Zeilenvorschub auf die Unterseite des Stapels.
Für die Körperteile verketten wir die Zeichenfolge, die allen von ihnen entspricht. Lassen Sie uns diese Zeichenfolge rufen S . Um die Körperteile zusammenzubauen, wir Transliteration ausführen: wir nehmen jedes Zeichen der Zeichenkette M , berechnet seinen Index in sort (M) und ersetzen sie durch das entsprechende Zeichen von S . Wir machen uns die Tatsache zunutze, dass der Transliterationsoperator S automatisch an die Länge der Sortierung (M) anpasst, indem er das letzte Zeichen von S so oft wie nötig wiederholt .
Zum Schluss teilen wir die resultierende Zeichenfolge in Teilzeichenfolgen der Länge 7 und platzieren einen Zeilenvorschub zwischen jedem Teilzeichenfolgenpaar.
Code
Nehmen wir an, dass die Variablen
M
undP
enthalten die Saiten M und P .quelle
JavaScript ES6,
210208202 BytesDies ist eine anonyme Funktion. Sie verwenden es, indem Sie ausführen
([function code])('42232124')
. Der erschwerendste Teil davon waren die Arme, die 2 Zeilen einnehmen, also musste ich Code für oben und unten einfügen.Das folgende Stack-Snippet enthält kommentierten, nicht mit ES6 versehenen Code. Damit können Sie den Code ganz einfach testen und verschiedene Kombinationen ausprobieren. Edit: Ich habe viel zu viel Spaß damit. Ich habe einige neue Funktionen hinzugefügt, darunter eine Möglichkeit, einen zufälligen Schneemann zu generieren.
Vielen Dank an Yair Rand für das Speichern von sechs Bytes.
quelle
1 1
->11
) entfernen und||' '
am Ende hinzufügen .CJam, 164 Bytes
Erzeugt den Schneemann von links nach rechts und von oben nach unten. Auf diese Weise müssen keine Fäden mehr zusammengefügt oder neu positioniert werden, da ich einfach jedes Stück des Schneemanns auf dem Stapel liegen lasse. Und dann, aufgrund des automatischen Stack-Dumps am Ende von Programmen:
♫ CJam will einen Schneemann bauen! ♫
Probieren Sie es online aus.
Bonus
In andere Richtungen denken!
32443333
gibt einem schneemann eine braut. Du musst ein bisschen versuchen, es zu sehen, aber es gibt die inneren Arme, Fez + untere Arme = Schleier, und der Kopf ist tatsächlich im Fez / Schleier. Die allgemein große Form ist das wogende Kleid, und die "Augen" und "Nase" sind Falten im Kleid.Andere "Auge" Entscheidungen sind ein bisschen riskant ...
quelle
Python,
276289 BytesDieser Code verfügt
\
zur besseren Lesbarkeit über 8 zusätzliche Bytes ( * 4).Baut den Schneemann Stück für Stück auf.
Bonus
F("44444432")
gibt "verschlafenen russischen Bären":quelle
Python 2,
354280241261 BytesAnrufen
s('33232124')
gibt:Aber meine Favoriten sind
44242123
und41341144
:quelle
s('33232124')
die Fez-Schrägstriche nicht gezeichnet. Tatsächlich fehlt in vielen Fällen die untere Hälfte des Hutes. Auch0
ist keine der Optionen.CJam,
150145 BytesBasis konvertieren alle Dinge!
SE mangelt an nicht druckbaren Dateien. Hier ist eine Kopie von Pastebin. Stellen Sie sicher, dass Sie den Teil "RAW Paste Data" kopieren, nicht den Teil neben den Zeilennummern. Sie können es online ausprobieren , aber der Permalink funktioniert in einigen Browsern möglicherweise nicht.
Erläuterung
Das
"b8li'U9gN;|"125:Kb8bp
Teil generiert das ArrayHiermit wird jede Ziffer der Eingabe dem Ort zugeordnet, an dem die Ziffer verwendet wird. Allen Eingaben (z. B. führenden Leerzeichen und
()
) , die allen Eingaben gemeinsam sind, wird willkürlich eine 0 zugewiesen, mit Ausnahme der ersten, die 1 zugewiesen wird, damit die Basiskonvertierung funktionieren kann.l:~f=
konvertiert dann jede Ziffer in ein int und ordnet sie entsprechend zu, zB für das14441133
wir bekommen"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f=
gibt die ZeichenfolgeDanach duplizieren wir, ersetzen
/<[(
mit\>])
und fügen einen langen String hinzu. Dann teilen wir den String in 4er - Gruppen auf und ordnen ihn einem anderen Array zu"r pL|P3{cR`@L1iT"Kb21b
. Auf diese Weise erhalten wir ein Array von Strings der Länge 4, die alle möglichen Optionen in jeder Zelle beschreiben (z. B._=./
sind alle möglichen Optionen für das zweite Zeichen in der zweiten Zeile ab dem Russischer Hut).Schließlich ordnen wir die Optionen den Eingaben entsprechend zu
.=
, teilen sie in Zeilen mit der Länge 7 auf7/
und riffeln einige Zeilenumbrüche einN*
.Testläufe
quelle
TI-BASIC, 397 Bytes
Wichtig: Wenn Sie dies testen möchten, laden Sie es von hier herunter und senden Sie die Datei an Ihren Rechner. Versuchen Sie nicht , den folgenden Code in den Programmeditor oder SourceCoder 3 von TI-Connect CE zu kopieren, um ihn zu erstellen, und senden Sie ihn an Ihren Rechner. Im Fall von TI-Connect wird ein ungültiges Token angezeigt. SC3 verwendet den umgekehrten Schrägstrich als Kommentarbegrenzer (
//
startet einen Kommentar in SC3;/\/
wird jedoch als exportiert//
) und exportiert daher die Arme und den Hut usw. nicht korrekt, wodurch das Programm die falschen Körperteile anzeigt und einen Wurf ausführt FEHLER: Von Zeit zu Zeit DOMAIN. Lustige Sachen!Wichtig Nr. 2: Ich bin zu faul, um den Download im Moment zu reparieren. Wenn Sie ihn also auf Ihren Rechner übertragen, ändern Sie den Wert
7
in der dritten Zeile von unten inX+6
. Der folgende Code ist behoben, wenn Sie vergleichen müssen.Bonus: Ich mag es besonders gern
12341214
.Einige Notizen:
[2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct)
) im Gegensatz zu einem Punkt, damit die Augen nicht mit dem Komma fluchten, weil das höllisch komisch aussieht.quelle
length(Ans
seinlength(Str9
; Zweitens, haben Sie versucht, Str3 bis Str6 zu einer einzigen Zeichenfolge zu kombinieren?C
280 272264 BytesZu diesem Zeitpunkt nur teilweise Golf gespielt, aber das ist eine lustige Herausforderung.
(Mit einigem Extra \ n für die Lesbarkeit.) Ich
define
gehe davon aus, dass das weitere Golfen ein Ende haben sollte.Eine lesbarere Version ist
quelle
C 212 Bytes
Eine lesbare Version:
Ich habe die Idee der Antwort von Reto Koradi entnommen . Ich habe einige unterhaltsame Verbesserungen vorgenommen, die möglicherweise eine separate Antwort rechtfertigen:
\"
(-3) zu erhaltent[i++]
durch*t++
(-4)while
durchfor
; entfernt{}
(-4)\0
(-9)t[...],t+=4
,(...)[t+=4]
um den Komma-Operator (-1) zu entfernenWarum all diese Schwierigkeiten? Um meinen Favoriten, den Schneegeister, zu teilen:
quelle
d
in den Eltern hintermain
JavaScript, 489 (ohne Zeilenumbrüche und Tabulatoren)
renn mit
node snowman.js 33232124
quelle
parseInt
Aufruf, da die Subtraktion automatisch versucht, Zeichenfolgenoperanden in Zahlen umzuwandeln. Außerdem können Sie diefunction
Umhüllung loswerden und einfach mit führeni=process.argv[2]
, es sei denn, Sie verwenden sie für die Rekursion oder das Variablenscoping. Darüber hinaus können Sies
vollständig loswerden und einfach tunconsole.log([ ... ].join('\n'))
.,
Zeichen hinzu, aber Sie können mehr als 50 entfernen. Schließlich würde eine sehr heikle Optimierung die Verwendung vonq=j[4]-1
anstelle vonq=j[4]==1
(und dann die Umkehrung Ihrer Verwendung vonq
und!q
) sein. Dies wird dazu führenq
, dass0
(ein falscher Wert), wenn dies der Fallj[4]
ist1
, und andernfalls ein wahrer Wert ungleich Null ist. Dies ist das genaue Gegenteil Ihrer aktuellen Wahr / Falsch-Werte. Sie schalten einfachq
und um!q
.Pyth, 203 Bytes
Lol. Probieren Sie es online aus: Pyth Compiler / Executor
Erläuterung
Zuerst definiere ich eine Hilfsfunktion
g
, die eine Liste und ein Zeichen als Eingabe verwendet, das Zeichen in seinen ASCII-Wert konvertiert und ein entsprechendes Element (modulares Wrapping) annimmt.Das andere ist, nur Zeile für Zeile zu drucken. Zum Beispiel ist die erste Zeile:
Btw. Ich habe ein bisschen experimentiert
.F"{:^7}"
, bei dem eine Saite zentriert ist. Wenn ich es benutze, könnte ich ein paar Leerzeichen in meinem Code speichern, aber am Ende werden keine Bytes gespeichert.quelle
R,
436437 BytesHier ist mein erster Versuch mit Code-Golf , wobei R nicht das kürzeste ist, aber trotzdem Spaß macht. Zumindest bin ich gegen JavaScript (für jetzt) ...
Testen:
Ich kämpfte tatsächlich mit
X
undY
war mehrzeilig, aber mit Dazwischen, und trennte schließlich jede Zeile in (X
,S
) und (Y
,U
).function
Die Konvertierung von String in Integer ist ebenfalls sehr ausführlich.Edit 436 => 437
Musste einen fehlenden leeren Raum reparieren, der von @OganM bemerkt wurde
Ich könnte die Zeilenumbrüche zwischen Variablen auf 428 reduzieren
;
, aber der "einzeilige" Code sieht so schlecht und unleserlich aus, dass ich nicht so gierig sein werde.quelle
Haskell,
361306289 BytesVerwendungszweck:
So funktioniert es: Indizieren Sie jedes Element der Liste von
[hat options, left upper arm options, left eye options, ..., base options]
mit der entsprechenden Eingangsnummer und verknüpfen Sie es zu einer einzigen Liste. Ich habe den linken und rechten Arm in einen oberen und einen unteren Teil geteilt, damit ich den Schneemann Zeile für Zeile bauen kann.Mein Favorit ist der Klassiker
11112211
.Bearbeiten: Wechselt von der Liste der Zeichenfolgen zu Zeichenfolgen für die Teile (Hut, Auge, ...). Benötigt einen zweiten Parameter, die Länge des zu nehmenden Teilstrings.
Edit II: extrahierte gemeinsame Teilstrings
quelle
C
233230 BytesMit Zeilenumbrüchen und Leerzeichen für bessere Lesbarkeit:
Das Ganze ist ziemlich brachial. Es wird eine Tabelle verwendet, die einen Eintrag für jedes der 35 (5 Zeilen mit der Länge 7) Zeichen enthält. Jeder Eintrag in der Tabelle ist entweder:
,
(
,)
. Die Länge des Tabelleneintrags beträgt 1 Zeichen.Der Code durchläuft dann die 35 Zeichen und schlägt den Wert in der Tabelle nach.
quelle
R 414 Bytes
Leicht modifizierte Version von Molx 'Version
Einfach die einzelnen Variablen zu einer zusammenfassen. Etwas Platz, der für
X=c(
Routinezwecke genutzt wurde.quelle
CJam,
200191 BytesDies kann sicherlich viel golfen werden. (Speziell wenn ich es Base codiere). Aber hier geht für den Anfang:
Die Eingabe erfolgt in STDIN. Beispielsweise gibt die Eingabe
23232223
Folgendes aus:Probieren Sie es hier online aus
quelle
Haskell, 333 Bytes
Meine erste Einreichung! Baut den Schneemann von oben nach unten, von links nach rechts. Ich habe die Arme für jeden Arm in zwei Funktionen aufgeteilt, den Teil neben dem Kopf und den Teil neben dem Körper.
Die Funktion s nimmt eine Liste von ganzen Zahlen und verkettet die Ausgabe der Funktionen, die die Körperteile erzeugen, wenn die richtigen Unterlisten der Eingabe gegeben sind.
Es hängt von der Funktion ab
Dies gibt das n-te Element der angegebenen Liste zurück. Dies ermöglicht die Liste der Hüte in, sowie Dinge wie
Alle diese Funktionen verwenden eine Beta-Reduktion, sodass ihr Argument als Index an die y-Funktion übergeben wird.
Ausgabe:
quelle
Python 3,
349336254251 BytesSoviel zu meiner Abschlussarbeit.
Hier ist der Inhalt der Datei snowman.py :
Und so zaubere ich meinen Lieblingsschneemann:
Erläuterung
quelle
[int(i)]
und entfernenfor
. Ebenso können Sie das Leerzeichen in Zeile 7 zwischenf(int(i))
und entfernenfor
. Außerdem müssen Sie in Ihrerprint()
Erklärung nicht das letzte Leerzeichen ausdrucken - es gehört nicht zum Schneemann. Ändern Sieprint()
abschließend Ihren Anruf in eine einzelne Leitungprint("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c))
. Jedes von diesen sollte Sie 1 Byte speichern, insgesamt 4 Bytesn
, können Sie auch ein Funktionsattribut definierenf
. Sie können also die Zeilen 5-6 durchdef f(m):f.n+=1;return l[4*m+int(b[f.n])-1]
<newline> ersetzenf.n=-1
. Dies reduziert 3 weitere Bytes.PowerShell , 199 Byte
Inspiriert von Reto Koradi und Anatolyg .
Probieren Sie es online!
Hinweis: Die Linie 3 hat 2 Trailfelder, die Linie 4 hat ein Trailfeld.
Mein Favorit ist
44444444
"sleepy russian guard":quelle
JavaScript (ES6), 247
Nicht so gute Anzeige @ NinjaBearMonkey's :(
Test im Snippet (mit Firefox)
quelle
05AB1E ,
137135128122 Bytes-6 Bytes dank @Grimy .
Probieren Sie es online aus oder überprüfen Sie ein paar weitere Testfälle .
Erläuterung:
Wir erstellen zuerst den Template-String:
Welches sieht so aus:
Dann schleife ich über die Ziffern der Eingabe:
Und machen Sie folgendes:
Verschieben Sie den (0-indizierten) Index
N
der Liste:Verschiebe alle möglichen Teile als Liste von Charakterlisten:
Verwenden Sie den Schleifenindex
N
, um die Zeichenliste des Teils abzurufen, mit dem wir gerade arbeiten:Teilen Sie dann die Zeichenliste in vier gleiche Teile auf und
y
indizieren Sie sie mit der eingegebenen Ziffer (die 1-indiziert ist). (HINWEIS: Da 05AB1E 0-indiziert ist, die Eingabe jedoch 1-indiziert ist, ist es logisch, die Ziffer vor der Indizierung um 1 zu verringern. Da 05AB1E jedoch einen automatischen Wraparound aufweist (dh die Indizierung3
in der Liste[1,3,5]
führt zu1
), führe ich dies einfach aus drehte die Teile einmal, so dass Teile mit Nr. 4 in der Herausforderungsbeschreibung an der Spitze der Listen stehen.)Und dann ersetze den 0-indizierten Index der Schleife, die wir zuerst verschoben haben, nacheinander durch die Teilzeichen:
Und am Ende wird das Ergebnis implizit ausgegeben.
In diesem meiner Tipps zu 05AB1E (Abschnitt Komprimieren großer Ganzzahlen und Komprimieren von Ganzzahllisten ) erfahren Sie , wie die Komprimierungsteile funktionieren.
Mein Favorit ist immer noch derselbe Schneehase wie vor 1,5 Jahren, als ich meine Java-Lösung veröffentlichte :
quelle
0
zwischen den Augen. :)Java 8,
548545432401399 BytesProbieren Sie es hier aus.
Erläuterung:
Mein Favorit:
Ich weiß nicht warum, aber es sieht irgendwie süß aus. Wie ein Hase mit russischem Hut statt Ohren.
quelle
F #, 369 Bytes
Probieren Sie es online!
Da
g
ein Array-Accessor verwendet wird, muss der Typ in der Funktionsdefinition explizit als a angegeben werdenstring
, weshalb die Funktionsdefinition über Folgendes verfügt(g:string)
.Abgesehen davon ist es normalerweise ein Array, auf das
strings
ein Index zugreift. Der Hut, der linke und der rechte Arm, die auf getrennten Linien laufen würden, sind in getrennte obere und untere Felder aufgeteilt. Diei
Funktion ändert eine Zahl im Argumentg
in den Array-Index. Und der Buchstabeb
ersetzt die Ein-Leerzeichen-Zeichenfolgen in den Arrays.Große Herausforderung! Mein Lieblingsschneemann ist wahrscheinlich
242244113
:Ich beobachte dich
quelle
PHP, 378 Bytes
Probieren Sie es online!
Ich mag weise Mr. Owl
31333342
quelle
Python 2.7, 257 Bytes (glaube ich)
wobei 'i' die Eingabe als String ist (zB "13243213")
quelle
i
fürinput()
insgesamt 262 Bytes ersetzenDart , 307 Bytes
Probieren Sie es online!
quelle
Zsh, 247 Bytes
Probiere es online aus !!
Lieblingsschneemann:
quelle