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
источник
Ответы:
Befunge-98, 602 байта
Проверено в PyFunge.
При запуске со строкой, не начинающейся с 2 пробелов (вероятность более 95% при случайном) ничего не выводится Это не совсем то, что ищет OP, но соответствует спецификации.
Когда передается строка, начинающаяся с 2 пробелов (как и сама), выводится это:
Нижняя часть этого, в свою очередь, выводит:
источник
PHP, 74 байта
<?=
эквивалентно<?php echo
и может принимать несколько значений, разделенных запятыми, для вывода¶ßž’ßžß
иšžŠ‹–™Š“ߊ‹‹š™“†Þ
являются действительными именами констант в PHP, но поскольку константы не существуют, они считаются строковыми литералами.~
инвертирует их в"I am a "
и"beautiful butterfly!"
(сохраняя байт для одной кавычки каждый)strtr
заменяет "гусеница!" с "прекрасной бабочкой!" в аргументеисточник
Pyth,
5046 байтовобъяснение
Полученный исходный код
Который в основном печатает текст.
источник
Perl 6,
6056 байтТребуется -p для правильной работы; Я учел это в подсчете байтов. К сожалению, одним из недостатков Perl 6 является то, что синтаксис стал намного более строгим ...
источник
$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/
(Я предполагаю, что Perl 6 допускает использование голых слов, таких как Perl 5,no strict 'subs'
иs///
интерполирует переменные в LHS.)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/
короче и непременно будет работать в Perl 6.Сетчатка, 53 байта
Распечатывает:
Обратите внимание, что между
I am a caterpillar!
новой программой и разделителем нет разделителя . Новая программа не ожидает ввода.источник
bash
/awk
/cksum
-179,2169,6168 байтДемо-версия:
Я надеюсь, что 20% применимо для любой строки, начинающейся с
xyz
, в противном случае исходное число составляет224212210 байт (фиксированная"I am Batman!"
часть).Преобразование сделано: заменяет только вхождение литерала
!NF
с10
, так что" butterfly"
это также распечатаны с помощьюprintf
.Выполняет простую
cksum
часть (то есть оставшуюся часть) исходного кода, отсюда и его требование.Предостережение: первый ввод должен заканчиваться наНе столько предостережение, сколько подавление неверного ввода ...'
.Второй вход не ожидается.
источник
Python - 184 байта -20% на бонус = 147,2
Чтобы напечатать
I am batman
, замените первые три двойные кавычки одинарными кавычками на входе. (Первая строка'''"""
)источник