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]
Toma la entrada $b
como un entero. Tenga en cuenta que si $b
es negativo, debe rodearlo explícitamente con parens para emitirlo adecuadamente (ver ejemplos), de lo contrario, PowerShell pensará que es una cadena.
Independientemente de en qué dirección esté mirando la carpa, la primera línea es la misma, un montón de guiones bajos; exactamente 4*abs(input)
muchos de ellos, en realidad. Ese número también se almacena $a
para su uso posterior. Además, ahora que tenemos el valor absoluto de $b
almacenado en $a
, nos convertimos $b
en un booleano para su signo y elegimos nuestras barras almacenadas en $y
y $z
.
La siguiente línea es la construcción y formulación de la salida, y es un doozy, así que vamos a desglosarlo.
Básicamente, estamos indexando en una matriz de dos elementos, (big long calculations saved into $x)
o $x
, en base a $b
.
Los cálculos son donde se construye el cuerpo de la tienda. Hacemos un bucle desde 1..$a|%{...}
. Cada iteración estamos construyendo una línea del cuerpo de la tienda. Comenzamos con una cantidad de espacios igual a la línea # en la que estamos -1
, para que esté alineada a la izquierda de manera apropiada. Eso se almacena $w
para más adelante, y se concatena con la barra inclinada apropiada ($ z, según $b
), luego el número de espacios en el marco de la puerta, luego la otra barra inclinada $y
, luego los guiones bajos o espacios dependiendo de si estamos en la línea de fondo o no, luego otra barra oblicua $y
, y finalmente el número apropiado de espacios finales ( $w
) para construir una cadena rectangular. Esa matriz resultante de cadenas se almacena en $x
.
Si se selecciona la mitad izquierda de la matriz (es decir, $b
es False
desde la entrada era positivo), entonces tenemos que bucle a través de $x
y revertir cada elemento de línea - aquí es donde los espacios finales entran en juego; nos permite simplemente invertir las líneas en lugar de volver a calcular distancias.
Si $b
es así True
, se selecciona la mitad derecha de la matriz $x
.
En cualquier caso, la tubería ahora contiene una serie de cadenas. La salida implícita a través de Write-Output
ocurre al finalizar el programa, con una nueva línea predeterminada entre los elementos.
Ejemplos
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\ / /
\ / /
\ / /
\ / /
\/_________/
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3
por ejemplo?