PowerShell v2 +, 217 205 190 187 184 bajtów
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]
Pobiera dane wejściowe $bjako liczbę całkowitą. Zauważ, że jeśli $bjest ujemne, musisz jawnie otoczyć go parens, aby odpowiednio rzucić (patrz przykłady), w przeciwnym razie PowerShell będzie myślał, że to ciąg.
Niezależnie od tego, w którą stronę skierowany jest namiot, pierwsza linia jest taka sama, kilka podkreślników; właściwie 4*abs(input)wielu z nich. Numer ten jest również zapisywany w $acelu późniejszego wykorzystania. Dodatkowo, teraz, gdy mamy wartość bezwzględną $bprzechowywaną w $a, zmieniamy $bsię w logiczną wartość jego znaku i wybieramy nasze ukośniki przechowywane w $yi $z.
Następnym wierszem jest konstruowanie i formułowanie danych wyjściowych, i to jest doozy, więc podzielmy to.
Zasadniczo indeksujemy do tablicy dwóch elementów (big long calculations saved into $x)lub $xna podstawie $b.
Obliczenia dotyczą budowy namiotu. Od pętli 1..$a|%{...}. W każdej iteracji budujemy linię ciała namiotu. Zaczynamy od liczby spacji równych linii #, w której się znajdujemy -1, dzięki czemu jest odpowiednio wyrównana do lewej. Jest to przechowywane na $wpóźniej i połączone z odpowiednim ukośnikiem ($ z, na podstawie $b), następnie liczba spacji w ramce drzwi, następnie drugi ukośnik $y, a następnie podkreślenia lub spacje, w zależności od tego, czy znajdujemy się w dolnej linii, czy nie, następnie kolejny ukośnik $yi wreszcie odpowiednia liczba końcowych spacji ( $w) do skonstruowania prostokątnego ciągu. Ta wynikowa tablica ciągów jest przechowywana w $x.
Jeśli wybrana jest lewa połowa tablicy (czyli $bjest Falseod wejścia była pozytywna), a następnie musimy pętli $xi odwrócić każdy element liniowy - to jest, gdy w grę wchodzą te spacje; pozwala nam po prostu odwrócić linie, a nie ponownie obliczyć odległości.
Jeśli $btak True, to $xzamiast tego wybrana jest prawa połowa tablicy .
W obu przypadkach potok zawiera teraz tablicę ciągów. Wyjście niejawne przez Write-Outputnastępuje po zakończeniu programu, z domyślną nową linią między elementami.
Przykłady
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\ / /
\ / /
\ / /
\ / /
\/_________/
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3?