Das Haus des Weihnachtsmannes
Hinweis: Dies ist die erste Herausforderung, die ich eingestellt habe. Es ist durch die Sandbox gegangen, aber wenn Sie etwas falsch finden, stimmen Sie nicht einfach ab, sondern hinterlassen Sie einen Kommentar, damit ich es verbessern kann.
Hintergrund
Es gibt ein altes Kinderpuzzle, bei dem die Herausforderung darin besteht, eine Box mit einem Dach und einem Kreuz durch die Mitte zu zeichnen, ohne den Stift vom Papier zu heben oder eine Linie zweimal zu durchlaufen.
In Deutschland ist es als "das Haus des Nikolaus" oder "Das Haus des Weihnachtsmannes" bekannt. Ich kann mich ehrlich gesagt nicht erinnern, wie wir es früher genannt haben. Für alle, die mit dem Puzzle nicht vertraut sind, finden Sie hier alle Details .
Hier ist eine ASCII-Kunstdarstellung des Hauses.
/\
/__\
|\/|
|/\|
----
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, um das Haus des Weihnachtsmanns in einer Sprache Ihrer Wahl zu zeichnen.
Hört sich zu einfach an? Hier ist der Haken. Es muss auch jede Stufe der Zeichnung ausgeben und den Regeln des Puzzles entsprechen. Ihr Programm muss keine Eingaben vornehmen. Das fertige Haus muss genau so aussehen wie oben gezeigt.
Laut der obigen Seite gibt es 44 mögliche Lösungen. Sie können einen von ihnen verwenden. Dies ist eine ASCII-Kunstherausforderung, daher müssen Sie die Lösung nicht berechnen, sondern nur zeichnen.
Ausgabe
Ein Beispiel für die erforderliche Ausgabe einer der 44 Lösungen ist nachstehend aufgeführt:
----
\
\
----
__
\
\
----
\
__\
\
\
----
/\
/__\
\
\
----
/\
/__\
|\
| \
----
/\
/__\
|\/
|/\
----
/\
/__\
|\/|
|/\|
----
Regeln
- Ich habe zwischen jeder erwarteten Ausgabe eine zusätzliche Zeile eingefügt, um die Anforderungen klarer darzustellen. Dies ist optional. Es sind beliebig viele Leerzeilen zwischen den einzelnen Ausgaben zulässig.
- Ihre Ausgabe darf nur aus den oben gezeigten Zeichen /, \, -, _ und Leerzeichen bestehen. Nachgestellte Leerzeichen sind erlaubt.
- Jede Linie in Ihrer Zeichnung muss am Ende der vorherigen Linie fortgesetzt werden, und Sie dürfen keine Linie wiederholen.
- Standardlücken verboten.
- Sie müssen den oben genannten Reim nicht ausgeben.
- Dies ist Codegolf, sodass die kürzeste Antwort in Bytes der Gewinner ist.
Ergebnis
Einige tolle Antworten und vielen Dank und Respekt an alle, die gepostet haben. Ich habe die niedrigste Byteanzahl gesagt, aber ich habe nicht nur dafür, sondern auch für die großartige Erklärung des Codes als beste Antwort markiert. Schön, @Dennis.
Antworten:
Jelly ,
403936 BytesProbieren Sie es online!
Wie es funktioniert
ist ein bijektives Basis-250-Literal; Jedes Zeichen entspricht seinem Codepunkt in Jellys Codepage . Das Ergebnis ist die Ganzzahl 13192938935880491074 .
wandelt die generierte Ganzzahl in die bijektive Basis 9 um und ergibt das Ganzzahl-Array
[9, 6, 7, 9, 6, 2, 2, 7, 1, 5, 3, 8, 1, 3, 5, 8, 4, 4, 4, 4] . Die Ganzzahlen entsprechen der Reihenfolge des Strichs, mit Ausnahme von 9 , die ein Leerzeichen angibt.
Wickelt das generierte Array in ein Singleton-Array um, das dem Array, das wir jetzt generieren, vorangestellt werden muss.
funktioniert wie folgt.
¤
kombiniert die beiden linken Glieder zu einer Niladenkette. Der erste“|_/-\/\|‘
liefert die Codepunkte der angegebenen Zeichen und ergibt [124, 95, 47, 45, 92, 47, 92, 124] . DannĖ
zählt die Codepunkte, wodurch man[[1, 124], [2, 95], [3, 47], [4, 45], [5, 92], [6, 47], [7, 92] , [8, 124]] . Das Paar [n, c] bedeutet, dass der n- te Strich das ASCII-Zeichen mit dem Codepunkt c ist .
verkettet die generierten Arrays. Das Ergebnis ist das Array
[[9,6,7,9,6,2,2,7,1,5,3,8,1,3,5,8,4,4,4], [1,124 ], [2,95], [3,47], [4,45], [5,92], [6,47], [7,92], [8,124]] .
Führt eine kumulative Reduzierung durch (dh zeigt alle Zwischenschritte an), wobei Transliteration (
y
) mit ausgetauschten Argumenten (@
) verwendet wird. Im ersten Schritt ersetzen wir z. B. jede 1 im ursprünglichen Array durch 124 , was der Codepunkt des Zeichens | ist .Verflacht das Ergebnis und ersetzt alle Codepunkte durch die entsprechenden ASCII-Zeichen. In allen Schritten werden einige nicht druckbare Zeichen mit den Codepunkten 1 bis 9 generiert .
Nimmt das zeichenweise Maximum mit dem Leerzeichen und ersetzt alle nicht druckbaren Zeichen durch Leerzeichen.
Teilt die generierte Zeichenfolge in Abschnitte der Länge vier und verbindet sie mit einem Zeilenvorschub als Trennzeichen.
quelle
Javascript (ES6),
119116969291 Bytesquelle
Batch,
356344341337 BytesDumme|
Regeln für das Batch- Zitieren ... Wenn Sie|
eine Variable in einer Variablen zitieren möchten , müssen Sie diese mit drei^
s zitieren. Daher ist es billiger, sie@
stattdessen zu verwenden und bei der Ausgabe zu ersetzen. Um dies zu erreichen, muss ich jedoch mit der linken Wand beginnen. Zeile eins hat ein Leerzeichen.echo(
wird , weil die verwendeter
,c
undf
Variablen leer sein könnte , und wir wollen nichtECHO is off.
gedruckt.Bearbeiten: 12 Bytes durch Verwendung von Fallthrough für den letzten Teil gespeichert. Durch die Verwendung einer
for
Schleife zum Drucken jedes Teils wurden 3 Bytes gespart. Dies bedeutet, dass ich jetzt|
s in meinen Variablen verwende, wodurch der Code etwas einfacher zu lesen ist. 4 Bytes mit expliziten@
Zeichen anstelle von gespeichert@echo off
. Ich denke, beginnend mit der linken Wand werden immer noch die wenigsten Bytes benötigt.quelle
echo:
ist mehr Standard,echo(
sieht aber so aus, als würdest du eine Sprachfunktion missbrauchen, also +1.echo:
schlägt in einigen Fällen fehl, aber ich kenne keine Fehlerfälle fürecho(
.foo.bat
im aktuellen Verzeichnis hast , wirdecho(\..\foo.bat
echos\..\foo.bat
aberecho:\..\foo.bat
ausgeführtfoo.bat
.echo:.\foo.bat
hätte es stattdessen diesen Effekt. Liegt es an einem Verzeichnisstackfehler, bei dem das "UP" aus dem Stammverzeichnis das aktuelle Verzeichnis ist?C 118 Bytes
quelle
char*p
(kein Leerzeichen) und ändern Sie'B'
und'J'
in ihre ASCII-Codes./// 112 Bytes
Probieren Sie es online!
quelle
PHP,
9895 Bytesinspiriert von Arnauld´s Lösung
Hinweis: Die erste Codezeile enthält ein Leerzeichen.
quelle
PHP mit GD,
348338 Bytes (nicht konkurrierend)nicht genau das, wonach gefragt wurde, aber ...
In Datei speichern, Browser aufrufen
Nervenzusammenbruch
Um ein größeres Haus zu zeichnen, ändern
$w=9
Sie die gewünschte Breite.quelle