Если в качестве входных данных указать одно положительное нечетное целое число, вернуть сходящийся зигзаг в виде списка строк, списка списков символов или строки, разделенной новой строкой, в следующей форме:
#
#
#
#
#
#
#
#
#
#
#
Вы можете заменить #
любой непротиворечивый непробельный символ. Конечный пробел в каждой строке разрешен, а завершающий символ новой строки разрешен.
Зигзаг начинается в столбце 1
и для каждой строки перемещается вправо на один столбец, пока не достигнет столбца n
(где n
находится вход). Затем он перемещается влево 2
, затем вправо n-1
, затем влево 3
, где две границы сходятся, пока зигзаг не заканчивается в средней колонке ( (n+1)/2
).
Тестовые случаи
Пример выше - это тестовый пример для 5
.
Ниже приведены отдельные тестовые случаи:
3
#
#
#
#
7
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
1
#
Ответы:
C (gcc) , 89 байт
Попробуйте онлайн!
Работает, анализируя последовательность количества пробелов как (для n = 7):
И для n = 3:
Мы можем видеть, что среднее число (
a
в коде) начинается с [n-1, n / 2). Тогда разница между первым и средним числом:Так что, если мы
b
пройдем через [- (2a-n), 2a-n],a-abs(b)
получим нам нужную последовательность По сути, это то, что делает код.источник
Древесный уголь ,
108 байтПопробуйте онлайн! Ссылка на подробную версию кода. Редактировать: Сохранено 2 байта благодаря @dzaima за указание, что я не должен использовать
#
s.источник
Python 2 , 78 байт
Попробуйте онлайн!
источник
Желе , 14 байт
Попробуйте онлайн!
Полная программа.
Использует
1
.-1 спасибо Джонатану Аллану .
-1 спасибо Джонатану Аллану .
источник
’R
->Ṗ
для байта.”X
->1
для другого.Haskell , 72 байта
Попробуйте онлайн!
Мы определяем бесконечный список
r
как диагональ#
s, начиная с верхнего левого угла.Затем мы определяем функцию,
g
которая выполняет основную работу.g
возьмет список и несколько раз обратит его и удалит его первый элемент, пока список не станет пустым, затем объединит результат каждого действия.Наша основная функция здесь - это функция без точек. Эта функция начинается с извлечения
n
элементов из бесконечного спискаr
, затем отбрасывает первый элемент и применяет егоg
. Последнее, что мы должны добавить#
назад в начало, это потому, что спецификации вопроса немного странные, я не уверен, почему первая диагональ всегда на одну длиннее, чем должна быть, но это так, поэтому мы должны добавить аа#
.источник
("#":).g.init.(
дубль,r)
но спасибо!SOGL V0.12 , 19 байтов
Попробуй здесь!
источник
05AB1E , 22 байта
Попробуйте онлайн!
Использует
8
.источник
05AB1E , 6 байтов
Попробуйте онлайн!
источник
S
. Так что на выходе станет вдвое больше. Я еще не знал о + и ×. Они создают действительно интересные шаблоны, когда вы объединяете их с числамиS
, но не уделял достаточного внимания выводу ..>.> И,+
и×
в основном встроены для[0,4,4,0,2,6,6,2]
и[1,5,5,1,3,7,7,3]
. И8
вернется к исходной точке, с которой вы начали. Здесь немного больше информации.CJam , 29 байт
Попробуйте онлайн!
Использует
8
.источник
Pyth, 23 байта
Попробуй это здесь.
источник
JavaScript, 127 байт
Вычисляет цель (
g
), чтобы добраться до. Когда эта цель достигнута, развернитесь к следующей цели. Также используется хитрость, чтобы избежать использованияMath.round()
, добавляя0.5
к каждому неравному числу.источник
Haskell, 74 байта
Попробуйте онлайн!
Как это работает:
Каждый рекурсивный вызов
f
добавляет следующую диагональ.источник
Шелуха , 19 байт
Попробуйте онлайн!
объяснение
Это чувствует себя немного неуклюжим.
источник
Python 3 , 82 байта
Попробуйте онлайн!
источник
Сетчатка , 71 байт
Попробуйте онлайн! Объяснение: Первые три этапа преобразуют ввод в форму,
:> :
где количество символов между:
s является номером ввода. Последние два этапа затем отказов>
(или<
, при движении влево) между:
s. Четвертый этап зацикливает отскок, каждый раз печатая необходимые части строки.;
Останавливает строку из печатается после цикла.источник
05AB1E , 16 байтов
Попробуйте онлайн!
объяснение
источник
K (Kona), 27 байтов
Создает базовую числовую последовательность, многократно обращая и опуская головку вектора до тех пор, пока она не станет пустой.
источник
PHP, 65 байт
Запустите как трубу с
-nF
или проверьте это онлайн .объяснение:
первая итерация:
$n
естьNULL
, поэтому не--$n
имеет никакого эффекта и оцениваетNULL
-> set
$n
и$d
предварительно уменьшенный аргумент1. увеличение
$x
для четного$d
, уменьшение для нечетного$d
2. печать
X
, символ новой строки и$x
пробелыдальнейшие итерации: декремент
$n
; когда он попадает0
, сбросьте$n
(и$d
) до предварительно уменьшенного аргументафинал: напечатать еще один
X
.источник
Japt , 31 байт
Рекурсивное решение, которое возвращает массив строк.
Попробуйте онлайн! используя
-R
флаг, чтобы объединить вывод с символами новой строки.источник
Python 2,
159,145,141,136 байт.Уже есть довольно хорошие версии Python для этой проблемы, но я подумал, что все равно выложу свою ужасную однострочную версию. (Без точек с запятой!)
Изменить: 14 байтов вниз, используя сумму вместо понимания двойного списка
Редактировать: только что заметил, в Python 2 вы можете использовать ввод вместо raw_input. Я всегда просто использовал последнее.
источник
Математика,
142102 байта (независимый)Это решение имеет матовый вкус:
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&
Это в основном вычисляет, в каком сегменте мы находимся (инвертируя функцию треугольного числа), а затем перемещаясь влево или вправо, добавляя степень -1.
Вы можете проверить это в песочнице Wolfram Code Sandbox , вставив код, например,
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixForm
и нажав Shift + Enter или Numpad Enter или нажав Gear -> «Оценить ячейку».Это имеет ту же длину, что и мой исходный неверный порт решения Erik's Python 2 (этот порт дает выход для входного значения выше):
(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&
источник