PowerShell v2 +, 217 205 190 187 187 184 octets
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]
Prend entrée $b
comme un entier. Notez que si $b
est négatif, vous devez l'entourer explicitement de parens pour le caser correctement (voir les exemples), sinon PowerShell pensera que c'est une chaîne.
Quelle que soit la direction dans laquelle la tente fait face, la première ligne est la même, un tas de soulignements; exactement 4*abs(input)
beaucoup d'entre eux, en fait. Ce numéro est également stocké dans $a
pour une utilisation ultérieure. De plus, maintenant que nous avons la valeur absolue de $b
stocké dans $a
, nous nous transformons $b
en booléen pour son signe, et choisissons nos barres obliques stockées dans$y
et $z
.
La ligne suivante construit et formule la sortie, et c'est un doozy, alors décomposons-le.
Nous indexons essentiellement dans un tableau de deux éléments, (big long calculations saved into $x)
ou $x
, en fonction de$b
.
Les calculs sont l'endroit où le corps de la tente est construit. Nous bouclons 1..$a|%{...}
. À chaque itération, nous construisons une ligne du corps de la tente. Nous commençons avec un nombre d'espaces égal à la ligne # sur laquelle nous sommes -1
, afin qu'il soit correctement aligné à gauche. C'est stocké dans $w
pour plus tard, et concaténé avec la barre oblique appropriée ($ z, basée sur $b
), puis le nombre d'espaces d'encadrement de porte, puis l'autre barre oblique $y
, puis soit des traits de soulignement soit des espaces selon que nous sommes sur la ligne du bas ou non, puis une autre barre oblique $y
, et enfin le nombre approprié d'espaces de fin ( $w
) pour construire une chaîne rectangulaire. Ce tableau de chaînes résultant est stocké dans $x
.
Si la moitié gauche du tableau est sélectionnée (c'est-à- $b
dire False
que l'entrée est positive), alors nous devons parcourir$x
et inverser chaque élément de ligne - c'est là que les espaces de fin entrent en jeu; cela nous permet simplement d'inverser les lignes plutôt que de recalculer les distances.
Si $b
c'est le cas True
, alors la moitié droite du tableau$x
est sélectionnée à la place.
Dans les deux cas, le pipeline contient désormais un tableau de chaînes. Sortie implicite viaWrite-Output
se produit à la fin du programme, avec une nouvelle ligne par défaut entre les éléments.
Exemples
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\ / /
\ / /
\ / /
\ / /
\/_________/
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3
par exemple?