Метаморфози вихідного коду


29

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

Як такий, для мого першого в історії виклику Code Golf я закликаю обмінятися стеками, щоб перетворити метелика. Ваша програма повинна приймати власний код як введення та виведення з I am a caterpillar!подальшим кодом для іншої програми на тій же мові (ви можете поставити роздільник між виходами чи ні ... але ми говоримо про метеликів, тому чіткість рахується!). Ця друга програма повинна вивестиI am a beautiful butterfly!

Метаморфоза: Ця програма повинна змінювати себе, саме тому вона передається сама як вхідна. Я не хочу нудної вкладеної програми, яка є не що інше, як твердження про друк з I am a caterpillar!подальшим друком вихідного коду. Ви повинні метаморфізувати сам код, тому найбільш нудною прийнятною відповіддю є той, який друкує I am a caterpillar, потім вириває рядок із вхідних даних (що трапляється з кодом) і друкує це. Звичайно, це дуже складна вимога до написання, тому слід розглядати її як "дух виклику". Формальна вимога буде встановлена ​​у "Якщо вашій програмі буде надано випадковий рядок такої ж довжини, що і ваша програма, при друкуванні програми друк має бути меншим, ніж 5% I am a butterfly."

Підсумок:

  • Напишіть програму, яка при наданні власного коду як вхідного сигналу друкує I am a caterpillar!наступний блок вихідного коду (з роздільником між ними чи ні).
  • Цей другий блок вихідного коду, коли компілюється / інтерпретується як однакова мова, друкується I am a beautiful butterfly!
  • Якщо ваша програма не подається власним вихідним кодом як вхідним, а натомість їй надається випадкова рядок символів, що не відповідає її власному коду, результат повинен або не вдаватися до компіляції / інтерпретації, або не надрукувати I am a butterfly!принаймні 95% випадкових випадків рядки (дух: очікується, що ви прочитаєте власний вихідний код із вхідних даних і зшийте їх разом із метеликом).
    • Мені подобається, що ви цього не доказуєте, доки ви тримаєтесь духу метаморфози, змінюючи власний код, але якщо ви намагаєтеся грати в ігри із лазівками, щоб обійтись, використовуючи свої входи, сподівайтеся щоб довести це.
  • Застосовуються стандартні лазівки

Я хотів би, щоб вони оцінювались за їх красою, але це рішуче некількісний підхід, тому звичайний маршрут "кількість байтів" можна використовувати для судження

Бонус : -20% - виберіть будь-яку 3 букву, яка не відповідає першим 3 буквам вашої програми. Якщо я запускаю програму гусениць, але змінюю вхід, щоб перші 3 символи були змінені на вказані, друкуйте I am Batman!замість цього. Завжди будь Бетменом. ( Для цього ... метаморфози застосовуються однакові випадкові рядкові правила! )

Тривіальний приклад (пітон):

"""
    print "I am a beautiful butterfly!"
    #print "I am Batman!"
"""
import sys
code = sys.stdin.read()
if code.startswith("YYZ"):
   # swap the comments between the print statements
   code = code.replace("#print", "_a").replace("print", "#print").replace("_a", "print")
code = [3:] # remove """ or XYZ
code = code.split('"""')[0]
print "I am a caterpillar!"
print code

Як зауваження: я хотів би побачити мистецькі програми ascii, де вона схожа на гусеницю вперше, і наступною фазою перетворюється на метелика асці, але це зовсім трохи досконаліше, ніж це повинно бути.
Корт Аммон - Відновіть Моніку

Що робити, якщо програма має кілька файлів?
TheNumberOne

@TheNumberOne Мені цікаво, що ви там планували! Я не знаю, чи хочу я відразу збити правила для цього, не бачачи наслідків, але мені здається, що якби ви прийняли багатофакторний набір файлів як вхідний (а не один файл вмісту), і ви мали вивести багаточастинний набір результатів (а не один вихід) з напіврозумним делініатором між файлами, я думаю, що це має бути розумним рішенням. Якщо це не допоможе вам, мені може знадобитися більше розуміння запропонованого вам рішення, щоб краще скласти правило.
Корт Аммон - Відновіть Моніку

@TheNumberOne І дякую за помилку друку. Це друкарство було явно не прекрасним метеликом!
Корт Аммон - Відновіть Моніку

Відповіді:


63

Befunge-98, 602 байти

                                        "^@<"v@@
                                     "'I'"00v>00g::
                                   "@v"0v@@@>g::a">#"
                                 "a">v@@>      0g::'"1>                                 /
                             ":\"'"v@>            'm'"00g:a                       >"@v$"
 "lufituaeb"'"'v00ga"@v\"'":'b\00v@>                :'a\":*84>"00ga"\>@@@@_,#:>"00g:a'<'"
