Учитывая целое число, выведите перевернутую палатку.
Вход определяет как размер палатки (абсолютное значение), так и то, находится ли вход слева (отрицательные числа) или справа (положительные числа).
If input = -1:
____
\/_/
If input = -2:
________
\ / /
\/___/
If input = -3:
____________
\ / /
\ / /
\/_____/
If input = 1:
____
\_\/
If input = 2:
________
\ \ /
\___\/
If input = 3:
____________
\ \ /
\ \ /
\_____\/
et cetera
Обратите внимание, что верхняя часть палатки (то есть последняя строка) имеет 2 * abs(input) - 1
подчеркивание.
Там не может быть не ведущие пробелы, так что первая линия непосредственно начинается с символа подчеркивания.
Предположим, что ввода никогда не будет 0
.
Ваш код должен быть максимально коротким.
Это испытание основано на мини-соревновании в чате от Helka Homba , которое разрешено использовать в реальных соревнованиях в соответствии с условиями общественной лицензии Calvin's Hobbies .
3
например?Ответы:
MATL ,
55535251 байтПопробуйте онлайн!
объяснение
Позвольте
N
обозначить вход. Код продолжается в три этапа.Во-первых , первая строка
4*N
подчеркивания строится как строка и отображается (что удаляет ее из стека).Во-вторых , «каркас» палатки строится с использованием двух типов слешей. Для этого создается числовой двумерный массив, который содержит
1
и2
соответствует двум типам слешей, а также0
для пространства.Это делается путем объединения четырех матриц:
abs (N)
;2
в антидиагонале;Конкатенация этих четырех матриц по вертикали дает
N=3
на примере следующую4*N × N
матрицу:(который, транспонированный, начинает выглядеть как палатка).
Теперь мы позаботимся о знаке ввода. Если оно положительное, мы просто перемещаем вышеуказанную матрицу и индексируем в строку
'\/ '
. Индексирование основано на 1 и является модульным, поэтому1
становится'\'
,2
становится'/'
и0
становится' '
, создавая массив двумерных символовС другой стороны, если входной сигнал отрицательный, мы вертикально переворачиваем и арифметически отрицаем
4*N × N
матрицу, производяИндекс
-1
теперь относится'/'
и-2
к'\'
. Таким образом, два типа косых черт были заменены, как требуется. Снова транспонирование и индексирование в строку,'\/ '
таким образом, дает обратную палатку:В-третьих , подчеркивания необходимо заполнить частью последней строки двумерного массива символов. Горизонтальное положение этой линии зависит от знака ввода и его длины
abs(N)
.Как только соответствующие пробелы были заменены символами подчеркивания, результат неявно отображается ниже начальной строки символов подчеркивания, которая уже отображалась на первом этапе.
источник
Javascript (ES6), 139 байт
Строит палатку рекурсивно:
Разоблаченный и прокомментированный
Примеры
источник
Python 2,
143, 141, 139, 138,137 байт.-2 байта благодаря @ Sp3000 (нет необходимости заключать в скобки exec в Python 2)
-1 байт благодаря @ Sp3000 (использовать
cmp
)Проверьте это на Ideone
Сначала мы видим,
n
отрицательноd
+1
ли это, и делаем, если оно есть, и-1
если нет.Затем мы выбираем две косые черты
a
иb
, используя такd
, чтобыa='\', b='/'
когда былоn
положительно, аa='/', b='\'
когда былоn
отрицательно.Далее мы устанавливаем,
s=abs(n)
что может быть достигнутоs=n*d
.Затем мы рассчитываем число
_
вверху (внизу рисунка), которое также является числомв стороне от палатки как
x=2*s-1
.Затем мы рассчитываем количество
_
у основания палатки (вверху рисунка) и сохраняем его так,y=4*s
как оно будет использоваться в цикле для создания остальной части палатки.Теперь мы печатаем основание палатки, используя
print'_'*y
.Затем мы печатаем оставшуюся часть палатки, выполняя
s
операторы печати сi
инициализируемой переменной цикла, значение0
которой увеличивается1
для каждого оператора печати.У остальной части палатки есть
y-3-x-i-i
пробелы в дверях иx
пробелы в корпусе до тех пор, пока не будет достигнут верх, когдаs-i>1
оценивается как False, выбирая_
from'_ '
.Для положительной палатки с левой дверью вся палатка, исключая ведущие пространства, находится спереди назад, поэтому она переворачивается, тогда как положительной палатки с правой дверью нет
[::d]
.источник
cmp(0,0)
возвращается0
Python 2, 121 байт
Просто много форматирования строк.
источник
C #,
215214 байтЕсть возможность сэкономить несколько байтов при использовании
using s=string;
заранее.что будет 15 (с использованием) + 184 (метод) = 199 байт.
источник
var
в цикле for наstring
, вы можете удалить второйvar
(включая место для сохранения байта). Такvar f
становитсяstring f
и;var p=
становится,p=
.TSQL, 195 байт
Golfed:
Ungolfed:
скрипка
источник
V , 66 байт
Попробуйте онлайн!
Это довольно наивный подход, поэтому я постараюсь развить его чуть позже сегодня. Это решение содержит непечатаемые символы, поэтому вот hexdump:
источник
05AB1E , 52 байта
объяснение
Попробуйте онлайн!
источник
PowerShell v2 +,
217205190187184 байтаПринимает ввод
$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
происходит при завершении программы, с новой строкой по умолчанию между элементами.Примеры
источник
Haskell,
187184183 байтаЯ чувствую, что это не лучший результат для Haskell, поэтому любые идеи по улучшению приветствуются.
Ungolfed
источник
main
чтобы он принимал вstdin
качестве входных данных?:
символа. т.е. изменить"\\" ++ entrance...
на'\\':entrance
.|1>0=(2*(n-i-1))%' '
на|q<-2*(n-i-1)=q%' '
.C
240207193 байтаНа этот раз я оптимизировал функцию g (...), чтобы использовать один цикл for.
На этот раз макрос X лучше использовать как функцию g (...), и, поскольку y и z являются параметрами в новой области видимости, я могу просто уменьшить их в области видимости g.
Проверьте с этой основной функцией; Это должно упасть намного меньше.
источник
C #
241231 байтСохранено 10 байтов благодаря @Kevin Cruijssen
Старая версия:
Первоначально имел
new string(...)
какFunc<char,int,string>
сохраненный один байт, используя конструктор. Я хочуint
->char
был неявнымУверен, моя математика тоже может быть исправлена, но я ее не вижу
источник
int
перед темz=
, добавив его в обмен на петлю:int j=0,z
. И так как вы используетеstring
довольно много, вы можете присвоить ему псевдоним.using s=System.String;
Таким образом, итоговое значение становится:using s=System.String;s f(int N){var f=N<0;N=N>0?N:-N;var o=new s('_',N*4);for(int j=0,z;j<N;){z=-2*j+2*N-2;var O=j>N-2?'_':' ';o+='\n'+new s(' ',j)+'\\'+new s(' ',z)+(f?'/':O)+new s(O,j++*2)+(f?O:'\\')+new s(' ',z)+'/';}return o;}
( 231 байт )Swift 2.2 421 байт
Ну ... Это была попытка.
Golfed:
UnGolfed:
источник
PHP, 143 байта
бежать с
php -r '<code>' <parameter>
сломать
источник
Пакетный, 289 байт
Принимает участие в STDIN. Начинается с создания строки
2*(abs(n)-1)
подчеркивания. Затем это повторяется плюс еще 4 подчеркивания для основания палатки. Затем остальная часть палатки состоит из отступа (который увеличивается на 1 в каждой строке), а\
, середины палатки и а/
. Середина палатки начинается с2*(abs(n)-1)
пробелов, плюс либо\
или/
плюс пробел (который я не могу представить в Markdown), а также другие2*(abs(n)-1)
пробелы. Я повторно использую строку подчеркивания и заменяю их пробелами для удобства, но затем заменяю пробелы на подчеркивания для последней строки. Каждая строка удаляет два пробела с одной стороны от середины палатки, хотя немного сложнее, если нужно, сначала переместить два пробела к началу струны.источник
Холст , 25 байтов
Попробуй это здесь!
источник