Tri-interquine: tres programas que se generan entre sí en un bucle

10

Relacionado: Interquine

El programa A emite el código del programa B cuando se ejecuta, y B emite la fuente de C y C emite la fuente de A.

Esta vez no puedes intercambiar dos personajes e intercambiar de nuevo :)

Requisitos:

  • Solo un idioma en todos los programas.
  • Se aplican restricciones de lagunas estándar
  • Todos los programas son diferentes. Un programa que se genera solo no califica. Dos que se producen entre sí tampoco califican.
  • Todos los programas no están vacíos o tienen al menos 1 byte de longitud.
  • No hay nada que leer porque stdin está conectado /dev/null(puede abusar de esta regla si puede ). La salida va a stdout.
  • No use funciones que generen resultados aleatorios.

Adicional:

  • Dar explicaciones si es posible

El puntaje es la longitud del más corto (¿puede generar un programa largo a partir de uno corto?). Escriba la duración de todos los programas y resalte el número más pequeño. La nueva línea final no cuenta. La puntuación más baja gana .

iBug
fuente
2
Relacionado. (Lo mismo, diferentes idiomas.)
Martin Ender

Respuestas:

19

Python 3 , 50 bytes

s='s=%r;print(s%%(s,%i*2%%7))';print(s%(s,1*2%7))

Pruébalo en línea!

La última expresión va de 1*2%7a 2*2%7a 4*2%7luego de vuelta a 1*2%7.

Monja permeable
fuente
66
Parece una solución universal para n-interquine. Solo necesita reemplazar 7 con (2 ^ n) -1.
iBug
44
En Python 2, el mapeo 1-2/_forma un ciclo de 3 con (1,-1,3), que ahorra un byte al no necesitar escapar %.
xnor
@iBug o incluso más corto para grande n, s='s=%r;print(s%%(s,-~%i%%3))';print(s%(s,-~1%3))reemplazando 3conn
PurkkaKoodari
4

RProgN 2 , 12 8 bytes

1
«\2*7%

Explicado

1   # Push the digit to the stack.

«\2*7%
«       # Define a function from here to the matching ». As there is no matching », define it from here to the end of the program, and continue running.
 \      # Flip the function under the constant number.
  2*    # Multiply by 2.
    7%  # Modulo 7.

Debido a la naturaleza conveniente de cómo RProgN genera de manera predeterminada, esto deja el número, que recorre entre 1, 2 y 4, en la primera línea, y la versión en cadena de la función en la segunda. Inspirado por la respuesta de Python de @LeakyNun

Pruébalo en línea!

Un taco
fuente
4

CJam , 17 bytes

{sZZe\6Ye\"_~"}_~

{s6Ze\ZYe\"_~"}_~

{sZ6e\ZYe\"_~"}_~

Pruébalo en línea!

Probablemente no sea óptimo, pero esta es una modificación de mi enfoque del desafío anterior .

La idea básica es la misma, pero realizamos dos intercambios, uno de los cuales siempre es no operativo. Los índices son afectados 2, 3y 6:

1:     {sZZe\6Ye\"_~"}_~
ZZe\             does nothing
       {sZZe\6Ye\"_~"}_~
6Ye\     \   /
          \ /
           X
          / \
         /   \
2:     {s6Ze\ZYe\"_~"}_~
6Ze\      \  /
           \/    doesn't really do anything
           /\
          /  \
       {s6Ze\ZYe\"_~"}_~
ZYe\     \/
         /\
3:     {sZ6e\ZYe\"_~"}_~
Z6e\      \  /
           \/
           /\
          /  \
       {sZZe\6Ye\"_~"}_~
ZYe\     \/      doesn't really do anything 
         /\
1:     {sZZe\6Ye\"_~"}_~
Martin Ender
fuente
3

CJam , 14 bytes

{_]3/W="_~"}_~

{_]3/W="_~"}{_]3/W="_~"}_~

{_]3/W="_~"}{_]3/W="_~"}{_]3/W="_~"}_~

Pruébalo en línea!

Los otros programas tienen 26 y 38 bytes de longitud, respectivamente.

Explicación

¡Otro enfoque más!

{       e# Again, the usual quine framework. In this case, there might
        e# be one or two additional copies of the block on the stack.
  _     e#   Duplicate the top copy of the block.
  ]     e#   Wrap all copies in an array.
  3/    e#   Split into chunks of 3. For the first two programs, this will
        e#   just wrap all of them in an array. For the third program, this
        e#   splits the fourth copy off from the first three.
  W=    e#   Select the last chunk. So `3/W=` does nothing for the first
        e#   two programs, but discards three copies once we get to four.
  "_~"  e#   Push the remainder of the program.
}_~
Martin Ender
fuente
2

