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 $b
sebagai integer. Perhatikan bahwa jika $b
negatif, 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 $a
untuk digunakan nanti. Selain itu, sekarang kami memiliki nilai absolut $b
disimpan ke dalam $a
, kami berubah $b
menjadi Boolean untuk tanda, dan memilih garis miring kami disimpan ke dalam $y
dan $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 $w
untuk 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, $b
adalah False
karena input positif), maka kita harus mengulang melalui $x
dan reverse setiap item baris - ini adalah di mana ruang Trailing ikut bermain; itu memungkinkan kita untuk hanya membalikkan garis daripada menghitung ulang jarak.
Jika $b
adalah True
, maka kanan setengah dari array $x
yang dipilih sebagai gantinya.
Dalam kedua kasus tersebut, pipeline sekarang berisi array string. Output implisit melalui Write-Output
terjadi 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)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3
misalnya?