Código-fonte Metamorfose

29

mbomb007 nos pediu para criar um programa auto-mutilante . É um desafio interessante, mas eu pessoalmente não gosto de incentivar meus programas a se auto-mutilarem. Eu gosto de pensar que, no centro de todo programa, há uma linda borboleta esperando para sair.

Como tal, no meu primeiro desafio do Code Golf, desafio o Stack Exchange a metamorfosear uma borboleta. Seu programa deve aceitar seu próprio código como entrada e saída, I am a caterpillar!seguido pelo código de outro programa no mesmo idioma (você pode colocar um divisor entre as saídas ou não ... mas estamos falando de borboletas, então a beleza conta!). Este segundo programa deve gerarI am a beautiful butterfly!

Metamorfose: Este programa deve se modificar, e é por isso que está sendo transmitido como entrada. Eu não quero um programa aninhado chato que não passa de uma declaração de impressão I am a caterpillar!seguida pela impressão do código-fonte. Você deve metamorfosear o próprio código, para que a resposta mais chata e aceitável seja aquela que imprime I am a caterpillar, depois rasga uma string da entrada (que por acaso é código) e imprime isso. Obviamente, esse é um pequeno requisito muito complicado de se escrever, por isso deve ser pensado como um "espírito do desafio". O requisito formal será definido como "Se o seu programa receber uma sequência aleatória do mesmo tamanho que o seu programa, deverá haver menos de 5% de chance de impressão I am a butterflyquando o segundo programa for executado".

Resumo:

  • Escreva um programa que, quando fornecido seu próprio código como entrada, imprima I am a caterpillar!seguido por um bloco de código-fonte (com um delimitador entre eles ou não).
  • Esse segundo bloco de código-fonte, quando compilado / interpretado como o mesmo idioma, imprime I am a beautiful butterfly!
  • Se o seu programa não receber seu próprio código-fonte como entrada e, em vez disso, receber uma sequência aleatória de caracteres que não corresponda ao seu próprio código, o resultado poderá falhar na compilação / interpretação ou não imprimir I am a butterfly!pelo menos 95% dos caracteres aleatórios. strings (espírito: espera-se que você leia seu próprio código fonte da entrada e costure-o em uma borboleta).
    • Fico confortável com você não provar isso, desde que mantenha o espírito da ideia de metamorfose, modifique seu próprio código, mas se estiver tentando jogar jogos de brecha para contornar as entradas, espere ter Para o provar.
  • Aplicam-se brechas padrão

Eu gostaria que eles fossem julgados por sua beleza, mas essa é uma abordagem decididamente não quantitativa, para que a rota usual de "número de bytes" possa ser usada para julgar

Bônus : -20% - escolha qualquer sequência de 3 letras que não corresponda às 3 primeiras letras do seu programa. Se eu executar o programa caterpillar, mas modificar a entrada para que os 3 primeiros caracteres sejam alterados para os especificados, imprima I am Batman!. Seja sempre o Batman. (As mesmas regras de cadeia aleatória se aplicam a essa ... metamorfose! )

Exemplo trivial (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 - Restabelecer Monica
fonte
Como observação: eu adoraria ver programas de arte ascii onde parece uma lagarta pela primeira vez e se transforma em uma borboleta ascii na próxima fase, mas isso é um pouco mais avançado do que o desafio precisa ser.
Cort Ammon - Restabelece Monica
O que devemos fazer se um programa tiver vários arquivos?
TheNumberOne
@TheNumberOne Estou curioso para saber o que você planejou lá! Não sei se quero derrubar as regras imediatamente, sem ver as consequências, mas parece-me que, se você aceitasse um conjunto de arquivos com várias partes como entrada (em vez de um único arquivo) conteúdo), e você deveria produzir um conjunto de saídas com várias partes (em vez de uma única saída), com um delineador meio razoável entre os arquivos, acho que deveria ser uma solução razoável. Se isso não funcionar para você, talvez eu precise de mais informações sobre a solução proposta para criar melhor uma regra.
Cort Ammon - Restabelece Monica
@TheNumberOne E obrigado pelo erro de digitação. Claramente, esse erro de digitação não era uma borboleta linda!
Cort Ammon - Restabelece Monica

Respostas:

63

Befunge-98, 602 bytes

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

Testado em PyFunge.

Quando executado com uma sequência que não começa com 2 espaços (probabilidade acima de 95% quando aleatória) não gera nada. Não é exatamente isso que o OP está procurando, mas se encaixa na especificação.

Quando transmitida, uma sequência iniciada com 2 espaços (como ela mesma) gera isso:

I am a caterpillar!

---

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

A parte inferior disso, por sua vez, produz:

