Das Haus des Weihnachtsmannes

16

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.

ElPedro
quelle
Dies könnte einige Zeit im Sandkasten verbracht haben . Versuchen Sie, einen Parameter für die Größe des Hauses oder die Anzahl der verketteten Häuser (oder beides) hinzuzufügen. Ich finde es zu einfach, wie es ist. Sie können den Reim auch zu Ihrer Beispielausgabe hinzufügen - oder ihn gar nicht erwähnen. Ich finde dieses GIF schön oder dieses .
Titus
5
@Titus Das war in der Sandbox?
Adnan
4
@Titus Danke für das Feedback. Meine Absicht war es nicht, eine besonders schwierige Herausforderung zu schaffen, sondern eine, die ziemlich einfach zu schaffen ist und so viele Menschen wie möglich dazu ermutigt, Lösungen vorzuschlagen. Ich nehme Ihre Vorschläge für meinen nächsten Versuch an Bord.
ElPedro
1
Mein Fehler; Ich hatte zu komplexe Dinge für ASCII-Kunst erwartet. :) Aber die Gifs gefallen mir trotzdem.
Titus
Die Gifs sind cool und ich mag auch die Idee, den Reim auch in einer Wahl der Sprache
einzuschließen

Antworten:

10

Jelly , 40 39 36 Bytes

“ḥ%DtƊVḍI’ḃ9W;“|_/-\/\|‘Ė¤y@\FỌ»⁶s4Y

Probieren Sie es online!

Wie es funktioniert

“ḥ%DtƊVḍI’

ist ein bijektives Basis-250-Literal; Jedes Zeichen entspricht seinem Codepunkt in Jellys Codepage . Das Ergebnis ist die Ganzzahl 13192938935880491074 .

          ḃ9

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.

            W

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]] .

                          y@\

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 .

                             FỌ

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.

                                 s4Y

Teilt die generierte Zeichenfolge in Abschnitte der Länge vier und verbindet sie mit einem Zeilenvorschub als Trennzeichen.

Dennis
quelle
2
Beeindruckend. Einfach nur wow. +1
ElPedro
Aber warte, das sind Bytes?
Leif Willerts
1
@LeifWillerts Ja. Um nicht druckbare Zeichen zu vermeiden, verwendet Jelly eine benutzerdefinierte Codepage, die die 256 Zeichen, die sie versteht, als ein einzelnes Byte codiert. Der Byte- Link im Header verweist darauf.
Dennis
Entschuldigung, dass Sie nicht herausgefunden haben, auf diesen Link zu klicken: D
Leif Willerts
Es gewinnt so viel für die Erklärung wie alles andere. Respekt.
ElPedro
13

Javascript (ES6), 119 116 96 92 91 Bytes

for(i=8;i--;)console.log(`834
3554
2610
2160
7777`.replace(/./g,c=>'|/|/\\_\\- '[c<i?8:c]))

Arnauld
quelle
Gute Antwort. Ich hatte das Gefühl, dass Javascript dort oder in der
Nähe sein
Entschuldigung für die mehrfachen Änderungen. Ich sollte nicht vor dem 2. Kaffee posten.
Arnauld
Mehrfachbearbeitung ist gut. Schön zu sehen, dass die Anzahl der Bytes abnimmt.
ElPedro
Ist es sinnvoll, zwei identische Kopien des Codes in Ihrer Antwort zu haben?
Neil
@Neil - Ich behalte nur eine, bis ich einen guten Grund gefunden habe, zwei davon zu haben. ^^
Arnauld
9

Batch, 356 344 341 337 Bytes

