Мутація, що затверділа мутацію


15

Ваше завдання - скласти програму, яка роздруковує власне джерело.

"Гей, у нас вже є цей виклик, і безліч його варіацій! Чому ви робите ще один?" Ви можете запитати, але цей буде одним із найскладніших (сподіваємось, все одно).

Ваша квітка повинна бути «загартованою мутацією», що означає, що квінка, навіть коли будь-який з її символів дублюється на місці, повинен виводити вихідний код вихідної програми.

Наприклад, якщо у вас є квітка (наступний приклад написаний не будь-якою мовою, це просто псевдокод):

abcd

Усі ці програми повинні виводити abcd:

aabcd
abbcd
abccd
abcdd

(В кожному з цих програм, a, b, cі dкожен дублюються на місці, а це означає , дубльований характер був поміщений безпосередньо після початкового символу.)

Правила:

  • Застосовуються стандартні правила квочки.
  • Багатобайтовий символ вважається одним символом, і символ не "розбивається" на відповідні байти при їх дублюванні.

Це , тому найкоротший код у байтах виграє!


Чи враховується це? 0і 00в CJam обидва вихідні 0.
geokavel

Ні, 0не належна королева.
Денніс

2
Я думаю, це було б набагато цікавіше як боулінг з кодом
Містер Xcoder

Чи вирішується проблема мутації коду взагалі? якщо мутація не трапиться з персонажем всередині цитованого рядка, зазвичай це пошкодить програму.
hasen

Чи не заголовок трохи оманливий? "Мутація" пропонує змінити персонажа, а не повторити його
Луїс Мендо

Відповіді:


18

> <> , 56 байт

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

Спробуйте в Інтернеті! або перевірити всі мутації .

Як працює оригінальна програма (застаріла)

Перекладач починається у комірці (0, 0) . ^задає напрямок вгору , тому вказівник інструкції (IP) обгортається до комірки (0, 20) .

'активує рядовий режим: до наступного 'не зустрінеться наступне , всі символи під IP-адресою висуваються на стек. Те ж 'саме виявляється знову після обгортання, тому ми натискаємо

d3*}^^:84*=?~oao0f.^

IP приземляється на рівні (0, 19) , все ще йде вгору. Виконання d3*}натискає 13 = 0xd , потім 3 , помножує обидва значення ( 39 / одна ціна ), потім обертає стек праворуч. Це залишає стек так.

'd3*}^^:84*=?~oao0f.^

Наступні дві інструкції ( ^) в цьому моменті нічого не роблять.

:84*=дублює верхню частину стека, висуває 8 і 4 , множує їх ( 32 / пробіл ), потім тестує дублюваний символ на рівність з простором . Для незмінної програми це завжди буде натискати 0 .

?пропускає наступну інструкцію, якщо верхня частина стека хибна. Для оригінальної програми вона завжди є, тому ~завжди пропускається.

oaoвискакує та друкує верхню частину стека, штовхає 10 / linefeed , потім з'являється та друкує linefeed .

Нарешті 0f.переходить до комірки (0, 15) (нижній край ^), починаючи з наступного символу на стеку.

Після того, як стек порожній, весь вихідний код був надрукований. :не вдасться, і програма завершиться.

Як працюють мутовані програми (застарілі)

Копіювання будь-якого символу без передачі даних буде розширювати програму лише горизонтально. Оскільки програма виконується вертикально, ці додаткові інструкції ніколи не виконуються.

Дублювання будь-якої подачі ліній перед бутомостом ^змістить осередки (0, 14) і (0, 15) на (0, 15) і (0, 16) . 0f.тепер перейде до клітинки раніше самого нижнього ^, що також є a ^, тому програма не впливає на зсув.

Нарешті, будь-який дубльований символ передачі рядків також змінить рядок. Короткі лінії прокладені пробілами, тож 32 / пробіл буде вставлений у позицію стрічки передачі. 84*=натисне 1 для пробілу, тому ?не пропускає наступну інструкцію. У цьому випадку ~з'являється та викидає простір , тож наступне oбуде надрукувати символ над простором .


Ви можете дублювати будь-який новий рядок, і він все одно буде працювати.
Денніс

3
О, я не прочитав повідомлення належним чином: P (Блін Денніс, чому ти такий хороший)
clismique


@ jimmy23013 Слід виправити.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.