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 butterfly
po 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
źródło
Odpowiedzi:
Befunge-98, 602 bajtów
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:
Z kolei ich dolna część:
źródło
PHP, 74 bajty
<?=
jest równoważne<?php echo
i 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)strtr
zastępuje „gąsienica!” z „pięknym motylem!” w argumencieźródło
Pyth,
5046 bajtówWyjaśnienie
Wynikowy kod źródłowy to
Co w zasadzie drukuje tekst.
źródło
Perl 6,
6056 bajtówWymaga -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 ...
źródło
$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 zno strict 'subs'
is///
interpoluje zmiennych na LHS.)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/
jest krótszy i na pewno będzie działał w Perlu 6.Siatkówka, 53 bajty
Wydruki:
Zauważ, że nie ma separatora między
I am a caterpillar!
nowym programem. Nowy program nie oczekuje żadnych danych wejściowych.źródło
bash
/awk
/cksum
-179,2169,6168 bajtówPróbny:
Mam nadzieję, że 20% dotyczy dowolnego łańcucha rozpoczynającego się od
xyz
, w przeciwnym razie pierwotna liczba to224212210 bajtów (naprawiono"I am Batman!"
część).Transformacja zrobić: zastępuje jedynie wystąpienie dosłownym
!NF
z10
, tak że" butterfly"
jest również drukowane za pomocąprintf
.Wykonuje proste
cksum
na 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.
źródło
Python - 184 bajty -20% dla bonusu = 147,2
Aby wydrukować
I am batman
, zamień pierwsze trzy podwójne cudzysłowy na pojedyncze cudzysłowy na wejściu. (Pierwszy wiersz to'''"""
)źródło