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 butterfly
quando 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
fonte
Respostas:
Befunge-98, 602 bytes
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:
A parte inferior disso, por sua vez, produz:
fonte
PHP, 74 bytes
<?=
é equivalente<?php echo
e 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)strtr
substitui "lagarta!" com "uma linda borboleta!" no argumentofonte
Pitão,
5046 bytesExplicação
O código fonte resultante é
O que basicamente imprime o texto.
fonte
Perl 6,
6056 bytesRequer -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 ...
fonte
$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/
(Estou assumindo que Perl 6 permite barewords como Perl 5 comno strict 'subs'
es///
variáveis interpola nas LHS.)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/
é mais curto e certamente funcionará no Perl 6.Retina, 53 bytes
Imprime:
Observe que não há separador entre
I am a caterpillar!
e o novo programa. O novo programa não espera entrada.fonte
bash
/awk
/cksum
-179,2169,6168 bytesDemo:
Espero que os 20% se apliquem a qualquer sequência iniciada com
xyz
, caso contrário, a contagem original é224212210 bytes (corrigida a"I am Batman!"
parte).Transformação concluída: substitui a única ocorrência do literal
!NF
por10
, para que também" butterfly"
seja impressa usando oprintf
.Executa um simples
cksum
em uma parte (ou seja, o restante) do código-fonte, daí o seu requisito também.Advertência: a primeira entrada deve terminar comNão é apenas uma advertência a ponto de suprimir a entrada errada ...'
.Nenhuma segunda entrada é esperada.
fonte
Python - 184 bytes -20% para o bônus = 147,2
Para imprimir
I am batman
, substitua as três primeiras aspas duplas por aspas simples na entrada (a primeira linha é'''"""
)fonte