PowerShell v2 +, 217 205 190 187 184 Bytes
param($b)"_"*(($a=[math]::Abs($b))*4);$z,$y='/\'[($b=$b-lt0),!$b]
((($x=1..$a|%{($w=" "*($_-1))+$z+" "*(2*($a-$_))+$y+(' ','_')[$_-eq$a]*($a*2-1)+$y+$w})|%{-join$_[($a*4)..0]}),$x)[$b]
Übernimmt die Eingabe $b
als Ganzzahl. Wenn dies $b
negativ ist, müssen Sie es explizit mit Parens umgeben, um es entsprechend umzuwandeln (siehe Beispiele). Andernfalls wird PowerShell es für einen String halten.
Unabhängig davon, in welche Richtung das Zelt zeigt, ist die erste Zeile dieselbe, eine Reihe von Unterstrichen. eigentlich genau 4*abs(input)
viele von ihnen. Diese Nummer wird auch $a
zur späteren Verwendung gespeichert . Zusätzlich wenden wir uns, nachdem wir den absoluten Wert von $b
gespeichert haben $a
, zu$b
zu einem Booleschen für sein Vorzeichen und wählen unsere in $y
und gespeicherten Schrägstriche aus $z
.
In der nächsten Zeile wird die Ausgabe erstellt und formuliert, und sie ist doozy. Lassen Sie uns sie also aufschlüsseln.
Wir indizieren im Wesentlichen in ein Array aus zwei Elementen (big long calculations saved into $x)
oder $x
basierend auf$b
.
Die Berechnungen beziehen sich auf den Aufbau des Zeltkörpers. Wir fahren ab 1..$a|%{...}
. Bei jeder Iteration konstruieren wir eine Linie des Zeltkörpers. Wir beginnen mit einer Anzahl von Leerzeichen, die der Zeile # entsprechen, in der wir uns befinden -1
, damit sie linksbündig ausgerichtet ist. Das wird $w
für später gespeichert und mit dem entsprechenden Schrägstrich ($ z, basierend auf $b
), dann der Türrahmen-Anzahl von Leerzeichen, dann dem anderen Schrägstrich $y
, dann entweder Unterstrichen oder Leerzeichen, je nachdem, ob wir uns in der unteren Zeile befinden oder nicht, verknüpft. dann ein weiterer Schrägstrich $y
und schließlich die entsprechende Anzahl von nachgestellten Leerzeichen ( $w
), um eine rechteckige Zeichenfolge zu erstellen. Das resultierende Array von Zeichenfolgen wird in gespeichert$x
.
Wenn die linke Hälfte des Feldes ausgewählt wird (dh, $b
ist , False
da der Eingang positiv war), dann müssen wir eine Schleife durch$x
und jede Position rückwärts - dies ist , wo die hinteren Plätze ins Spiel kommen; Dies ermöglicht es uns, die Linien einfach umzukehren, anstatt Entfernungen neu zu berechnen.
Wenn $b
ja True
, dann die rechte Hälfte des Arrays$x
wird stattdessen ausgewählt.
In beiden Fällen enthält die Pipeline jetzt ein Array von Zeichenfolgen. Implizite Ausgabe überWrite-Output
erfolgt bei Programmabschluss mit Standard-Zeilenumbruch zwischen Elementen.
Beispiele
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\ / /
\ / /
\ / /
\ / /
\/_________/
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3
?