PowerShell v2 +, 217 205 190 187 184 байт
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]
Вводиться $b
як ціле число. Зауважте, що якщо $b
це негатив, вам потрібно явно оточити його паренами, щоб належним чином надати його (див. Приклади), інакше PowerShell подумає, що це рядок.
Незалежно від того, в якому напрямку виходить намет, перший рядок такий же, купа підкреслених; саме 4*abs(input)
багато хто з них, на самому ділі. Це число також зберігається $a
для подальшого використання. Крім того, тепер ми маємо абсолютне значення $b
зберігається в $a
, ми переходимо $b
в логічне значення для його знака, і вибрати наші косі зберігаються в $y
і $z
.
Наступний рядок - це побудова та формулювання результатів, і це дози, тому давайте розбимо його.
Ми по суті індексуємо масив з двох елементів, (big long calculations saved into $x)
або $x
, виходячи з цього $b
.
Розрахунки там, де побудовано тіло намету. Ми з циклу 1..$a|%{...}
. Кожну ітерацію ми будуємо лінію корпусу намету. Починаємо з кількості пробілів, рівних лінії №, на якій ми знаходимось -1
, щоб вона була належним чином вирівняна ліворуч. Це зберігається в $w
подальшому і об'єднується з відповідною косою рисою ($ z, виходячи з $b
), потім числом пробілів у дверях, потім іншим косою рисою $y
, а потім підкресленням або пробілами залежно від того, знаходимось у нижній лінії чи ні, потім ще одна коса риса $y
і, нарешті, відповідна кількість пробілів ( $w
) для побудови прямокутної рядки. Цей отриманий масив рядків зберігається в $x
.
Якщо обрана ліва половина масиву (тобто, $b
це , False
так як вхідний сигнал був позитивним), то ми повинні петлі через $x
та зворотний кожен елемент рядка - це де кінцеві прогалини вступають в гру; це дозволяє нам просто перевернути лінії, а не перерахувати відстані.
Якщо $b
є True
, то права половина масиву $x
обрана замість цього.
У будь-якому випадку трубопровід тепер містить масив рядків. Неявний вихід через Write-Output
відбувається в процесі завершення програми, з новим рядком між елементами за замовчуванням.
Приклади
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (-5)
____________________
\ / /
\ / /
\ / /
\ / /
\/_________/
PS C:\Tools\Scripts\golfing> .\print-upside-down-tent.ps1 (4)
________________
\ \ /
\ \ /
\ \ /
\_______\/
3
наприклад?