Python: Ojalá fuera PHP [cerrado]

8

Hay una vieja historia sobre un picapedrero que nunca estuvo satisfecho con lo que era. Deseó poder convertirse en el sol, y así fue. Bloqueado por las nubes, deseaba ser, y se convirtió, en una nube. Cuando soplaba el viento, deseaba ser el viento. Detenido por la montaña, deseaba ser una montaña, y así se convirtió en uno. Pronto, sin embargo, estaba siendo pirateado por un cantero y deseaba ser un cantero.

De manera similar, su tarea es escribir un programa que nunca esté satisfecho con el idioma en el que se encuentra. Su programa debe generar un conjunto de reemplazos de expresiones regulares para convertirlo en un idioma diferente. Y así.

Reglas

  1. Escriba un programa en el idioma que elija.
  2. El programa debería generar una serie de al menos dos segmentos. Un segmento es un montón de texto, separado por punto y coma. Sin embargo, si un punto y coma está contenido dentro de una expresión regular, de modo que dividirlo allí dará como resultado una sintaxis no válida, no separa los segmentos. Mira el ejemplo.
  3. El primer segmento es un patrón de expresiones regulares para encontrar, y el segundo segmento es el patrón de reemplazo. El tercero es otro patrón de "búsqueda", y el cuarto es un patrón de "reemplazo", y así sucesivamente.
  4. Aplicar los patrones de expresiones regulares al programa. Reemplace el patrón en el primer segmento con uno en el segundo; reemplace el tercer patrón con el del cuarto, y así sucesivamente.
  5. El resultado debería ser un programa en un idioma diferente, que, en sí mismo, siga las reglas 2 a 4.
  6. Los idiomas utilizados deben formar un ciclo infinito y repetitivo.
    • Por ejemplo, Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
  7. Tu puntaje es el período del ciclo. Los lazos se rompen por la longitud de código inicial más corta.
    • En el ejemplo anterior, la puntuación es tres.
  8. En cada iteración del ciclo, no se puede usar ningún idioma más de una vez.
  9. Para las reglas 5 y 7, los lenguajes compatibles (C y C ++) y las diferentes versiones del mismo lenguaje (Python 2 y Python 3) se consideran iguales.
  10. Los programas en sí mismos no necesitan repetirse.
    • En el ejemplo anterior, el primer y el cuarto programa pueden ser diferentes.
  11. Cualquier versión de regex es aceptable, pero se debe usar la misma para todos los programas.
  12. La salida total para cada programa no puede exceder los 100 caracteres.
  13. Cada salida debe contener instrucciones para cambiar realmente el programa. Es decir, no hay dos programas consecutivos en el ciclo que puedan ser iguales.

Ejemplo

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

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

Salidas:

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

Los segmentos son:

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

La aplicación de los reemplazos de expresiones regulares, en orden, nos da:

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"

Ejecutar la última línea nos da las instrucciones para volver a convertir esto en código Python.

Ypnypn
fuente
Si está utilizando el tamaño del código como desempate, ¿realmente necesitamos el límite de 100 caracteres?
Martin Ender
@ MartinBüttner Sí; ¿Por qué no?
Ypnypn
Claro, pero es un personaje más largo que \;;)
Martin Ender
C ++ no es necesariamente compatible con C.
golfer9338
8
Creo que probablemente desee exigir que todos los programas en el ciclo sean diferentes. Si me equivoco, dígalo, y reclamo prioridad sobre la solución obvia.
Peter Taylor

Respuestas:

6

2 idiomas: Python, Ruby; 33 29 bytes

Aquí hay otra forma de hacer Python y Ruby, que es un poco más corta que la del desafío:

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

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

No debería ser demasiado difícil agregar PHP a la mezcla.

Martin Ender
fuente
1

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

Después de leer cuidadosamente las reglas esta vez , se me ocurrió una respuesta real. No ganará ningún premio, pero Befunge es demasiado divertido para programarlo.

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

Este programa de Python genera:

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

Lo que produce estos reemplazos:

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

Lo que convierte el programa en este programa Befunge:

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

Tal vez veré si puedo hacerlo una línea. Francamente, estoy un poco sorprendido de que Befunge trabaje para este tipo de problema.

(Perdón por eliminar y recuperar un montón; estuve en pánico por un segundo porque pensé que el programa podría no haber funcionado).

Kasran
fuente