Tri-interquine - Tre programmi che si generano reciprocamente in un ciclo


10

Correlati: interquino

Il programma A emette il codice del programma B quando viene eseguito e B emette la sorgente C e C genera la sorgente A.

Questa volta non puoi scambiare due personaggi e scambiarti di nuovo :)

Requisiti:

  • Solo una lingua per tutti i programmi
  • Si applicano le restrizioni standard sulle lacune
  • Tutti i programmi sono diversi. Un programma che genera se stesso non si qualifica. Anche due che si generano a vicenda non si qualificano.
  • Tutti i programmi sono non vuoti o lunghi almeno 1 byte.
  • Non c'è nulla da leggere perché lo stdin è collegato /dev/null(puoi abusare di questa regola se puoi ). L'output va allo stdout.
  • Non utilizzare funzioni che generano risultati casuali.

Ulteriori:

  • Dare spiegazioni se possibile

Il punteggio è la lunghezza del più breve (puoi generare un programma lungo da uno corto?). Scrivi la lunghezza di tutti i programmi ed evidenzia il numero più piccolo. La nuova riga finale non conta. Il punteggio più basso vince .


2
Relazionato. (Stessa cosa, lingue diverse.)
Martin Ender il

Risposte:


19

Python 3 , 50 byte

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

Provalo online!

L'ultima espressione va da 1*2%7a 2*2%7a 4*2%7poi di nuovo a 1*2%7.


6
Sembra una soluzione universale per n-interquine. Devi solo sostituire 7 con (2 ^ n) -1.
iBug

4
In Python 2, la mappatura 1-2/_forma un 3 cicli con (1,-1,3), che salva un byte non necessitando di escape %.
xnor

@iBug o anche più corto per grandi n, s='s=%r;print(s%%(s,-~%i%%3))';print(s%(s,-~1%3))sostituendo 3conn
PurkkaKoodari il

4

RProgN 2 , 12 8 byte

1
«\2*7%

spiegato

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.

A causa della natura conveniente di come l'output di RProgN viene emesso per impostazione predefinita, questo lascia il numero, che scorre tra 1, 2 e 4, sulla prima riga e la versione stringata della funzione sulla seconda. Ispirato da @LeakyNun s' Python risposta

Provalo online!


4

CJam , 17 byte

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

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

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

Provalo online!

Probabilmente non ottimale, ma questa è una modifica del mio approccio alla sfida precedente .

L'idea di base è la stessa, ma eseguiamo due swap, uno dei quali è sempre no-op. Gli indici sono interessati 2, 3e 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\"_~"}_~

3

CJam , 14 byte

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

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

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

Provalo online!

Gli altri programmi sono lunghi 26 e 38 byte, rispettivamente.

Spiegazione

Ancora un altro approccio!

{       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.
}_~

2

Gelatina , 11 byte

“Ḥ%7Øv;”Ṙv1

Ciò ha generato lo stesso programma con 1 sostituito da 2 , che ha sostituito 2 da 4 , che genera il programma originale.

Provalo online!


2

Python 3, 127, 127 e 127 byte

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))

stampe

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))

stampe

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))

Questo si basa sulla mia risposta alla domanda Interquine, che si basa su un normale quine di Python. E so esattamente cosa fare quando riceviamo una domanda quad-interquine;)


1

CJam , 14 byte

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

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

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

Provalo online!

Spiegazione

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.
}_~

1

Javascript (ES6), 63 55 byte

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>

Soluzione alternativa usando Function.prototype.toString(cheaty, 30 byte)

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

1

Calcolo lambda , 38 caratteri, 44 byte

Una soluzione semplice basata sulla madre di tutti i quines: il combinatore y :

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

Usando le riduzioni beta vediamo che questo è davvero un tri-interquine:

(λ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.

0

Java 8, 118 byte

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);}

La int i=0;differenza è solo tra le funzioni / uscite (o 0, 1o 2).

Spiegazione:

Provalo online.

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

Spiegazione aggiuntiva:

parte:

  • String s contiene il codice sorgente non formattato
  • %s è usato per mettere questa stringa in sé con s.format(...)
  • %c, %2$cE 34vengono utilizzati per formattare le virgolette ( ")
  • %%è usato per formattare il modulo-sign ( %)
  • s.format(s,...,34,s) mette tutto insieme

Differenza di uscite / funzioni:

Stesso approccio della maggior parte delle altre risposte:

  • int iinizia a o 0, 1o2
  • ++i%3trasforma questa alla prossima ( 0→1; 1→2; 2→0)

0

> <> , 15 byte

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

Provalo online!

Utilizza la stessa forma generale delle altre> <> quine, ma ha un carattere in più di fronte che viene spostato tra 1, 2 e 4.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.