@set s=@set "
%s%g=@goto 1
%s%r=
%s%c=
%s%u=|
%s%l=|
%s%f=
@for /l %%i in (1,1,7)do @call:%%i
%s%u=|\/|
%s%l=|/\|
%g%
:7
%s%u=|\/
%s%l=|/\
%g%
:6
%s%f=----
%g%
:5
%s%u=|\
%s%l=| \
%g%
:4
%s%c=/__\
%g%
:3
%s%r= /\
%s%c=/  \
%g%
:2
%s%r= /
%s%c=/
:1
@for %%l in ("%r%" "%c%" "%u%" "%l%" "%f%")do @echo(%%~l

Dumme |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 verwendete r, cund fVariablen leer sein könnte , und wir wollen nicht ECHO is off.gedruckt.

Bearbeiten: 12 Bytes durch Verwendung von Fallthrough für den letzten Teil gespeichert. Durch die Verwendung einer forSchleife 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.

Neil
quelle
2
Vielleicht nicht die kürzeste, aber ich bekomme eine Gegenstimme dafür, dass ich es in Batch +1
ElPedro,
echo:ist mehr Standard, echo(sieht aber so aus, als würdest du eine Sprachfunktion missbrauchen, also +1.
wizzwizz4
@ wizzwizz4 echo:schlägt in einigen Fällen fehl, aber ich kenne keine Fehlerfälle für echo(.
Neil
@ wizzwizz4 Wenn du eine Datei foo.batim aktuellen Verzeichnis hast , wird echo(\..\foo.batechos \..\foo.bataber echo:\..\foo.batausgeführt foo.bat.
Neil
@Neil Weißt du warum das so ist? Es scheint, als echo:.\foo.bathätte es stattdessen diesen Effekt. Liegt es an einem Verzeichnisstackfehler, bei dem das "UP" aus dem Stammverzeichnis das aktuelle Verzeichnis ist?
wizzwizz4
7

C 118 Bytes

main(){char *p,n;for(n='B';n++<'J';)for(p="ZFEAFDDEAGCHIAGHCIABBBBAA";*p;p++)putchar(" \n-\\_\\/|/|"[(*p<n)**p&15]);}
Martin Rosenau
quelle
Beeindruckend! Schöne erste Antwort und willkommen auf der Seite!
DJMcMayhem
1
So sparen Sie 3 Byte: char*p(kein Leerzeichen) und ändern Sie 'B'und 'J'in ihre ASCII-Codes.
Level River St
Danke für die Antwort. Ich hatte nicht erwartet, dass C überhaupt antreten würde. Das ist wirklich beeindruckend und es lohnt sich ein +1
ElPedro
6

/// 112 Bytes

/!/\/\///*/----
 !@/\\\\!$/ @@!^/
*@\/@@
@\/__@@
/*@
 $
*__
$
 $
*$
 __@
$
 $^$
 $^|@
|$^|@\/
|\/@^|@\/|
|\/@|
*

Probieren Sie es online!

Erik der Outgolfer
quelle
Ich verstehe kein einziges Byte der 112, aber ich habe es online ausprobiert und es macht genau das, was es
verspricht,
1
@ElPedro Klicken Sie auf den Link in der Kopfzeile, um das Konzept zu verstehen. Wenn nicht, melden Sie sich einfach bei mir. Ich möchte, dass immer mehr Menschen eine Sprache verstehen, und wenn Sie das nicht tun, ist das eine traurige Tatsache. Ich weiß, dass ich nicht jedem verständlich machen kann (manche Leute wollen nur Essen und Wasser, und PPCG sind weit davon entfernt, obwohl es nicht unmöglich ist).
Erik der Outgolfer
Vielen Dank. Es gibt so viele Sprachen zu lernen! Ich werde auf jeden Fall einen Blick darauf werfen. Ich spiele immer noch Golf in Python und Lotus Formula, aber ich beschäftige mich mehr damit. Mehr Sprachen machen mehr Spaß.
Nochmals vielen
2

PHP, 98 95 Bytes

inspiriert von Arnauld´s Lösung

for($i=8;$i--;)for($p=24;$p--;)echo"|/|/\\_\\- 
"[($c="977779061290162945539438"[$p])<$i?8:$c];

Hinweis: Die erste Codezeile enthält ein Leerzeichen.

Titus
quelle
Nice one @Titus. Nachgestellte Leerzeichen sind erlaubt.
ElPedro
@ElPedro: Ich kenne nur einige Leute, die dort Editoren konfiguriert haben, um sie automatisch zu kürzen. deshalb habe ich es erwähnt.
Titus
1

PHP mit GD, 348 338 Bytes (nicht konkurrierend)

nicht genau das, wonach gefragt wurde, aber ...

function f($v,$w){global$x,$y,$i;imageline($i,$x,$y,$x=$v,$y=$w,1);ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';}$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

In Datei speichern, Browser aufrufen

Nervenzusammenbruch

function f($v,$w)
{
    global$x,$y,$i;
    imageline($i,$x,$y,$x=$v,$y=$w,1);      // draw line, set end coords as new start coords
    ob_start();imagepng($i);$s=ob_get_clean();ob_end_clean();           // get image output
    echo'<img src="data:image/png;base64,',base64_encode($s),'" > ';    // print <img> tag
}
// calculate dimensions, create image, allocate background color (foreground implicitly black)
$i=imagecreate($w=9,$h=$w+$z=$w/2);imagecolorallocate($i,255,255,255);
// paint lines: implicit `$x=0`
f(--$w,$y=--$h);f(0,$z);f($w,$z);f($w/2,0);f(0,$z);f(0,$h);f($w,$z);f($w,$h);

Um ein größeres Haus zu zeichnen, ändern $w=9Sie die gewünschte Breite.

Titus
quelle
Und ich gebe diesem auch eine +1. Obwohl es nicht die direkte Herausforderung
anspricht,