Учитывая строку, сначала возведите ее в квадрат:
Сначала напишите строку.
abcde
Далее пишем строку повернутую на одну влево.
abcde
bcdea
Продолжайте делать это до тех пор, пока не напишите строки len (string) .
abcde
bcdea
cdeab
deabc
eabcd
Теперь прочитайте строку так:
----+
+--+|
|+>||
|+-+|
+---+
Который дает:
abcdeabcdcbaedcbcdeabaede
Распечатать эту строку.
Контрольные примеры
abcdef -> abcdefabcdedcbafedcbcdefabcbafedefaf
cena! -> cena!cenanec!anena!cec!a!
ppcg -> ppcgppcppgcpcgpg
abc -> abcabacbc
ab -> abab
a -> a
->
Пожалуйста, прокомментируйте, если тестовый случай неверен.
Помните, это код-гольф , поэтому выигрывает код с наименьшим количеством байтов.
cena!
неправильно. Это должно соответствовать вашему примеру,abcde
так как оба 5 букв:cena!cenanec!anena!cec!a!
Ответы:
JavaScript (ES7),
83807877 байтБонус ES3-совместимая программа:
объяснение
Это использует тот факт, что выходные данные, например, для строки длиной 5, могут быть представлены как:
где каждая цифра представляет индекс в строке (начиная с 0), по модулю длина строки. Другими словами, если n - длина строки, мы увеличиваем индекс 2n - 1 раз, затем уменьшаем его 2 (n - 1) - 1 раз, затем увеличиваем его 2 (n - 2) - 1 раз и т. Д. Это можно упростить до следующего алгоритма:
Это работает, потому что floor (sqrt (x)) переключает четности после 2n - 1 итерации, затем 2 (n - 1) - 1 итерации и т. Д.
источник
Pyth , 15 байт
Программа, которая принимает ввод
"quoted string"
и печатает результат.Попробуйте онлайн! или проверьте все контрольные примеры (модифицированные для множественного ввода).
Как это устроено
источник
Python 2.7 (в CMD.EXE), 91 байт
Для этого требуется терминал с рабочим backspace (
\b
), и он не будет работать на repl.it или ideone.com . Оператор печати, заканчивающийся запятой, разделяет дальнейший вывод пробелом вместо новой строки или возврата. Backspace позволяет нам перезаписать разделяющее пространство.Python 2.7, 96 байт
Попробуйте это на ideone.com или repl.it (спасибо Оливеру). Входные данные должны быть строкой Python, например
'cena!'
.Четыре ломтика прилагаемой петли (
s[i:]
,s[:n-i]
,r[i+2:]
,r[:n-i]
) взят из четырех краев спирали. Например, с01234
квадратом это:Таким образом , мы принимаем
01234
,0123
,210
,4321
. Переменнаяi
- это индекс верхнего левого значения на каждом шаге процесса. В последней спирали несколько ломтиков могут быть пустыми.источник
S=''
,print S
иS+=
, завертывания и все , прежде чемi+=2
вprint()
заявлении сsep=''
, вы можете сохранить 2 байта.i<=n
наn>i
"a string of odd length."
Желе ,
1110 байтTryItOnline! или все тесты
Как?
Квадрат без спирали - это серия прогонов "верхний край плюс правый край" и "нижний край плюс левый край", каждый из которых является обратным предыдущему прогону без первой и последней буквы, а первый из которых является входом плюс вход без последней буквы (например, у входа
"abcde"
есть выход"abcdeabcd" + "cbaedcb" + "cdeab" + "aed" + "e"
).источник
05AB1E, 12 байтов
Попробуйте онлайн!
Объяснение:
источник
MATL , 27 байт
Пустой вход завершается с ошибкой (выдает правильный вывод).
Попробуйте онлайн! Или проверьте все тестовые случаи .
источник
C
9594 байтаВдохновленный ответом @ETHproductions.
источник
Perl, 99 байт
Пробелы не являются частью программы и предназначены для удобства чтения.
Не очень эффективный код. Я должен был как-то сократить первые три строки, но все, что я пытался сделать, оказалось неудачным. Этот троичный оператор также должен быть как-то исправлен, но наличие этого способа позволило сократить мой код примерно на 10 байтов, потому что я мог бы вырезать так много.
Код работает путем составления списка палиндромов, разделенных четными числами, которые представляют значения места строки, которую нужно извлечь.
источник
-F
который заменит строки 1 и 3. Введите ввод,echo -n
чтобы удалитьchop
. (это должно дать вам около 81 байта)На самом деле ,
2113 байтЭтот алгоритм в значительной степени основан на ответе Джонатана Аллана на желе . Существует два способа печати результата в виде одной строки. Используемый здесь подход дублирует промежуточный шаг, а затем добавляет его к промежуточной сумме в регистре 1 (по умолчанию пустая строка);
;╕
в функции, затем╛
в конце. Другой подход заключается в дублировании промежуточного шага, оставлении этих дублирующих шагов в стеке и суммировании их в одну строку в конце;;
в функции, затемkΣ
в конце.Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Ungolfing
источник
Python 3, 59 байт
repl.it
Прямой порт моего желе ответа ; только полная программа, принимающая ввод (а не функцию).
Это
print(x,end='')
оператор печати, который не будет печатать новую строку по умолчанию.источник
Python 3, 93 байта
Попробуйте онлайн!
источник
print(...,end='')
, чтобы делатьprint(end=s[i:]+s[:n-i]+r[i+2:]+r[:n-i]
abcde
,e
в конце его не хватает .i<=n
вместо того, чтобыn-i
для вашего состояния.