Metamorfoza kodu źródłowego

29

mbomb007 poprosił nas o stworzenie programu samookaleczającego . To ciekawe wyzwanie, ale osobiście nie lubię zachęcać moich programów do samookaleczania. Lubię myśleć, że w sercu każdego programu jest piękny motyl czekający na wybuch.

Jako taki, podczas mojego pierwszego w historii zawodów Code Golf, rzucam wyzwanie Stack Exchange metamorfozie motyla. Twój program powinien zaakceptować swój własny kod jako dane wejściowe i wyjściowe, I am a caterpillar!a następnie kod innego programu w tym samym języku (możesz umieścić dzielnik między wyjściami, czy nie ... ale mówimy o motylkach, więc liczy się ładność!). Ten drugi program powinien zostać wygenerowanyI am a beautiful butterfly!

Metamorfoza: ten program powinien się modyfikować, dlatego jest przekazywany jako dane wejściowe. Nie chcę nudnego zagnieżdżonego programu, który jest niczym innym jak instrukcją print, I am a caterpillar!po której następuje wydruk kodu źródłowego. Musisz przekształcić sam kod, więc najbardziej nudną akceptowalną odpowiedzią jest ta, która wypisuje I am a caterpillar, a następnie wyrywa ciąg z wejścia (który jest kodem) i drukuje go. Oczywiście jest to bardzo trudny, mały wymóg pisania, dlatego należy go traktować jako „ducha wyzwania”. Wymaganie formalne zostanie ustawione na „Jeśli twój program otrzyma losowy ciąg o tej samej długości co twój program, powinno być mniej niż 5% szansy na wydruk I am a butterflypo uruchomieniu drugiego programu”.

Podsumowanie:

  • Napisz program, który po podaniu własnego kodu jako danych wejściowych wypisze I am a caterpillar!blok kodu źródłowego (z separatorem między nimi lub nie).
  • Drugi blok kodu źródłowego, po skompilowaniu / interpretacji jako ten sam język, zostanie wydrukowany I am a beautiful butterfly!
  • Jeśli twój program nie otrzymuje własnego kodu źródłowego jako danych wejściowych i zamiast tego otrzymuje losowy ciąg znaków, który nie pasuje do własnego kodu, wynik musi albo nie zostać skompilowany / zinterpretowany, albo nie zostać wydrukowany I am a butterfly!przez co najmniej 95% losowego strings (duch: oczekuje się, że przeczytasz własny kod źródłowy z wejścia i połączysz go w motyla).
    • Czuję się swobodnie z tym, że nie udowadniasz tego, dopóki trzymasz się ducha pomysłu metamorfozy, modyfikujesz swój własny kod, ale jeśli próbujesz grać w luki w grach, aby obejść się przy użyciu swoich danych wejściowych, spodziewaj się aby to udowodnić.
  • Obowiązują standardowe luki

Chciałbym, aby były one oceniane na podstawie ich piękna, ale jest to zdecydowanie nie-ilościowe podejście, więc do oceny można użyć zwykłej trasy „liczba bajtów”

Premia : -20% - wybierz dowolny 3-literowy ciąg, który nie pasuje do pierwszych 3 liter twojego programu. Jeśli uruchomię program gąsienicowy, ale zmodyfikuję dane wejściowe, tak aby pierwsze 3 znaki zostały zmienione na określone, I am Batman!zamiast tego wydrukuj . Zawsze bądź Batmanem. (W przypadku tej ... metamorfozy obowiązują te same losowe reguły strunowe ).

Trywialny przykład (python):