Jalea , 11 bytes

“Ḥ%7Øv;”Ṙv1

Esto generó el mismo programa con 1 reemplazado por 2 , que reemplazó 2 por 4 , lo que genera el programa original.

Pruébalo en línea!

Dennis
fuente
2

Python 3, 127, 127 y 127 bytes

a='a=%r;b=%r;c=%r;print(b%%(b,a,c))';b='b=%r;a=%r;c=%r;print(c%%(c,a,b))';c='c=%r;a=%r;b=%r;print(a%%(a,b,c))';print(b%(b,a,c))

huellas dactilares

b='b=%r;a=%r;c=%r;print(c%%(c,a,b))';a='a=%r;b=%r;c=%r;print(b%%(b,a,c))';c='c=%r;a=%r;b=%r;print(a%%(a,b,c))';print(c%(c,a,b))

huellas dactilares

c='c=%r;a=%r;b=%r;print(a%%(a,b,c))';a='a=%r;b=%r;c=%r;print(b%%(b,a,c))';b='b=%r;a=%r;c=%r;print(c%%(c,a,b))';print(a%(a,b,c))

Esto se basa en mi respuesta a la pregunta de Interquine, que se basa en una quine de Python normal. Y sé exactamente qué hacer cuando recibimos una pregunta de quad-interquine;)

aaay aaay
fuente
1

CJam , 14 bytes

0{\)3%\"_~"}_~

1{\)3%\"_~"}_~

2{\)3%\"_~"}_~

Pruébalo en línea!

Explicación

0{      e# Again, the standard CJam quine framework, but this time we have a zero
        e# at the bottom of the stack.
  \     e#   Bring the 0 to the top.
  )     e#   Increment.
  3%    e#   Mod 3 to loop from 2 back to 0.
  \     e#   Put the result underneath the block again.
  "_~"  e#   Push the remainder of the source.
}_~
Martin Ender
fuente
1

Javascript (ES6), 63 55 bytes

eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=0)
eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=1)
eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=2)

o1.innerText = eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=0) 
o2.innerText = eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=1)
o3.innerText = eval(c="`eval(c=${JSON.stringify(c)},n=${++n%3})`",n=2)
<pre id="o1"></pre>
<pre id="o2"></pre>
<pre id="o3"></pre>

Solución alternativa usando Function.prototype.toString(cheaty, 30 bytes)

(f=n=>`(f=${f})(${++n%3})`)(1)
Herman L
fuente
1

Cálculo Lambda , 38 caracteres, 44 bytes

Una solución simple basada en la madre de todas las quines: el combinador y :

(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)

Usando reducciones beta vemos que esto es realmente una tri-interquina:

(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
(λy.y)(λz.z)(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
(λz.z)(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
(λx.(λy.y)(λz.z)xx)(λx.(λy.y)(λz.z)xx)
etc.
Def
fuente
0

Java 8, 118 bytes

v->{int i=0;String s="v->{int i=%d;String s=%c%s%2$c;return s.format(s,++i%%3,34,s);}";return s.format(s,++i%3,34,s);}

Sólo int i=0;es la diferencia entre las funciones / salidas (es cualquiera 0, 1o 2).

Explicación:

Pruébalo en línea.

v->{                       // Method with empty unused parameter and String return-type
  int i=0;                 //  Integer, starting at 0, 1 or 2 depending on the version
                           //  (this is the only variation between the functions/outputs)
  String s="v->{int i=%d;String s=%c%s%2$c;return s.format(s,++i%%3,34,s);}";
                           //  String containing the unformatted source code
  return s.format(s,++i%3,s);}
                           //  Quine to get the source code, which we return as result
                           //  ++i%3 is used to cycle 0→1→2→0

Explicación adicional:

-parte:

  • String s contiene el código fuente sin formato
  • %s se usa para poner esta cadena en sí misma con s.format(...)
  • %c, %2$cy 34se utilizan para formatear las comillas dobles ( ")
  • %%se usa para formatear el módulo-signo ( %)
  • s.format(s,...,34,s) lo pone todo junto

Diferencia de las salidas / funciones:

El mismo enfoque que la mayoría de las otras respuestas:

  • int icomienza a cualquiera 0, 1o2
  • ++i%3transforma esta a la siguiente ( 0→1; 1→2; 2→0)
Kevin Cruijssen
fuente
0

> <> , 15 bytes

1'~r2*7%nd3*>o<

Pruébalo en línea!

Utiliza la misma forma general que otras> <> quines, pero tiene un carácter adicional al frente que se cicla a través de 1, 2 y 4.

Jo King
fuente