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
например?