Metamorfosi del codice sorgente


29

mbomb007 ci ha chiesto di fare un programma auto-mutilante . È una sfida interessante, ma personalmente non mi piace incoraggiare i miei programmi ad automutilarsi. Mi piace pensare che, al centro di ogni programma, vi sia una bellissima farfalla in attesa di scoppiare.

Come tale, per la mia prima sfida di Code Golf, sfido Stack Exchange a metamorfizzare una farfalla. Il tuo programma dovrebbe accettare il proprio codice come input e output I am a caterpillar!seguito dal codice per un altro programma nella stessa lingua (puoi mettere un divisore tra gli output o no ... ma stiamo parlando di farfalle, quindi la bellezza conta!). Questo secondo programma dovrebbe essere prodottoI am a beautiful butterfly!

Metamorfosi: questo programma dovrebbe modificarsi, motivo per cui viene passato come input. Non voglio un programma nidificato noioso che non sia altro che un'istruzione print I am a caterpillar!seguita dalla stampa del codice sorgente. Devi metamorfizzare il codice stesso, quindi la risposta più noiosa e accettabile è quella che stampa I am a caterpillar, quindi strappa una stringa dall'input (che sembra essere codice) e la stampa. Naturalmente, questo è un piccolo requisito molto complicato da scrivere, quindi dovrebbe essere considerato come uno "spirito della sfida". Il requisito formale verrà impostato su "Se al tuo programma viene assegnata una stringa casuale della stessa lunghezza del tuo programma, ci dovrebbe essere meno del 5% di possibilità di stampare I am a butterflyquando viene eseguito il secondo programma."

