PowerShell v2 +, 217 205 190 187 184 byte
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]
Mengambil input $bsebagai integer. Perhatikan bahwa jika $bnegatif, Anda perlu mengelilinginya secara eksplisit dengan parens untuk memasukkannya dengan benar (lihat contoh), jika tidak, PowerShell akan menganggapnya sebagai string.
Terlepas dari arah mana tenda menghadap, baris pertama adalah sama, sekelompok garis bawah; sebenarnya 4*abs(input)banyak dari mereka. Angka itu juga disimpan $auntuk digunakan nanti. Selain itu, sekarang kami memiliki nilai absolut $bdisimpan ke dalam $a, kami berubah $bmenjadi Boolean untuk tanda, dan memilih garis miring kami disimpan ke dalam $ydan $z.
Baris berikutnya adalah membangun dan merumuskan output, dan itu adalah doozy, jadi mari kita jabarkan.
Kami pada dasarnya mengindeks ke dalam array dua elemen, (big long calculations saved into $x)atau $x, berdasarkan $b.
Perhitungannya adalah di mana badan tenda dibangun. Kami beralih dari 1..$a|%{...}. Setiap iterasi kami membangun garis badan tenda. Kita mulai dengan jumlah spasi yang sama dengan baris # yang kita gunakan -1, sehingga selaras kiri. Itu disimpan $wuntuk nanti, dan digabungkan dengan garis miring yang sesuai ($ z, berdasarkan $b), lalu jumlah bingkai pintu, lalu garis miring lainnya $y, lalu garis bawah atau spasi tergantung pada apakah kita berada di garis bawah atau tidak, kemudian garis miring lain $y, dan akhirnya jumlah spasi tambahan yang sesuai ( $w) untuk membangun string persegi panjang. Array string yang dihasilkan disimpan ke dalam $x.
Jika kiri setengah dari array yang dipilih (yaitu, $badalah Falsekarena input positif), maka kita harus mengulang melalui $xdan reverse setiap item baris - ini adalah di mana ruang Trailing ikut bermain; itu memungkinkan kita untuk hanya membalikkan garis daripada menghitung ulang jarak.
Jika $badalah True, maka kanan setengah dari array $xyang dipilih sebagai gantinya.
Dalam kedua kasus tersebut, pipeline sekarang berisi array string. Output implisit melalui Write-Outputterjadi pada penyelesaian program, dengan baris baru default antar elemen.
Contohnya
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\ / /
\ / /
\ / /
\ / /
\/_________/
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3misalnya?