Como sabemos, un quine es un programa que genera su propio código fuente. Sin embargo, también es posible escribir un programa que genere otro programa diferente que emita el primer programa nuevamente. Por ejemplo, el programa Python 2
x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3
Cuando se ejecute, mostrará el siguiente texto:
print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""
Cuando se ejecuta como un programa Python, esto generará el código original nuevamente. Esto se llama una quine iterativa . Como debe ejecutarlo dos veces para recuperar el código original, decimos que tiene el período 2 . Pero, por supuesto, son posibles períodos mucho más altos.
Su desafío es escribir un quine iterativo con el mayor tiempo posible, en 100 bytes o menos , en el idioma que elija. (Tenga en cuenta que mi ejemplo anterior no se ajusta a esta especificación, ya que son 119 bytes, incluida la nueva línea final).
Tenga en cuenta las siguientes reglas y aclaraciones:
- Se aplican las reglas habituales de quine, es decir, su programa no puede usar funciones de lenguaje que le permitan acceder directamente a su propio código fuente.
- Las salidas iteradas finalmente tienen que volver a su código original, y debe incluir una demostración o prueba de que lo hará.
- También debe incluir una explicación de por qué el ciclo es tan largo como usted lo dice. Esto no tiene que estar al nivel de una prueba matemática, pero debería ser convincente para alguien familiarizado con su idioma. (Esta regla está aquí porque espero que algunas de las respuestas involucren números muy, muy grandes).
- Está bien decir algo así como "al menos 1,000,000 de iteraciones" en lugar de dar el número exacto, siempre y cuando pueda probar que es al menos ese tiempo. En este caso, su puntaje sería de 1,000,000. De lo contrario, su puntaje es el período de su quine.
- El límite de 100 bytes solo se aplica a su programa inicial: los programas que genera pueden ser más largos, aunque, por supuesto, eventualmente tendrán que volver a bajar a 100 bytes para generar su código original.
- Puede suponer que su máquina tiene RAM infinita y tiempo de ejecución infinito, pero no puede asumir tipos de datos de precisión ilimitados (como enteros) si su idioma no los tiene. Usted puede asumir que no hay límite a la longitud de la entrada de su analizador puede manejar.
- El puntaje más alto gana.
Tenga en cuenta: hay un desafío existente llamado Quit Whining; Comience Quining que también implica iterar quines. Sin embargo, aparte de basarse en el mismo concepto, estos son tipos de desafíos completamente diferentes. El otro es el golf de código directo, mientras que este es (¡intencionalmente!) Realmente un problema de castor ocupado disfrazado. Es probable que las técnicas necesarias para producir una buena respuesta a esta pregunta sean muy diferentes de las que se necesitan para responder a la otra pregunta, y esto es muy similar al diseño.
fuente
Respuestas:
PHP, período 2,100,000,000
¿Quién hubiera pensado que esto es posible en PHP? :-)
Esta es realmente mi primera quine y tiene 99 bytes de longitud
Aunque PHP admite números más grandes que
2 * 10^8
al cambiar deinteger
adouble
, el incremento ya no funciona (conduce a un bucle infinito) y no he encontrado otra solución que se ajuste a los 100 bytes. Todavía.La prueba es bastante simple, ya que solo cuenta en cada iteración hasta que alcanza el punto de reinicio en 2,1 mil millones.
Créditos para Dave , que publicó el enfoque en pseudocódigo en los comentarios y para Bob Twells , de quien copié el código por una cantidad mínima de PHP.
Programa de prueba (sloooooow):
Bueno, al menos soy el primero en responder.
fuente
Mathematica, período
E8.5678 # 3E2.1923 # 4~ E6.2695 # 3 # 2Tenga en cuenta que las puntuaciones se describen en notación Hyper-E . Las iteraciones reemplazan el final
Nest[#!,9,9^9^99!]
con las expansiones decimales deNest[#!,9,9^9^99!]
- 1,Nest[#!,9,9^9^99!]
- 2,Nest[#!,9,9^9^99!]
- 3, ..., 3, 2, 1 y de regreso aNest[#!,9,9^9^99!]
.fuente
ToString[#0, InputForm]
{"_~"}_~
, así que supongo que debería ser válida ...R, período aleatorio con expectativa 2 ^ 19936-0.5
El generador de números aleatorios predeterminado de R tiene un período de 2 ^ 19937-1 y equidistribución en 623 dimensiones consecutivas. Por lo tanto, en algún lugar (pero solo una vez) en su período habrá un vector de ceros de 623 de largo. Cuando lleguemos allí (y estemos alineados con el inicio de la secuencia) la suma de los siguientes 623 números aleatorios de U [0,1] será cero y volveremos a nuestro programa original.
Tenga en cuenta que el programa con muy alta probabilidad pasará por el mismo estado distinto de cero varias veces antes de volver a cero. Por ejemplo, la suma 311.5 es la más probable, y hay muchas maneras en que puede suceder, pero el RNG permite que el período de 0 sea más largo que el período de 311.5.
fuente
JavaScript, período 9,007,199,254,700,000
No voy a ganar, pero fue divertido trabajar con JavaScript en este desafío:
Sigue el siguiente ciclo:
Nota: Puede hacerlo 18 bytes más corto, mientras solo elimina solo ~ 0.08% de la puntuación, así:
fuente
C, período 2,100,000,000
Basado en la respuesta PHP (obviamente). Se actualizará con una explicación cuando tenga tiempo.
fuente
C (gcc) , 66 bytes, período 2 ^ 64
Pruébalo en línea!
2 ^ 64 números están disponibles en un
unsigned long
entero. Por lo tanto, un período de 2 ^ 64.fuente
Python 2
Pruébalo en línea!
En el código, los
b=0
cambios ab=1
continuación,b=2
etc., hasta que llegue,b=decimal expansion of the period
se restablecen ab=0
fuente
9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9**9
es mucho mayor que9**9**99**99**99**99**99**99**99**99**99**99**99**99
. Dicho esto, podrías hacer algo asíeval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9)))
por MUCHO más números altos.Gol> <> , 70 bytes, periodo 325883196621297064957600206175719056476804879488288708188003274919860959534770101079512433396348062803055739640225395758790852315876868469390603793729639715908136196505908165227136154287969475839017544811926036808089596209081885772040898530121921794489026069641113281250
Otro sabio conocido como realmente grande (3.25E270)
Esta es en realidad una versión alterada de la respuesta que puse en el iterador de 500 bytes
Espero haber acertado, y no hay errores. No hay una forma real de realmente calcular este valor, es teórica. Pero hombre, ese es un gran número !!!
Pruébalo en línea!
fuente