Sommario:

  • Scrivi un programma che, quando viene fornito il proprio codice come input, stampa I am a caterpillar!seguito da un blocco di codice sorgente (con un delimitatore tra loro o meno).
  • Questo secondo blocco di codice sorgente, quando compilato / interpretato nella stessa lingua, viene stampato I am a beautiful butterfly!
  • Se al programma non viene inserito il proprio codice sorgente come input e viene invece fornita una stringa casuale di caratteri che non corrisponde al proprio codice, il risultato deve non riuscire a compilare / interpretare o non stampare I am a butterfly!per almeno il 95% di casuale stringhe (spirito: ci si aspetta che tu legga il tuo codice sorgente dall'input e lo unisca in una farfalla).
    • Mi sento a mio agio nel non provarlo, fintanto che ti mantieni allo spirito dell'idea di metamorfosi, modificando il tuo codice, ma se stai cercando di giocare a giochi di scappatoia per aggirare usando i tuoi input, aspettati di avere per dimostrarlo.
  • Si applicano scappatoie standard

Vorrei che questi fossero giudicati in base alla loro bellezza, ma questo è un approccio decisamente non quantitativo, quindi il solito percorso "numero di byte" può essere usato per giudicare

Bonus : -20% - scegli una stringa di 3 lettere che non corrisponde alle prime 3 lettere del tuo programma. Se eseguo il programma Caterpillar, ma modifico l'input in modo che i primi 3 caratteri vengano cambiati in quelli specificati, stampa I am Batman!invece. Sii sempre Batman. (Le stesse regole di stringa casuali si applicano per questa ... metamorfosi! )

Esempio di prova (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

Come nota: mi piacerebbe vedere programmi artistici ascii in cui sembra un bruco la prima volta, e si trasforma in una farfalla ascii nella fase successiva, ma è un po 'più avanzato di quanto la sfida debba essere.
Cort Ammon - Ripristina Monica il

Cosa dovremmo fare se un programma ha più file?
TheNumberOne

@TheNumberOne Sono curioso di sapere cosa hai pianificato lì! Non so se voglio abbattere immediatamente le regole per quello, senza vedere le conseguenze, ma mi sembra che, se dovessi accettare un set di file in più parti come input (piuttosto che un singolo file contenuti), e dovevi produrre un set di output in più parti (piuttosto che un singolo output), con un delinatore mezzo ragionevole tra i file, penso che dovrebbe essere una soluzione ragionevole. Se ciò non funziona per te, potrei aver bisogno di maggiori informazioni sulla soluzione proposta per elaborare meglio una regola.
Cort Ammon - Ripristina Monica il

@TheNumberOne E grazie per la battuta di refuso. Quel refuso non era chiaramente una bellissima farfalla!
Cort Ammon - Ripristina Monica il

Risposte:


63

Befunge-98, 602 byte

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

Testato in PyFunge.

Quando viene eseguito con una stringa che non inizia con 2 spazi (probabilità ben superiore al 95% quando casuale) non genera nulla. Questo non è esattamente ciò che l'OP sta cercando, ma si adatta alle specifiche.

Quando viene passata una stringa che inizia con 2 spazi (come se stessa) genera questo:

I am a caterpillar!

---

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

La parte inferiore di ciò, a sua volta, produce:

I am a beautiful butterfly!

2
Wow. Questo è fantastico
uno spaghetto l'

3
Sapevo che qualcuno avrebbe voluto spingere le regole proprio come hai fatto tu; Sono contento che ne sia venuto fuori qualcosa di bello =)
Cort Ammon - Ripristina Monica l'

Sia il bruco che la farfalla sembrano bloccati in Matrix. Bellissimo!
Erno,

dove posso eseguire questo?
user1514631

3
Non capirò mai come voi bravi ragazzi di Code Golf riuscite a creare mostruosità così belle.
Chris Cirefice,

19

PHP, 74 byte

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=equivale a <?php echoe può accettare diversi valori separati da virgola per l'output
  • ¶ßž’ßžße šžŠ‹–™Š“ߊ‹‹š™“†Þsono nomi di costanti validi in PHP, ma poiché le costanti non esistono sono trattate come stringhe letterali. ~li inverte in "I am a "e "beautiful butterfly!"(salvando un byte per un segno di virgolette ciascuno)
  • strtrsostituisce "bruco!" con "una bellissima farfalla!" nell'argomento

2
Vuoi fornire una spiegazione?
Timwi,

@Timwi nessun problema, aggiunta spiegazione
Fabian Schmengler

Mi aspettavo che qualcuno codificasse "bellissima farfalla" con qualcosa come ROT13, ma l'idea di abbinarlo alla tecnica letterale delle stringhe di PHP è, nelle parole di Kaylee, splendente!
Cort Ammon - Ripristina Monica il

7

Pyth, 50 46 byte

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

Spiegazione

"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

Il codice sorgente risultante è

"I am a beautiful butterfly!

Che fondamentalmente stampa il testo.


6

Perl 6, 60 56 byte

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

Richiede -p per funzionare correttamente; Ho tenuto conto di questo nel conteggio dei byte. Purtroppo uno degli svantaggi di Perl 6 è che la sintassi è molto più severa ora ...


I trattori a cingoli sono vulnerabili durante la metamorfosi. Ecco perché a loro piace avvolgersi nelle variabili c̶o̶c̶o̶o̶n̶s̶: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/( Suppongo che Perl 6 permetta parole d'ordine come Perl 5 con no strict 'subs'e s///interpola le variabili su LHS.)
ThisSuitIsBlackNon

Eh, è divertente. L'ho provato e per qualche motivo quando ho fatto il wc mi ha dato la stessa quantità di byte. Ma digitandolo di nuovo mi ha dato meno byte. Strano.
uno spaghetto il

Oh aspetta non ricordo, ricordo perché non l'ho fatto. Quando viene eseguito il nuovo codice, viene generato un errore a causa dello spazio tra beautiful e butterfly.
uno spaghetto il

Ah, non ho mai usato Perl 6, quindi non posso aiutarti. Volevo solo una scusa per fare un'arguta osservazione. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/è più corto e funzionerà sicuramente in Perl 6.
ThisSuitIsBlackNon

1
@ThisSuitIsBlackNot Si adatta alla sfida. Le regole erano lì per assicurarti di leggere e modificare il tuo codice. Alla fine, il vero spirito sta cercando di liberare la bellissima farfalla nel cuore del codice. La bellezza, ovviamente, è negli occhi di chi guarda. Ognuno troveremo soluzioni diverse più o meno belle di altre. Per quanto riguarda le soluzioni in PERL, beh ... diciamo solo che PERL ha una sua peculiare definizione di bello e si adatta bene ai suoi scopi ;-)
Cort Ammon - Reinstate Monica

4

Retina, 53 byte

caterpillar
beautiful butterfly
^
I am a caterpillar!

Stampa:

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

Si noti che non esiste un separatore tra I am a caterpillar! e il nuovo programma. Il nuovo programma non prevede input.


3

bash/ awk/ cksum- 179,2 169,6 168 byte

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

demo:

$ 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

Spero che il 20% si applichi a qualsiasi stringa che inizia con xyz, altrimenti il ​​conteggio originale è 224 212 210 byte (risolto il "I am Batman!"pezzo).

Trasformazione eseguita: sostituisce l'unica occorrenza del letterale !NFcon 10, in modo che " butterfly"sia anche stampato usando ilprintf .

Esegue un semplice cksumsu una porzione (cioè il resto) del codice sorgente, quindi anche il suo requisito.

Avvertenza: il primo input deve terminare con '. Non tanto un avvertimento quanto a sopprimere input errati ...

Non è previsto alcun secondo input.


1
WHOA. Stavo aspettando la persona strana, e basta. È abbastanza bello.
giovedì

@jrg grazie per l'incoraggiamento. :)
hjk

1

Python - 184 byte -20% per bonus = 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";'''

Per stampare I am batman, sostituire le prime tre virgolette doppie con virgolette singole nell'input (la prima riga è '''""")

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.