Исходный код Метаморфозы

29

mbomb007 попросил нас сделать самоуничижительную программу . Это интересная задача, но я лично не люблю поощрять свои программы к самоповреждениям. Мне нравится думать, что в основе каждой программы лежит красивая бабочка, ожидающая своего появления.

Таким образом, для моего первого испытания Code Golf я ставлю задачу Stack Exchange метаморфизировать бабочку. Ваша программа должна принимать собственный код в качестве входных и выходных данных, I am a caterpillar!за которым следует код для другой программы на том же языке (вы можете поместить разделитель между выходными данными или нет ... но мы говорим о бабочках, поэтому красивость имеет значение!). Эта вторая программа должна выводитьI am a beautiful butterfly!

Метаморфоза: эта программа должна изменить себя, поэтому она передается в качестве ввода. Я не хочу скучную вложенную программу, которая является не чем иным, как оператором печати, I am a caterpillar!за которым следует печать исходного кода. Вы должны метаморфировать сам код, поэтому самый скучный приемлемый ответ - это тот, который печатает I am a caterpillar, затем вырывает строку из ввода (которая оказывается кодом) и печатает ее. Конечно, это очень сложное требование, чтобы писать, поэтому его следует воспринимать как «дух вызова». Формальное требование будет установлено на «Если вашей программе задана случайная строка той же длины, что и ваша программа, то I am a butterflyпри запуске второй программы вероятность печати будет менее 5% ».

Резюме:

  • Напишите программу, которая при вводе своего собственного кода в качестве входных данных печатает, I am a caterpillar!а затем блок исходного кода (с разделителем между ними или нет).
  • Этот второй блок исходного кода при компиляции / интерпретации на том же языке печатает I am a beautiful butterfly!
  • Если ваша программа не вводит свой собственный исходный код в качестве входных данных, а вместо этого получает случайную строку символов, которая не соответствует ее собственному коду, результат должен либо не скомпилироваться / интерпретировать, либо не распечатать I am a butterfly!хотя бы для 95% случайных чисел strings (spirit: от вас ожидают, что вы прочитаете свой собственный исходный код из входных данных и соедините его в бабочку).
    • Мне удобно, если вы не докажете это, пока вы придерживаетесь идеи метаморфозы, модифицируете свой собственный код, но если вы пытаетесь играть в лазейки, чтобы обойти свои входные данные, ожидайте, что получите чтобы доказать это.
  • Применяются стандартные лазейки

Я бы хотел, чтобы об этом судили по их красоте, но это явно не количественный подход, поэтому для оценки можно использовать обычный маршрут «число байтов».

Бонус : -20% - выберите любую 3-буквенную строку, которая не соответствует первым 3 буквам вашей программы. Если я запускаю программу Caterpillar, но изменяю ввод, чтобы первые 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, где они выглядят как гусеница в первый раз и превращаются в бабочку ascii на следующем этапе, но это немного более продвинуто, чем нужно.
Корт Аммон - Восстановить Монику
Что делать, если в программе несколько файлов?
TheNumberOne
@TheNumberOne Мне интересно, что ты там запланировал! Я не знаю, хочу ли я сразу нарушать правила для этого, не видя последствий, но мне кажется, что если вы примете набор файлов из нескольких частей в качестве входных данных (а не один файл содержимое), и вы должны были вывести набор выходных данных из нескольких частей (а не один выход) с полуразумным разделителем между файлами, я думаю, что это должно быть разумным решением. Если это не сработает для вас, мне, возможно, понадобится больше узнать о предложенном вами решении, чтобы лучше выработать правило.
Корт Аммон - Восстановить Монику
@TheNumberOne И спасибо тебе за опечатку. Эта опечатка была явно не красивой бабочкой!
Cort Ammon - Восстановить Монику

Ответы:

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.

При запуске со строкой, не начинающейся с 2 пробелов (вероятность более 95% при случайном) ничего не выводится Это не совсем то, что ищет OP, но соответствует спецификации.

Когда передается строка, начинающаяся с 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!
PurkkaKoodari
источник
2
Вау. Это потрясающе.
спагетто
3
Я знал, что кто-то захочет подтолкнуть правила, как вы; Я рад, что что-то прекрасное вышло из этого =)
Корт Аммон - Восстановить Монику
И гусеница, и бабочка выглядят так, будто они застряли в Матрице. Прекрасный!
Эрно
где я могу запустить это?
user1514631
3
Я никогда не пойму, как вам, добрым людям в Code Golf, удается создавать таких прекрасных чудовищ.
Крис Cirefice
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!

Который в основном печатает текст.

PurkkaKoodari
источник
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
Да, это смешно. Я попробовал это, и по какой-то причине, когда я сделал wc, он дал мне такое же количество байтов. Но при повторном наборе он дал мне меньше байтов. Странный.
спагетто
Ой, подождите, я помню, почему я этого не делал. При запуске нового кода он выдает ошибку из-за пробела между красивым и бабочкой.
спагетто
Ах, я никогда не использовал Perl 6, поэтому не могу вам помочь. Я действительно хотел оправдание, чтобы сделать остроумное замечание. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/короче и непременно будет работать в Perl 6.
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot Это действительно соответствует вызову. Правила были просто там, чтобы убедиться, что вы действительно читаете и изменяете свой код. В конце концов, настоящий дух пытается освободить прекрасную бабочку в основе кода. Красота, конечно, в глазах смотрящего. Каждый из нас найдет разные решения, более или менее красивые, чем другие. Что касается решений в PERL, хорошо ... давайте просто скажем, что у PERL есть свое собственное своеобразное определение красивого, и оно отлично подходит для его целей ;-)
Cort Ammon - Восстановить Монику
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
WHOA. Я ждал 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, замените первые три двойные кавычки одинарными кавычками на входе. (Первая строка '''""")

pppery
источник