"""
    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
Cort Ammon - Przywróć Monikę
źródło
Uwaga: chciałbym zobaczyć programy sztuki ascii, w których za pierwszym razem wygląda jak gąsienica, aw następnej fazie zamienia się w motyla ascii, ale jest to nieco bardziej zaawansowane niż wyzwanie.
Cort Ammon - Przywróć Monikę
Co powinniśmy zrobić, jeśli program ma wiele plików?
TheNumberOne
@TheNumberOne Jestem ciekawy, co tam zaplanowałeś! Nie wiem, czy chcę od razu obalić zasady, nie widząc konsekwencji, ale wydaje mi się, że gdybyś zaakceptował wieloczęściowy zestaw plików jako dane wejściowe (zamiast jednego pliku zawartość), a ty miałbyś wypisać wieloczęściowy zestaw wyników (zamiast jednego wyjścia), z pół rozsądnym deliniatorem między plikami, myślę, że powinno to być rozsądne rozwiązanie. Jeśli to nie zadziała, być może potrzebuję więcej wglądu w proponowane rozwiązanie, aby lepiej opracować regułę.
Cort Ammon - Przywróć Monikę
@TheNumberOne I dziękuję za literówkę. Ta literówka bardzo wyraźnie nie była pięknym motylem!
Cort Ammon - Przywróć Monikę

Odpowiedzi:

63

Befunge-98, 602 bajtów

                                        "^@<"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\

Testowane w PyFunge.

Gdy jest uruchamiany z ciągiem znaków, który nie zaczyna się od 2 spacji (prawdopodobieństwo znacznie powyżej 95% w przypadku losowości), nic nie daje. To nie jest dokładnie to, czego szuka OP, ale pasuje do specyfikacji.

Po przekazaniu ciągu zaczynającego się od 2 spacji (takich jak on sam) wyprowadza to:

I am a caterpillar!

---

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

Z kolei ich dolna część:

I am a beautiful butterfly!
PurkkaKoodari
źródło
2
Łał. To jest niesamowite.
spaghetto
3
Wiedziałem, że ktoś będzie chciał przeforsować zasady tak jak ty; Cieszę się, że wyszło z tego coś pięknego =)
Cort Ammon - Przywróć Monikę
Zarówno gąsienica, jak i motyl wyglądają, jakby utknęły w Matrycy. Piękny!
Erno,
gdzie mogę to uruchomić?
user1514631,
3
Nigdy nie zrozumiem, jak wy, dobrzy ludzie w Code Golf, potraficie tworzyć tak piękne potworności.
Chris Cirefice,
19

PHP, 74 bajty

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=jest równoważne <?php echoi może przyjąć kilka wartości oddzielonych przecinkami
  • ¶ßž’ßžßi šžŠ‹–™Š“ߊ‹‹š™“†Þsą poprawnymi stałymi nazwami w PHP, ale ponieważ stałe nie istnieją, są traktowane jak literał łańcuchowy. ~odwraca je "I am a "i "beautiful butterfly!"(zapisując bajt dla każdego znaku cudzysłowu)
  • strtrzastępuje „gąsienica!” z „pięknym motylem!” w argumencie
Fabian Schmengler
źródło
2
Chcesz podać wyjaśnienie?
Timwi,
@Timwi bez problemu, dodano wyjaśnienie
Fabian Schmengler
W pełni spodziewałem się, że ktoś zakoduje „pięknego motyla” za pomocą czegoś takiego jak ROT13, ale pomysł dopasowania go do literalnej techniki PHP w postaci łańcucha jest, mówiąc słowami Kaylee, błyszczący!
Cort Ammon - Przywróć Monikę
7

Pyth, 50 46 bajtów

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

Wyjaśnienie

"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

Wynikowy kod źródłowy to

"I am a beautiful butterfly!

Co w zasadzie drukuje tekst.

PurkkaKoodari
źródło
6

Perl 6, 60 56 bajtów

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

Wymaga -p do poprawnego działania; Uwzględniłem to w liczbie bajtów. Niestety jedną z wad Perla 6 jest to, że składnia jest teraz o wiele bardziej rygorystyczna ...

spaghetto
źródło
Gąsienice są wrażliwe podczas metamorfozy. Dlatego oni lubią owijać się w zmiennych kokonów: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Jestem przy założeniu, że Perl 6 pozwala gołe słowa jak Perl 5 z no strict 'subs'i s///interpoluje zmiennych na LHS.)
ThisSuitIsBlackNot
To zabawne. Próbowałem tego iz jakiegoś powodu, gdy zrobiłem wc, dało mi to taką samą ilość bajtów. Ale po ponownym wpisaniu kodu otrzymałem mniej bajtów. Dziwne.
spaghetto
Och, czekaj, nieważne, pamiętam, dlaczego tego nie zrobiłem. Po uruchomieniu nowego kodu generuje błąd z powodu odstępu między pięknym a motylem.
spaghetto
Ach, nigdy nie korzystałem z Perla 6, więc nie mogę ci pomóc. Naprawdę chciałem tylko wymówki, by zrobić dowcipną uwagę. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/jest krótszy i na pewno będzie działał w Perlu 6.
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot To pasuje do wyzwania. Reguły były po to, aby upewnić się, że faktycznie czytasz i modyfikujesz swój kod. W końcu prawdziwy duch próbuje uwolnić pięknego motyla w sercu kodu. Piękno jest oczywiście w oku patrzącego. Każdy z nas znajdzie inne rozwiązania mniej lub bardziej piękne niż inne. Jeśli chodzi o rozwiązania w języku PERL, no cóż ... powiedzmy, że PERL ma swoją własną definicję piękna i doskonale pasuje do swoich celów ;-)
Cort Ammon - Przywróć Monikę
4

Siatkówka, 53 bajty

caterpillar
beautiful butterfly
^
I am a caterpillar!

Wydruki:

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

Zauważ, że nie ma separatora między I am a caterpillar! nowym programem. Nowy program nie oczekuje żadnych danych wejściowych.

Numer jeden
źródło
3

bash/ awk/ cksum- 179,2 169,6 168 bajtów

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}'

Próbny:

$ 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

Mam nadzieję, że 20% dotyczy dowolnego łańcucha rozpoczynającego się od xyz, w przeciwnym razie pierwotna liczba to 224 212 210 bajtów (naprawiono "I am Batman!"część).

Transformacja zrobić: zastępuje jedynie wystąpienie dosłownym !NFz 10, tak że " butterfly"jest również drukowane za pomocąprintf .

Wykonuje proste cksumna części (tj. Pozostałej części) kodu źródłowego, stąd też jego wymaganie.

Zastrzeżenie: pierwsze wejście musi kończyć się '. Nie tyle zastrzeżenie, ile tłumienie złych danych wejściowych ...

Nie oczekuje się drugiego wejścia.

hjk
źródło
1
WHOA. Czekałem na awk i to wszystko. To fajnie.
jrg
@jrg dzięki za zachętę. :)
hjk
1

Python - 184 bajty -20% dla bonusu = 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";'''

Aby wydrukować I am batman, zamień pierwsze trzy podwójne cudzysłowy na pojedyncze cudzysłowy na wejściu. (Pierwszy wiersz to '''""")

pppery
źródło