Вам будет дано положительное целое число в N
качестве входных данных. Ваша задача - построить полу-зигзаг из N
сторон, каждой длины N
. Поскольку довольно сложно четко описать задачу, вот несколько примеров:
N = 1
:О
N = 2
:О OO
N = 3
:OO OO ООО
N = 4
:OOOOO OO OO ОООО
N = 5
:OOOOOO ООО ООО ООО OOOOOO
N = 6
:ООООООО ООО ООО ООО ООО OOOOOOOOOOOO
N = 7
:OOOOOOOOO ОООО ОООО ОООО ОООО ОООО OOOOOOOOOOOOOO
Как вы можете видеть, полузигзаг состоит из чередующихся диагональных и горизонтальных линий, и он всегда начинается с диагональной линии слева направо сверху вниз. Обратите внимание, что символы на горизонтальных линиях разделены пробелом.
правила
Вы можете выбрать любой непробельный символ вместо
O
, он может даже быть непоследовательным.Вы можете вывести / вернуть результат в виде строки или в виде списка строк, каждая из которых представляет одну строку .
У вас может быть завершающий или ведущий символ новой строки.
Применяются стандартные лазейки .
Вы можете принимать входные данные и предоставлять выходные данные любым стандартным способом .
Если возможно, пожалуйста, добавьте ссылку на тестирование в ваше сообщение. Я буду приветствовать любой ответ, который показывает усилия в гольф и имеет объяснение.
Это код-гольф , поэтому выигрывает самый короткий код в байтах на каждом языке !
Ответы:
Древесный уголь , 24 байта
Попробуйте онлайн!
-5 спасибо Нейлу .
АСТ:
источник
FN§⟦↘→↗→⟧ι⁻Iθ¹→
(только 15 байт), но списки направлений, похоже, не сработали в Charcoal. Жалость.FN✳§⟦↘→↗→⟧ι⁻θ¹O
будет работать после того, как Деннис потянет✳
в направленииPython 2 ,
157153 байтаПопробуйте онлайн!
n*3/2*~-n+1
ширина каждой строки: n3n / 2⌋ · (n − 1) + 1 символ.q*n+s*(4*n-6)
представляет верхнюю и нижнюю строки. Если мы повторим это и нарежем,[2*(n-1):]
мы получим верхний ряд; если мы нарезаем,[5*(n-1):]
мы получаем нижний ряд. Отсюда и определениеp
и призывы кp(2)
иp(5)
. Но так как нам все равно нужны повторение и разрезание по длине строки для всех других строк, мы снова используемp
в цикле.i*s+s+o+…
просто скучное выражение для средних рядов.n>1>p(5)
будет короткое замыкание, еслиn≯1
, не вызываяp(5)
оценки. Следовательно, это сокращение дляif n>1:p(5)
.источник
Mathematica,
1261251211121048986 байт#
номер входа для анонимной функции (завершается финалом&
).m=" "&~Array~{#,#^2-#+1};
создает матрицу пространственных символов правильного размера, заполняя массив заданных измерений#,#^2-#+1
выходными данными постоянной анонимной функции «вывести пробел»" "&
.Do[foo,{j,#},{i,#}]
представляет собой пару вложенных циклов делать, гдеj
диапазоны от1
к#
и внутри этогоi
диапазона от1
до#
.m[[1[i,#,-i][[j~Mod~4]],j#-#+i+1-j]]="X"
устанавливает соответствующую часть матрицы как символX
на основеj
иi
.-i
Использует отрицательную индексацию , чтобы сохранить байты из#-i+1
. (Я забыл написать,Mod[j,4]
какj~Mod~4
в оригинальной версии этого кода.) Jenny_mathy указала, что мы можем использовать модульный остаток для индексации в списке напрямую (а не использоватьSwitch
) для сохранения 9 байтов, а JungHwan Min отметил, что мы не ' не нужно использовать,ReplacePart
так как мы можем установить часть массива, которая1[i,#,-i][[j~Mod~4]]
использует странное поведение и общность[[foo]]
для сохранения байтов{1,i,#,-i}[[j~Mod~4+1]]
Вы можете проверить это в изолированной программной среде Wolfram Cloud , вставив код, подобный следующему, и нажав Shift + Enter или цифровую клавишу Enter:
источник
ReplacePart
здесь.m=ReplacePart[...]
может бытьm[[{1,i,#,-i}[[j~Mod~4+1]],j#-#+i+1-j]]="X"
- Вы можете из списка. Это избавляет от 15 байтов.Set
Part
{1,i,#,-i}[[j~Mod~4+1]]
тоже может быть1[i,#,-i][[j~Mod~4]]
. Этот трюк работает, потому что[[0]]
возвращаетHead
выражение.C ++,
321234 байта-87 байт благодаря Захари
Возвращает вектор строк
источник
Mathematica, 179 байтов
редактировать для @JungHwanMin
источник
Mod[z,4]==0
можно заменить наMod[z,4]<1
?Mod[#,4]
с#~Mod~4
на -1 байт?05AB1E ,
212019 байтовКод
Использует новый режим холста:
Использует кодировку 05AB1E . Попробуйте онлайн!
Объяснение:
Для ввода 6 это дает следующие аргументы (в том же порядке) для холста:
Чтобы объяснить, что делает холст, мы выбираем первый набор аргументов из списка выше.
Число 6 определяет длину строки, которая будет записана на холсте. Наполнитель используется для записи на холсте, который в данном случае является
O
. Он циклически проходит через строку наполнителя. Направление строки определяется последним аргументом, направлением. Направления:Это означает, что 3 устанавливает направление на юго-восток , что также можно попробовать онлайн .
источник
SOGL V0.12 , 36 байт
Попробуй здесь!
Основная идея состоит в том, чтобы для каждого номера входного диапазона выбрать либо добавление диагональной, либо горизонтальной пунктирной части, в этом случае он будет переворачивать массив для более легкого добавления. Объяснение:
Если ввод 1 не разрешен, то
ο.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№
тоже будет работать. Если бы случайные числа с плавающей точкой были разрешены,.∫2%?.╝}F2\?№@.┌Ο};1w⁄Hh1ž}.4%1>?№
это тоже сработало бы. Если бы я не ленился и не реализовал‼
,}F2%?
можно было бы заменить‼
на -4 байтаисточник
Mathematica,
10687 байтовВозвращает
SparseArray
объектString
s. Чтобы визуализировать вывод, вы можете добавитьGrid@
. Выдает ошибку для случая1
, но это безопасно игнорировать.объяснение
Установите
i
иj
1.Установите
k
для ввода - 1.Установите
l
наk*input + 1
Итерируйте
l
время, начиная с0
, увеличивая1
каждый раз ...Добавьте мнимый компонент
i
кj
...Если текущая итерация делится на
k
, умножьтеi
на мнимую единицу ...Создайте
Rule
объект, который меняет элемент в позиции{j, current iteration + 1}
на"o"
Создайте
SparseArray
объект, используя сгенерированныеRule
объекты, с измерением{input, l}
, используя" "
как пустое.Попробуйте это на Wolfram Sandbox!
источник
SparseArray
считается ли массив? Это можно визуализировать с помощьюGrid
илиMatrixForm
, но я бы не стал считать это списком строк. Если двумерного массива символов достаточно, это отсекает 8 байтов моего решения (например, 12 до помощи Jenny_mathy).SparseArray
ответов, поэтому я предполагаю, что все в порядке.Python 3 ,
228 226 224 215 197195 байт-11 байт благодаря @Mr. Xcoder
-2 байта благодаря @Mr. Xcoder
Попробуйте онлайн!
Пояснение и менее понятный код:
источник
c+=i%(n-1)<1
сc+=i%~-n<1
для -2 байтif 2>n:return'o'
это довольно избыточно. Я сделал обходной путьc+=i%[~-n,n][2>n]<1
вместоc+=i%~-n<1
.Haskell , 197 байт
Попробуйте онлайн!
Благодаря @Lynn: исправлены пробелы между
O
s на горизонтальных сегментах зигзага, но это стоит много байтов!Некоторые объяснения:
r
строка вывода: она имеет0 y y y y y 0 x x x 0 y ...
формат, количествоx
и вy
зависимости от строки и начальногоn
x='0'
иy=' '
x=' '
иy=' '
x=' '
иy='0'
take(div(3*n)2*(n-1)+1)
режет бесконечный ряд в нужном местеn=1
:take n
обрабатывает этот случай.источник
replicate n x
может быть замененx<$[1..n]
. Кроме того, в вашем ответе отсутствуют пробелы междуO
s на горизонтальных сегментах зигзага.Python 2 ,
155151146137 байтПопробуйте онлайн!
источник
`L`[2::5]
сохраняю байты больше''.join(L)