Входные данные:
Строка
Выход:
1) Сначала мы берем символ удаления в конце входной строки, пока не останемся с квадратом длины (т.е. 1, 4, 9, 16, 25, 36 и т. Д.).
Таким образом, abcdefghijklmnopqrstuvwxyz
(длина 26) становится abcdefghijklmnopqrstuvwxy
( длина 25).
2) Затем мы помещаем это в квадрат, по одной строке за раз, слева направо:
abcde
fghij
klmno
pqrst
uvwxy
3) Мы складываем его во всех четырех направлениях, вот так (мы продолжаем разворачиваться до тех пор, пока внешний свернутый «блок» больше не будет иметь внутренних символов, чтобы развернуться):
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Некоторые вещи, на которые следует обратить внимание, когда мы сворачиваемся наружу, мы в основном отражаемся следующим образом (числа, добавленные как пояснение, которое представляет «индексы» в этих примерах):
Когда мы раскладываем левую сторону:
123 to: 321 123
fghij ihgf j
Когда мы сложим правую сторону:
123 to: 123 321
fghij f jihg
Когда мы складываемся вверх:
3q
2l
1g
b to: b
1g 1
2l 2
3q 3
v v
Когда мы складываемся вниз:
b b
1g 1
2l 2
3q 3
v to: v
3q
2l
1g
Правила вызова:
- Можно предположить, что на входе всегда будет хотя бы 1 символ (который также будет выходным).
- Выходной формат гибкий, поэтому вы можете печатать в STDOUT или STDERR; возвращать как строковый массив / список или символьный 2D-массив; одиночная строка с новыми строками; и т.п.
- Ввод будет содержать только буквенно-цифровые символы (
a-zA-Z0-9
) - Вы также можете использовать не алфавитно-цифровой символ для заполнения пробелов в и / или вокруг вывода ASCII-art, как точка
.
. - Завершающие пробелы и одна завершающая новая строка необязательны.
- Мы продолжаем разворачиваться до тех пор, пока у внешнего свернутого «блока» больше не будет центров для раскрытия.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода.
- Также, пожалуйста, добавьте объяснение, если это необходимо.
Тестовые случаи:
Input: abcdefghijklmnopqrstuvwxy
Output:
m
qrs
l n
ghi
abcde
ihgf jihg
mn lk on lm
srqp tsrq
uvwxy
qrs
l n
ghi
m
Input: A
Ouput:
A
Input: ThisIsATest
Output:
I
Thi
Is sI
ATe
I
Input: HowAboutAVeryLongExampleWhichIsAlsoAnEvenSquareInsteadOfOddOneAndExceeds64Chars
Output:
An
ch
xamp
i I
o E
quar
steadO
S e
s v
h s
E l
VeryLo
HowAbout
oLyreVA noLyreV
xampl Eg el Examp
hci Is hW As hi Ihc
nAo Ev sl ev so EnA
quare Sn Ie Squar
Odaetsn fOdaets
OddOneAn
steadO
S e
s v
h s
E l
VeryLo
xamp
i I
o E
quar
An
ch
Input: Lenght7
Output:
Le
ng
Input: abc
Output:
a
Ответы:
SOGL V0.12 , 75 байтов
Попробуй здесь!
Это ожидает ввода в стеке, поэтому для простоты использования я добавил
,
в начале. Это может вызвать проблемы, если входные данные содержат только цифры, так что вот набор тестов для этого.70 байтов
√lH»{ā;l⁾:A∫Ba{bIwFIWhFbž;FIbI@ž}};}¹K⁴{ē2\⌡±e{@Κ};⁴┼┼};0E{ē2\⌡№:h++}╚
тоже работает, но поскольку я только сейчас реализовал√
строки, и в документации не упоминалось, что это будет соответствовать длине, я не буду считать это.Объяснение:
источник
√
работал только на числа. Причина, по которой я не считаю 75-байтовую версию, заключается в том, что я чувствую, что она подпадает под лазейку добавления встроенного только для вызоваДревесный уголь ,
120109 байтПопробуйте онлайн! Обратите внимание, что с
A
тех пор был изменен на,≔
и ссылка отражает это. Объяснение:Рассчитывает
h = int(sqrt(len(q)))
. (Floor
еще предстоит реализовать ...)Извлекает
h
фрагменты длиныh
из ввода. (На самом деле я не беспокоюсь обрезать фрагменты до длиныh
.) Я используюfor
цикл, а не a,Map
потому что мне нуженAssign
результатMap
где-то, и это нетривиально при работе с aSlice
.Развертывание происходит 4 раза, по одному для каждого направления (вниз, вправо, вверх, влево, как закодировано). Переменная цикла для этой петли
i
.Возьмите копию нарезанной строки.
Вернитесь к началу холста, чтобы каждое разворачивание
h
начиналось сh
квадрата -by в том же месте.Повторите
(h+1)/2
раз; один раз для каждого разворачивания, плюс один раз для исходного квадрата. Переменная цикла для этой петлиk
.Повторите 4 раза, один раз для каждой стороны развернутого квадрата. (Я не использую переменную цикла
l
.)Распечатайте одну сторону развернутого квадрата. Так как это
k
разворачивается, сторона квадратаh-2k
, и забирает символыk
от края исходного квадрата.Опора готова напечатать следующую сторону квадрата.
Поверните нарезанную строку. (Да, это
ξ
. Я не часто использую это!)Eη
Также будет работать для внешнегоMap
. У вращения также есть удобный побочный эффект сокращения ширины массива доh
.После печати стороны курсор перемещается за край квадрата. Печать на один символ меньше не подходит для квадратов на стороне 1 и, в любом случае, меньше для игры в гольф. После предварительного поворота печать новой строки удобно перемещает курсор назад в угол.
Отразите квадрат вертикально или горизонтально в зависимости от ситуации.
Рассчитайте смещение до следующего разворачивания.
Двигайтесь горизонтально или вертикально к следующему разворачиванию в зависимости от ситуации.
Вот ссылка на 97-байтовую версию, полученную благодаря использованию всех последних функций Charcoal, включая
Floor
: Попробуйте онлайн! Ссылка на подробную версию кода.источник