Python: eu gostaria de ser PHP [fechado]

8

Há uma história antiga sobre um pedreiro que nunca ficou satisfeito com o que ele era. Ele desejou poder se tornar o sol, e assim foi. Bloqueado pelas nuvens, ele queria ser - e se tornou - uma nuvem. Quando o vento soprou, ele desejou ser o vento. Parado pela montanha, ele desejava ser uma montanha, e assim se tornou uma. Logo, porém, ele estava sendo atacado por um pedreiro, e desejava ser um pedreiro.

Da mesma forma, sua tarefa é escrever um programa que nunca esteja satisfeito com o idioma em que está. Seu programa deve gerar um conjunto de substituições de regex para transformá-lo em um idioma diferente. E assim por diante.

Regras

  1. Escreva um programa no idioma de sua escolha.
  2. O programa deve gerar uma série de pelo menos dois segmentos. Um segmento é um monte de texto, separado por ponto e vírgula. No entanto, se um ponto-e-vírgula estiver contido em uma regex, de forma que sua divisão resultará em sintaxe inválida, ele não separará segmentos. Veja o exemplo.
  3. O primeiro segmento é um padrão de regex a ser encontrado e o segundo segmento é o padrão de substituição. O terceiro é outro padrão de "localização" e o quarto é um padrão de "substituição", e assim por diante.
  4. Aplique os padrões de regex ao programa. Substitua o padrão no primeiro segmento por um no segundo; substitua o terceiro padrão pelo quarto, e assim por diante.
  5. O resultado deve ser um programa em um idioma diferente, que siga as regras 2 a 4.
  6. Os idiomas usados ​​devem formar um ciclo infinito e repetitivo.
    • Por exemplo, Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
  7. Sua pontuação é o período do ciclo. Os laços são quebrados pelo menor tamanho inicial do código.
    • No exemplo acima, a pontuação é três.
  8. Em cada iteração do ciclo, nenhum idioma pode ser usado mais de uma vez.
  9. Para as regras 5 e 7, linguagens compatíveis (C e C ++) e versões diferentes da mesma linguagem (Python 2 e Python 3) são consideradas iguais.
  10. Os programas em si não precisam ser repetidos.
    • No exemplo acima, o primeiro e o quarto programas podem ser diferentes.
  11. Qualquer versão do regex é aceitável, mas o mesmo deve ser usado para todos os programas.
  12. A saída total de cada programa não pode exceder 100 caracteres.
  13. Cada saída deve conter instruções para realmente alterar o programa. Ou seja, dois programas consecutivos no ciclo não podem ser os mesmos.

Exemplo

Python -> Ruby -> Python -> ...

print "uts;Z;rint;uts;Z(?=;Z);rint"

Saídas:

uts;Z;rint;uts;Z(?=;Z);rint

Os segmentos são:

FIND     ;    REPLACE
uts      ;    Z
rint     ;    uts
Z(?=;Z   ;    rint   (breaking the first segment in two would result in invalid syntax)

A aplicação das substituições regex, em ordem, nos fornece:

print "Z;Z;rint;Z;Z(?=;Z);rint"      # replace each "uts" with "Z"
puts "Z;Z;uts;Z;Z(?=;Z);uts"         # replace each "rint" with "uts"
puts "rint;Z;uts;rint;Z(?=;Z);uts"   # replace each "Z" followed by ";Z" with "rint"

A execução da última linha nos dá as instruções para transformar isso de volta no código Python.

Ypnypn
fonte
Se você estiver usando o tamanho do código como desempatador, realmente precisamos do limite de 100 caracteres?
Martin Ender
@ MartinBüttner Sim; Por que não?
Ypnypn
Claro, mas é um personagem mais do que \;;)
Martin Ender
C ++ não é necessariamente compatível com C.
golfer9338
8
Eu acho que você provavelmente deseja exigir que todos os programas do ciclo sejam diferentes. Se estiver errado, declare-o - e reivindico prioridade na solução óbvia.
Peter Taylor

Respostas:

6

2 idiomas: Python, Ruby; 33 29 bytes

Aqui está outra maneira de fazer Python e Ruby, um pouco mais curta que a do desafio:

Python:   print'^;puts"^.*?\\42#\\73"#'
prints:   ^;puts"^.*?\42#\73"#

Ruby:     puts"^.*?\42#\73"#print'^;puts"^.*?\\42#\\73"#'
prints:   ^.*?"#;

Não deve ser muito difícil adicionar PHP à mistura.

Martin Ender
fonte
1

2 idiomas: Python 2 e Befunge-93, 77 bytes

Depois de ler atentamente as regras desta vez , tive uma resposta real. Não ganhará nenhum prêmio, mas o Befunge é muito divertido de se programar.

u=u">>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u"
print u

Este programa Python produz:

>>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u

O que gera essas substituições:

FIND         REPLACE
>>>>>:#,_@   Z
print        >>>>>:#,_@
Z(?=;Z)      print
<v           Y
u            <v
Y(?=;Y)      u

O que transforma o programa nesse programa Befunge:

<v=<v"print;Z;>>>>>:#,_@;print;Z(?=;Z);>>>>>:#,_@;u;Y;<v;u;Y(?=;Y);<v"
>>>>>:#,_@ <v

Talvez eu veja se consigo fazer uma linha. Francamente, estou um pouco surpreso com o fato de o Befunge trabalhar para esse tipo de problema.

(Desculpe por excluir e desfazer a exclusão de muitos; fiquei em pânico por um segundo porque achei que o programa talvez não tivesse funcionado.)

Kasran
fonte