Посмотрите на следующую строку. Заметили шаблон?
ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL ЦУМ BAZYXWV N Е.О. DP CQ BAZYXWVUTSR
Как некоторые могли заметить, это в основном спираль алфавита, где расстояния между строками / столбцами постепенно увеличиваются на 1 пробел / перевод строки.
Строгое определение
- Давайте иметь счетчик с , который изначально равен 0.
- Выпишем первые с + 1 буквы алфавита слева направо:
A
. Затем сверху вниз на следующий (с + 1) (с + 2) / 2 буквы (добавить
B
):AB
.Слева направо, следующее (с + 1) (с + 2) / 2 (добавить
C
):AB C
И снизу вверх, следующие c + 1 буквы (добавить
D
):AB DC
Дошел до конца цикла. Следовательно, давайте увеличивать c (который становится 1). Затем он начинается с первого шага, с той лишь разницей, что вместо использования первых c + 1 букв алфавита мы используем следующие c + 1 буквы, начиная с последнего элемента этого цикла (
D
в данном случае так что продолжимEFG...
). КогдаZ
достигается, он возвращается назадA
.
задача
Если задано целое число N (положительное для 1-индексации или неотрицательное для 0-индексации), выведите первые N циклов спирали.
правила
Вы можете использовать как строчные, так и прописные буквы, но ваш выбор должен быть последовательным (используйте только один из них, смешивание не допускается).
Вы можете принимать и выводить данные любым стандартным методом на любом языке программирования , при этом отмечая, что эти лазейки по умолчанию запрещены.
Приемлемые форматы вывода: многострочная строка, список строк, представляющих строки, список, содержащий несколько списков символов, каждый из которых представляет одну строку, или все, что вы считаете подходящим. Если вы не выберете первый формат, было бы неплохо включить версию вашего кода в красивой печати.
Это код-гольф , поэтому выигрывает самый короткий код в байтах (на каждом языке), который соответствует требованиям!
Контрольные примеры
Входное целое число будет разделено соответствующим выводом через новую строку, а тесты будут разделены тире. Обратите внимание, что они 1-индексированы.
1 AB ОКРУГ КОЛУМБИЯ -------- 2 ABEF DC G MH LKJI -------- 3 ABEFNOP DC GQ MHR LKJI S DT CU BAZYXWV ------- 4 ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL ЦУМ BAZYXWV N Е.О. DP CQ BAZYXWVUTSR ------- 5 ABEFNOPEFGHFGHIJ DC GQIK MHRJL LKJI SKM DTLN CUMO BAZYXWV NP EOQ DPR ОКК BAZYXWVUTSR T ру QV PW OX NMLKJIHGFEDCBAZY ------ 6 ABEFNOPEFGHFGHIJSTUVWX DC GQIKY MHRJLZ LKJI SKMA DTLNB CUMOC BAZYXWV NPD EOQE DPRF CQSG BAZYXWVUTSR TH RUI QVJ PWK OXL NMLKJIHGFEDCBAZY M SN RO QP PQ ИЛИ NMLKJIHGFEDCBAZYXWVUTS
Ответы:
Древесный уголь , 31 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Примечание. По какой-то причине девербозификатор выводит завершающий разделитель. Объяснение:
Нарисуйте прямоугольники в обратном порядке размера (от наибольшего к наименьшему).
Рассчитайте размер коробки.
Нарисуйте границу рамки, используя повернутый алфавит.
Вычислите букву, которая будет отображаться в левом верхнем углу поля (с индексами 0).
источник
Python 2 , 176 байт
Попробуйте онлайн!
объяснение
Мы создаем пустой массив пробелов правильного размера, а затем перемещаемся по нему, начиная с верхнего левого угла:
1 шаг →, 1 шаг ↓, 1 шаг ←, 1 шаг ↑
3 шага →, 3 шага ↓, 3 шага ←, 3 шага ↑
6 шагов →, 6 шагов ↓, 6 шагов ←, 6 шагов ↑
10 шагов →, 10 шагов ↓, 10 шагов ←, 10 шагов ↑
...
Каждый раз, когда мы находим пустую ячейку, мы помещаем туда букву и переходим к следующей букве в алфавите.
В коде
s%4
указано направление (→ ↓ ← ↑), и мы многократно повторяем это:Гольф возможности
Есть ли более короткий способ сопоставить
s%4
с1,0,-1,0
чемabs(2-s%4)-1
?Есть ли более короткий способ сопоставить
s%4
с0,1,0,-1
чемs%2-s%4/3*2
?кредиты
источник
21/(s%4+3)%3-1
:s%2-2*(s%4>2)
( 179 байт ). Это все еще может быть пригодным для игры в гольф, хотяC
305281 байтБлагодаря @Mr. Xcoder для сохранения четырех байтов!
Попробуйте онлайн!
источник
#define
дляfor(
(это на самом деле экономит байты). +1 от меня. :)Python 2 ,
262260254245 байтПопробуйте онлайн!
Новый метод с большим количеством математики!
Возвращает список списков символов.
Старая версия:
Python 2 ,
322321308298 байтПопробуйте онлайн!
источник
.49
достаточно просто в этом случае, или он терпит неудачу для очень больших входов?i<j
, так как вы используете его четыре раза?+1==1+
от моего предыдущего методаPerl 5, 177 +2 (-nl) = 179 байт
2 байта сохранены благодаря Xcali
Попробуйте онлайн
источник
-1
вместо$#O
. Кроме того, используя$,
вместо$n
позволит вам удалить пробел передfor
в$_.=$"x$n for@O
s/ (?=\S)/n/e
наs/.*\K /n/e
APL (Dyalog Classic) , 47 байтов
Попробуйте онлайн!
источник