"et"'"'va'v'":'l\00g5k:'""y!">>v@>                    g::'''""ut"'"'>a'<'""fr"'"00g3k:'">
 "ma"00g>'I~48*-~48*-+#@_>:#,_@>                        '"aa"---"aa"!rallipretac"00g:'a\

Випробуваний у PyFunge.

Якщо запустити рядок, що не починається з двох пробілів (вірогідність набагато більше 95%, якщо випадково), нічого не виходить Це не зовсім те, що шукає ОП, але відповідає технічним умовам.

При передачі рядка, що починається з 2 пробілів (як і сам), виводиться це:

I am a caterpillar!

---

"!y"       "l"v
v"te"     "rf"<
>"tu"'   "b"\v@
 v"beautiful"<
  >:#,_@@@@>\
 >48*:"a"\:$v@
  "ma"   v@#>
   'I'   <@^

Нижня частина цього, у свою чергу, дає:

I am a beautiful butterfly!

2
Ого. Це дивно.
спагето

3
Я знав, що хтось захоче порушити правила так само, як і ти; Я радий, що з цього вийшло щось красиве =)
Корт Аммон - Відновіть Моніку

І гусениця, і метелик виглядають так, ніби вони застрягли в Матриці. Гарний!
Ерно

де я можу це запустити?
користувач1514631

3
Я ніколи не зрозумію, як вам, добрі люди в Code Golf, вдається створити такі чудові чудовиська.
Кріс Сірефіс

19

PHP, 74 байт

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=еквівалентний <?php echoі може приймати для виведення кілька значень, розділених комами
  • ¶ßž’ßžßі šžŠ‹–™Š“ߊ‹‹š™“†Þє дійсними постійними іменами в PHP, але через те, що константи не існують, трактуються як рядкові букви. ~перетворює їх у "I am a "та "beautiful butterfly!"(зберігаючи байт для одного лапки)
  • strtrзамінює "гусениця!" з "прекрасним метеликом!" в аргументі

2
Хочете надати пояснення?
Тімві

@Timwi немає проблем, пояснення додано
Фабіан Шменглер

Я повністю сподівався, що хтось закодуватиме "прекрасного метелика" чимось на зразок ROT13, але ідея зіставити його зі строковою літературною технікою PHP, за словами Кайлі, блискуча!
Корт Аммон - Відновити Моніку

7

Pyth, 50 46 байт

"I am a caterpillar!"+<z8"beautiful butterfly!

Пояснення

"I am a caterpillar!"        print "I am a caterpillar!"
 z<8                         first 8 chars of input
+   "beautiful butterfly!    add "beautiful butterfly!" to that and print

Отриманий вихідний код є

"I am a beautiful butterfly!

Який в основному друкує текст.


6

Perl 6, 60 56 байт

say "I am a caterpillar!"; s/\S+\!/beautiful butterfly!/

Потрібен -p для належного запуску; Я врахував це в кількості байтів. На жаль, одним із недоліків Perl 6 є те, що синтаксис зараз набагато суворіший ...


Гусениці вразливі під час метаморфозу. Ось чому їм подобається загортатись у змінні c̶o̶c̶o̶o̶n̶s̶: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(я припускаю, що Perl 6 дозволяє такі голові слова, як Perl 5, no strict 'subs'і s///інтерполювати змінні на LHS.)
ThisSuitIsBlackNot

Так, це смішно. Я спробував це і чомусь, коли я робив туалет, він дав мені стільки ж байтів. Але після його повторного введення він дав мені менше байтів. Дивно.
спагетто

О, не чекайте, я пам'ятаю, чому я цього не зробив. При запуску нового коду він видає помилку через простір між красунею та метеликом.
спагетто

Ах, я ніколи не використовував Perl 6, тому не можу вам там допомогти. Мені дуже хотілося приводу зробити дотепне зауваження. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/коротший і, безумовно, працюватиме в Perl 6.
ThisSuitIsBlackNot

1
@ThisSuitIsBlackNot Це не відповідає виклику. Правила існували саме для того, щоб переконатися, що ви дійсно читали та змінювали свій код. Зрештою, справжній дух намагається дозволити прекрасному метелику в серці коду вирватися. Краса, звичайно, в очах глядача. Ми знайдемо різні рішення, більш-менш красиві, ніж інші. Що стосується рішень в PERL, ну ... скажімо, у PERL є своє особливе визначення прекрасного, і воно цілком відповідає його цілям ;-)
Корт Аммон - Відновіть Моніку

4

Сітківка, 53 байти

caterpillar
beautiful butterfly
^
I am a caterpillar!

Друкує:

I am a caterpillar!beautiful butterfly
beautiful butterfly
^
I am a beautiful butterfly!

Зауважте, що між I am a caterpillar! новою програмою немає роздільника . Нова програма не очікує введення.


3

bash/ awk/ cksum- 179,2 169,6 168 байт

awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'

Демонстрація:

$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am a caterpillar!
echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
$ echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
I am a beautiful butterfly!

# Batman!
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> xyzawk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am Batman!

# Invalid input
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0{'
> E

Я сподіваюсь, що 20% застосовується для будь-якого рядка, починаючи з цього xyz, інакше початкова кількість становить 224 212 210 байт (виправлена "I am Batman!"частина).

Перетворення зроблено: замінює тільки входження литерала !NFз 10, так що " butterfly"це також роздруковані з допомогоюprintf .

Виконує просту cksumчастину (тобто решту) вихідного коду, отже, і його вимога.

Застереження: перший вхід повинен закінчуватися '. Не стільки застереження, скільки придушення неправильного введення ...

Другий вхід не очікується.


1
ВООЗ. Я чекав на людину awk, і це все. Це досить круто.
jrg

@jrg дякую за заохочення. :)
hjk

1

Python - 184 байт -20% за бонус = 147,2

""""""
import sys;c=sys.stdin.read();print"I am a caterpillar!";x=c[3:] if"\'''"!=c[:3] else c
print x+c[:3]
""";print"I am a beautiful butterfly!" """
''';print"I am Batman";'''

Для друку I am batmanзамініть перші три подвійні лапки на одиничні лапки на вводі. (Перший рядок '''""")

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