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]
Recebe a entrada $b
como um número inteiro. Observe que, se $b
for negativo, é necessário cercá-lo explicitamente com parênteses para convertê-lo adequadamente (veja exemplos); caso contrário, o PowerShell achará que é uma sequência.
Independentemente de qual direção a tenda está voltada, a primeira linha é a mesma, um monte de sublinhados; exatamente 4*abs(input)
muitos deles, na verdade. Esse número também é armazenado $a
para uso posterior. Além disso, agora que temos o valor absoluto de $b
armazenado em $a
, transformamos $b
em um booleano para seu sinal e escolhemos nossas barras armazenadas em $y
e $z
.
A próxima linha está construindo e formulando a saída, e é uma bagunça, então vamos detalhar.
Estamos essencialmente indexando em uma matriz de dois elementos, (big long calculations saved into $x)
ou com $x
base em $b
.
Os cálculos são onde o corpo da barraca é construído. Nós fazemos um loop 1..$a|%{...}
. A cada iteração, estamos construindo uma linha do corpo da barraca. Começamos com um número de espaços igual à linha em que estamos -1
, para que fique alinhado à esquerda. Isso é armazenado $w
para mais tarde e concatenado com a barra apropriada ($ z, com base em $b
), o número de espaços do doorframe, a outra barra $y
e os sublinhados ou espaços, dependendo se estamos no resultado final ou não, depois outra barra $y
e, finalmente, o número apropriado de espaços à direita ( $w
) para construir uma sequência retangular. Essa matriz resultante de strings é armazenada $x
.
Se a metade esquerda da matriz é seleccionado (ou seja, $b
é False
uma vez que a entrada foi positiva), em seguida, temos de percorrer $x
e reverso cada item de linha - isto é, onde os espaços à direita entram em jogo; permite simplesmente reverter as linhas em vez de recalcular as distâncias.
Se $b
for True
, a metade direita da matriz $x
é selecionada.
Em qualquer um dos casos, o pipeline agora contém uma matriz de seqüências de caracteres. Saída implícita via Write-Output
acontece na conclusão do programa, com nova linha padrão entre os elementos.
Exemplos
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\ / /
\ / /
\ / /
\ / /
\/_________/
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3
por exemplo?