Алиса , 53 52 байта, неконкурирующая
Спасибо Лео за косвенное сохранение 1 байта.
/o *^i}'.*[;.h~r}}~"{.[^\\
@"S .^~ y~a}~~.["{!~"}^^^
Попробуйте онлайн!
К сожалению, мне пришлось исправить ошибку с y
(транслитерацией), чтобы сделать эту работу, поэтому я отметил ее как неконкурентную.
объяснение
Основная идея состоит в том, чтобы создать строку яйца, но ~
в качестве заполнителя для двух копий ввода. Тем не менее, другие символы ввода не особенно удобны для строк Алисы, потому что они не могут содержать перевод строки, и все из /\_|
них должны быть экранированы (потому что они рассматриваются как зеркала и стены). Поэтому я могу сохранить некоторые байты, используя для них также заполнители, а затем транслитерировать их. Заполнители для /\_|
являются .[^{
, которые просто символ прямо перед тем, который они представляют. Для перевода строки я использую }
.
Теперь код ... вся программа может быть решена в обычном режиме, так как нам нужна только обработка строк, а не целые числа. Кроме того, нам не нужен поток условного контроля. Вся программа может быть выражена линейно. Общая структура программы такова:
/...//
@....
В такой программе IP прыгает вверх и вниз по ...
разделу, сначала выполняя только половину символов. Затем два /
в конце перемещают IP вправо на одну ячейку, так что на обратном пути он выполняет вторую половину (снова подпрыгивая вверх и вниз), пока, наконец, программа не @
завершит работу. Поэтому, если мы развернем забавную зигзагообразную структуру посередине, программа, которую мы выполняем, действительно будет выглядеть так:
" ^^} .~[}.~~[}{~~{}[^^^^.""!}"r.h~;a*y'~i.*So
Давайте пройдем через это:
" ^^} .~[}.~~[}{~~{}[^^^^."
This first string is simply the egg template I've talked about.
"!}" Push this string. It covers all the characters we need to replace
in the template except ~.
r Range expansion. Turns '!}' into '!"#$...z{|}'.
. Duplicate.
h~; Split off the first character, swap it to the top and discard it.
a* Append a linefeed.
We've now basically rotated the string to the left, but appended
a linefeed instead of the exclamation mark we've shifted off.
This maps each character in the string to the next one, except }
which gets mapped to a linefeed.
y Transliterate. Since the strings have the same length, this just maps
each character in the first string to the corresponding character in
the second string, replacing all of our placeholder characters.
'~ Push "~".
i.* Read the input and duplicate it.
S Substitute all "~" with the doubled input.
o Output the result.