Аліса , 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.