Красиво расположенная спираль ASCII


13

Рассмотрим эту спираль

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

Начиная в центре:

  • Первая строка (вверх) имеет 3 символа.
  • Вторая строка имеет такое же количество символов (3)
  • Далее мы добавляем два символа (5) для следующих двух сторон.
  • Этот шаблон продолжается, две стороны одинаковой длины, а затем увеличивают длину на 2.

Я хочу создать эту спираль для N строк.

  • Пишите на любом языке.
  • Ввод / аргумент и т. Д. - это количество строк в вашей спирали.
  • Каждая строка начинается с символа конца предыдущей строки в направлении 90 градусов по часовой стрелке от предыдущей строки.
  • Мне все равно, сколько пробелов до или после каждой строки, пока элементы спирали выстраиваются в линию.
  • Выведите текст, чтобы нарисовать спираль с любым непробельным символом, который вы выберете.
  • Попытайтесь сделать это в наименьшем количестве байтов.

Тестовые случаи (с использованием хэша в качестве вывода):

N = 1

#
#
#

N = 2

###
#
#

N = 3

###
# #
# #
  #
  #

N = 10

###########
#
# #######
# #     #
# # ### #
# # # # #
# # # # #
# #   # #
# ##### #
#       #
#########

@Shaggy "Выведите текст, чтобы нарисовать спираль с любым непробельным символом, который вы выберете." Да, все, что вам нравится.
AJFaraday


3
Исходное изображение имеет *вместо #. Ожидаемая?
Верниш

@Wernisch Это было задумано как полезная отправная точка, но я полагаю, это вводит в заблуждение. Вы можете использовать любой символ, который вам нравится.
AJFaraday

Ответы:


11

05AB1E , 13 11 байт

Код:

Спасибо Emigna за сохранение двух байтов!

LDÈ-Ì'#3Ý·Λ

Использует кодировку 05AB1E . Попробуйте онлайн!

объяснение

Длина каждого отдельного ребра на спирали начинается с длины 3 и постепенно увеличивается каждые два шага на два:

3,3,5,5,7,7,9,...

NN

L                # Create a list from [1 .. input]
 DÈ              # Duplicate and check for each number if even
   -             # Subtract that from the first list
    Ì            # Add 2

Это в основном дает нам желаемый список длин.

     '#          # Push the '#' character
       0246S     # Push the array [0, 2, 4, 6]
            Λ    # Write to canvas

Холст работает как функция, которая извлекает три параметра (где самый правый параметр выводится первым): <length (s)> , <char (s)> , <direction (s)> . Параметр directions в этом случае представляет собой список чисел. Номера, которые соответствуют направлениям:

[70162543]

В этом случае [0, 2, 4, 6] соответствует списку направлений [↑, →, ↓, ←]. Канва перебирает каждую длину, извлеченную из списка длин, использует символ «#» и циклически перебирает список направлений.


0246S=3Ý·
Emigna

@ Emigna Ах, я не думал об этом, спасибо!
Аднан

6

Python 2 , 176 170 165 161 157 байт

g=lambda a,r:r and g(map(''.join,zip(*a))[::-1],r-1)or a
R=['#']
n=1
exec"R=g(['  '+l for l in g(R,n)][:-1]+[(n+2)*'#'],3*n);n+=1;"*input()
print'\n'.join(R)

Попробуйте онлайн!

Повторно: используется gдля поворота nитерации спирали в «каноническую» позицию (аналогично N = 3 или N = 7), добавляет новый сегмент, добавляя 2 пробела слева от каждой существующей строки, а затем заменяя последнюю строку со всеми '#'s (приводя к положению, сравнимому с N = 4 или N = 8) и, наконец, gснова используя его, чтобы повернуть его обратно в правильное положение. Вспенить, промыть, повторить.


4

Древесный уголь , 16 15 14 байтов

↶FN«¶×#⁺³⊗÷ι²↷

-2 байта благодаря @Neil .

Попробуйте онлайн (многословно) или Попробуйте онлайн (чисто) .

Объяснение:

Направление печати по умолчанию направо, и мы хотим начать вверх, поэтому мы начнем с поворота на 45 градусов против часовой стрелки:

PivotLeft();
↶

Затем цикл iв диапазоне [0, input):

For(InputNumber()){ ... }
FN« ...

Выведите новую строку, чтобы имитировать эффект возврата на одну позицию назад:

Print("\n");
¶

Выведите «#» xколичество раз в текущем направлении:

Print(Times("#", ... ));
×# ...

Где xнаходится 3 + i // 2 * 2:

Add(3,Doubled(IntegerDivide(i,2))
⁺³⊗÷ι²

А затем поверните на 45 градусов по часовой стрелке для следующей итерации цикла:

PivotRight();
↷

Я полагаю, в Charcoal нет команды для движения назад?
Эминья

@ Emigna Не уверен, но я тоже не смог его найти. Я действительно искал один, когда писал этот ответ. Существует Move с заданным направлением, а также Jump с заданными координатами, но, к сожалению, MoveBack не существует.
Кевин Круйссен

1
⊗÷ι²Байт короче ⁻ι﹪ι². Кроме того, вы можете получить эффект возврата назад, напечатав \nперед #символом s, что позволит вам удалить »#дополнительную общую байтовую экономию.
Нил

@Neil Спасибо за ⊗÷ι², но какие будут изменения для печати \nперед #s? Спираль неверна, если я добавлюPrint("\n") .
Кевин Круйссен

Поскольку руки теперь перекрываются, вам нужно сделать их еще #длиннее.
Нил

3

Python 2 , 179 178 байт

спасибо Кевину Круйссену за -1 байт.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
M=[1,0,-1,0]*n
exec'exec k/2*2*"x+=M[~k];y+=M[k];m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Попробуйте онлайн!


Python 2 , 179 байт

В этом подходе формулы xи yдельты используются вместо списка поиска.

n=input()
S,H=' #'
m=[S*n]*(n%2-~n)
x=n/4*2
y=0--n/4*2
k=2
m[y]=S*x+H+S*n
exec'exec k/2*2*"x+=k%-2+k%4/3*2;y-=(k%2or k%4)-1;m[y]=m[y][:x]+H+m[y][x+1:];";k+=1;'*n
print'\n'.join(m)

Попробуйте онлайн!


n+1+n%2в n%2-~nтечение -1 байт. И мне нужно помнить, 0--n/4*2что я на 1 короче -(-n/4*2). Хороший ответ, +1 от меня.
Кевин Круйссен,

1

JavaScript (ES6), 185 байт

Конечно, это может быть больше в гольфе, может быть, с карри, но вот моя очень скромная попытка. Добавлены разрывы строк для удобства чтения, кроме предпоследнего символа

r=(a,n=1)=>n?r(a.reduce((_,c)=>c).map((_,i)=>a.map(e=>e[i])).reverse(),n-1):a,
s=n=>n?r(s(n-1)).map((r,i)=>[...r,w,w].map(x=>i?x:'#')):[[w=' ']],
d=n=>r(s(n),1-i).map(r=>r.join``).join`
`

Использование: d(10)возвращает строку в соответствии с примером задачи N = 10.

Определяет функцию r(a,n)для поворота массива aпо nочереди; функция s(n)для генерации двумерного массива, представляющего спираль размера, nпутем рекурсивного вращения и добавления интервалов и линий (не повернутых обратно в исходное положение); и функция d(n)рисовать спираль размераn , последовательно вращающейся в соответствии с задачей, и отображаемой в виде возвращаемой строки.

Это было действительно забавное испытание: ¬)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.