I am a beautiful butterfly!
PurkkaKoodari
fonte
2
Uau. Isso é incrível.
a spaghetto
3
Eu sabia que alguém iria querer adotar as regras exatamente como você; Estou feliz que algo bonito tenha surgido =)
Cort Ammon - Restabelece Monica
Lagarta e borboleta parecem estar presas na Matrix. Lindo!
Erno
onde posso executar isso?
user1514631
3
Eu nunca vou entender como vocês, bons funcionários da Code Golf, conseguem criar monstruosidades tão bonitas.
22815 Chris Cirefice
19

PHP, 74 bytes

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=é equivalente <?php echoe pode levar vários valores separados por vírgula para a saída
  • ¶ßž’ßžße šžŠ‹–™Š“ߊ‹‹š™“†Þsão nomes constantes válidos no PHP, mas como as constantes não existem, são tratadas como cadeias literais. ~inverte-os em "I am a "e "beautiful butterfly!"(salvando um byte para uma aspas cada)
  • strtrsubstitui "lagarta!" com "uma linda borboleta!" no argumento
Fabian Schmengler
fonte
2
Gostaria de fornecer uma explicação?
Timwi
@ Timwi nenhum problema, explicação adicionada #
Fabian Schmengler
Eu esperava que alguém codificasse "linda borboleta" com algo como ROT13, mas a idéia de combiná-la com a técnica literal de string do PHP é, nas palavras de Kaylee, brilhante!
Cort Ammon - Restabelece Monica
7

Pitão, 50 46 bytes

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

Explicação

"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

O código fonte resultante é

"I am a beautiful butterfly!

O que basicamente imprime o texto.

PurkkaKoodari
fonte
6

Perl 6, 60 56 bytes

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

Requer -p para executar corretamente; Eu expliquei isso na contagem de bytes. Infelizmente, uma das desvantagens do Perl 6 é que a sintaxe é muito mais rigorosa agora ...

um spaghetto
fonte
Lagartas são vulneráveis ​​durante a metamorfose. É por isso que eles gostam de envolver-se em variáveis casulos: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Estou assumindo que Perl 6 permite barewords como Perl 5 com no strict 'subs'e s///variáveis interpola nas LHS.)
ThisSuitIsBlackNot
Isso é engraçado. Eu tentei isso e, por algum motivo, quando fiz o wc, me deu a mesma quantidade de bytes. Mas, ao digitar novamente, isso me deu menos bytes. Estranho.
a spaghetto
Oh, espere, deixa pra lá, lembro por que não fiz isso. Ao executar o novo código, ele gera um erro devido ao espaço entre bonito e borboleta.
a spaghetto
Ah, eu nunca usei Perl 6, então não posso ajudá-lo lá. Eu realmente só queria uma desculpa para fazer um comentário espirituoso. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/é mais curto e certamente funcionará no Perl 6.
ThisSuitIsBlackNot
1
@ThisSuitIsBlackNot Ele se encaixa no desafio. As regras estavam ali para garantir que você realmente leia e modifique seu código. No final, o verdadeiro espírito está tentando deixar a bela borboleta no coração do código se libertar. A beleza, é claro, está nos olhos de quem vê. Cada um de nós encontrará soluções diferentes, mais ou menos bonitas que outras. Quanto a soluções em PERL, bem ... vamos apenas dizer PERL tem sua própria definição peculiar de bonito, e ele se adapte às suas finalidades muito bem ;-)
Cort Ammon - Reintegrar Monica
4

Retina, 53 bytes

caterpillar
beautiful butterfly
^
I am a caterpillar!

Imprime:

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

Observe que não há separador entre I am a caterpillar! e o novo programa. O novo programa não espera entrada.

O número um
fonte
3

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

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

Espero que os 20% se apliquem a qualquer sequência iniciada com xyz, caso contrário, a contagem original é 224 212 210 bytes (corrigida a "I am Batman!"parte).

Transformação concluída: substitui a única ocorrência do literal !NFpor 10, para que também" butterfly" seja impressa usando oprintf .

Executa um simples cksumem uma parte (ou seja, o restante) do código-fonte, daí o seu requisito também.

Advertência: a primeira entrada deve terminar com '. Não é apenas uma advertência a ponto de suprimir a entrada errada ...

Nenhuma segunda entrada é esperada.

hjk
fonte
1
UAU. Eu estava esperando a pessoa estranha, e é isso. Isso é bem legal.
Jrg # 8/15
@jrg obrigado pelo incentivo. :)
hjk
1

Python - 184 bytes -20% para o bônus = 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";'''

Para imprimir I am batman, substitua as três primeiras aspas duplas por aspas simples na entrada (a primeira linha é '''""")

pppery
fonte