Введение
Это один довольно простой. Мы будем рисовать змею в ascii. Это было вдохновлено той старой игрой со змеями, где вы должны собирать фрукты и постоянно расти.
Определение
Учитывая положительное целое число N, которое представляет длину змеи, нарисуйте змею так, чтобы у нее было тело n плюс голова и хвост.
Части:
- голова:
<, >, ^, v
- хвост:
@
- по вертикали:
|
- Horizonal:
-
Все углы должны быть удовлетворены \
или /
соответственно. Если голова не заканчивается на углу, в этом случае голова <, >, ^, v
имеет приоритет в направлении, в котором змея свернулась. то есть для примера длины 1, он поворачивается против часовой стрелки, и поэтому головка поворачивается таким образом. Для решения по часовой стрелке это было бы направо >
.
Змея должна начинаться посередине хвостом, но она может идти наружу в любом направлении, которое вы выберете по часовой стрелке или против часовой стрелки. Он также должен быть плотно обернут вокруг себя, поскольку он расширяется наружу по кругу.
пример
/--\
|/\|
||@|
|\-/
\--->
Где @
хвост и начальная позиция. Как видно выше, хвост начинается посередине, идет вверх влево против часовой стрелки.
Здесь длина 19
плюс хвост и голова.
В качестве другого примера, вот длина 1
:
<\
@
выигрыш
Это код-гольф, поэтому ответ, представленный с наименьшим числом байтов, выигрывает, и время используется как прерыватель связи.
Повеселись!
@---->
. Вы, вероятно, намереваетесь более строгие условия в отношении формы змеи. Также проясните, сколько пробелов разрешено или не разрешено@
что это середина (можно добавить несколько пробелов, чтобы сделать это так), объявить «направо» как направление и сделать только головку вниз и объявить это по часовой стрелке. Ваши условия могут показаться вам ясными, но на самом деле они неоднозначны. Я понимаю, что вы, вероятно, имеете в виду как можно более жесткую спиральную змею, но вы должны это прояснитьОтветы:
MATL ,
8583 байтаИ я подумал, что наличие
spiral
встроенного кода сделает короткий код ...Попробуйте онлайн!
объяснение
Пусть N обозначает вход. Мы создадим вектор длины
ceil(sqrt(N+2))^2
, то есть наименьший идеальный квадрат, который равен или превышает N +2. Этот вектор будет заполнен числовыми значениями, свернут в спираль (поэтому его длина должна быть идеальным квадратом), а затем числовые значения будут заменены символами.Обозначим через n каждый шаг, начинающийся с 1 в центре спирали. Шаги, в которых повороты змеи задаются как n 2 +1 (то есть: 2, 5, 10, ...) для
\
символов и n 2 + n +1 (то есть: 3, 7, 13, ...) для/
. Шаги между а\
и а/
должны быть-
, а между а/
и а\
должны быть|
.Вектор создается так, что он содержит
1
в точках поворота (2,3,5,7,10,13 ...) и0
в остальных. Соотношение совокупной суммы говорит, должна ли каждая запись быть-
или|
. Добавляя 1 к этому результату, мы получаем вектор, содержащий1
(для|
) или2
(для-
). Но это заставляет сами точки поворота становиться1
или2
слишком. Таким образом, точки поворота, чьи позиции мы знаем, перезаписываются: позиции n 2 +1 заполнены,3
а позиции n 2 + n +1 заполнены4
. Хвост и голова также являются особыми случаями: первый элемент вектора (хвост) установлен в значение5
, а элемент с индексом N+2 (голова) установлен в6
. Наконец, элементы с индексами, превышающими N +2, устанавливаются в0
.Взяв в качестве примера вход N = 19, теперь у нас есть вектор длиной 25:
Нам нужно свернуть этот вектор в спираль. Для этого мы используем встроенную функцию, которая генерирует спиральную матрицу с последующим отражением и транспозицией для получения:
Индексирование вектора с помощью матрицы дает
где
0
соответствует пространству,1
соответствует|
,2
чтобы-
,3
чтобы\
,4
чтобы/
,5
чтобы@
, и6
к голове.Чтобы узнать , какой из четырех символов
^
,<
,v
или>
голова должна иметь, мы используем накопленную сумму в свою очередь указывает , что мы ранее вычисленного. В частности, второе-последнее значение этой накопленной суммы (т.е. N + 1-е значение) по модулю 4 говорит нам, какой символ следует использовать для головы. Мы предпоследнее значение накопленной суммы, не последняя, из - за требования « если голова заканчивается на угле голова<
,>
,^
,v
имеет приоритет в направлении змея завитый». Для примера N = 19 голова>
.Теперь мы можем построить строку , содержащую все символы змеи, в том числе соответствующего символа для головы на шестой позиции:
'|-\/@> '
. Затем мы индексируем эту строку с помощью вышеуказанной матрицы (индексирование основано на 1 и является модульным, поэтому место идет последним), что даетисточник
Python 2,
250233191 байтrepl.it
Нарисуйте змею, повернув всю змею на 90º по часовой стрелке и добавив нижний сегмент, таким образом, змея всегда будет против часовой стрелки.
Новый сегмент всегда будет начинаться с
\
и иметь в-
качестве органа для четных сторон и/
-
для нечетных сторон. Размеры сегментов (без углов) являются0
,1
,1
,2
,2
,3
... которыйfloor(side/2)
.Если сегмент является последним, он удаляет лишние символы, добавляет голову и дополняет пробелами.
источник
'\/'[m]
,'-|'[m]
и'>v'[m]
print
и''.join
JavaScript (ES6), 193
201 203 215 220 224Редактировать сохраненные 4 байта thx @Arnauld
Edit2 изменил логику, не сохраняя текущие приращения для x и y, просто
получая их с текущего направления. Edit3 сохранив несколько байтов, я решил использовать их для лучшего управления пустым пространством
Edit4 8 сохраненные байты, не следующие точно примеры о направлении головы - как другие ответы
Текущая версия работает с Chrome, Firefox и MS Edge
Этот ответ дает немного пробела и пробела (и пустые строки).Немного меньше в гольф
источник
(' ')
на` `
и('@')
с`@`
[ Array[1], Array[1] ]
, аArray(2).fill(' ')
==>[' ',' ']
JavaScript (ES7), 200 байт
Версия ES6 для удобства тестирования:
источник
Perl
111110 байтВключает +1 для
-p
Дайте размер на STDIN
snake.pl
:источник
Пакетная, 563 байта
Объяснение: Особые случаи 1, так как остальная часть кода требует ширины змеи как минимум два. Затем вычисляется самый большой квадрат четверти (либо точный квадрат, либо прямоугольник на 1 шире его высоты), площадь которого меньше длины змеи. Змея будет свернута в этот прямоугольник, начиная с нижнего левого угла и заканчивая хвостом посередине, а оставшаяся длина будет проходить под дном прямоугольника. Прямоугольник фактически создается из простых замен строк; Большую часть времени каждая линия генерируется из предыдущей строки путем перемещения диагоналей на 1 шаг, но, очевидно, также необходимо разобраться с хвостом, и есть небольшие различия в зависимости от того, является ли высота прямоугольника четной или нечетной.
источник
Python 2.7, WHOPPING 1230 байт
Я новичок в питоне и коде гольф, но я чувствовал, что должен был ответить на свой собственный вопрос и дуться от стыда после факта. Очень весело работать над этим, хотя!
https://repl.it/Dpoy
источник