Tri-interquine - Tiga program yang saling output dalam satu lingkaran

10

Terkait: Interquine

Program A mengeluarkan kode program B saat dijalankan, dan B mengeluarkan sumber C, dan C menghasilkan sumber A.

Kali ini Anda tidak dapat bertukar dua karakter dan bertukar lagi :)

Persyaratan:

  • Hanya satu bahasa di semua program
  • Batasan celah standar berlaku
  • Semua program berbeda. Satu program yang menghasilkan sendiri tidak memenuhi syarat. Dua yang saling output tidak memenuhi syarat juga.
  • Semua program tidak kosong, atau paling tidak panjangnya 1 byte.
  • Tidak ada yang dapat dibaca karena stdin terhubung /dev/null(Anda dapat menyalahgunakan aturan ini jika Anda bisa ). Output menuju ke stdout.
  • Jangan gunakan fungsi yang menghasilkan hasil acak.

Tambahan:

  • Berikan penjelasan jika memungkinkan

Skor adalah panjang dari yang terpendek (dapatkah Anda membuat program panjang dari yang pendek?). Harap tulis panjang semua program dan sorot jumlah terkecil. Mengejar baris baru tidak masuk hitungan. Skor terendah menang .

iBug
sumber
2
Terkait (Hal yang sama, bahasa yang berbeda.)
Martin Ender

Jawaban:

19

Python 3 , 50 byte

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

Cobalah online!

Ekspresi terakhir pergi dari 1*2%7ke 2*2%7ke 4*2%7kemudian kembali ke 1*2%7.

Biarawati Bocor
sumber
6
Tampak seperti solusi universal untuk n-interquine. Anda hanya perlu mengganti 7 dengan (2 ^ n) -1.
iBug
4
Dalam Python 2, pemetaan 1-2/_membentuk 3 siklus dengan (1,-1,3), yang menyimpan byte dengan tidak perlu melarikan diri %.
xnor
@ iBug atau bahkan lebih pendek untuk ukuran besar n, s='s=%r;print(s%%(s,-~%i%%3))';print(s%(s,-~1%3))ganti 3dengann
PurkkaKoodari
4

RProgN 2 , 12 8 byte

1
«\2*7%

Dijelaskan

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.

Karena sifat nyaman dari bagaimana output RProgN secara default, ini meninggalkan angka, yang loop antara 1, 2, dan 4, pada baris pertama, dan versi fungsi yang diketikkan pada baris kedua. Terinspirasi oleh @LeakyNun 's Python Jawaban

Cobalah online!

ATaco
sumber
4

CJam , 17 byte

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

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

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

Cobalah online!

Mungkin tidak optimal, tetapi ini adalah modifikasi dari pendekatan saya terhadap tantangan sebelumnya .

Ide dasarnya adalah sama, tetapi kami melakukan dua swap, salah satunya selalu no-op. Indeks yang terpengaruh adalah 2, 3dan 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
sumber
3

CJam , 14 byte

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

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

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

Cobalah online!

Program-program lain masing-masing sepanjang 26 dan 38 byte.

Penjelasan

Namun pendekatan lain!

{       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
sumber
2

Jelly , 11 byte

“Ḥ%7Øv;”Ṙv1

Ini menghasilkan program yang sama dengan 1 diganti dengan 2 , yang diganti 2 dengan 4 , yang menghasilkan program asli.

Cobalah online!

Dennis
sumber
2

Python 3, 127, 127 dan 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))

cetakan

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

cetakan

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

Ini didasarkan pada jawaban saya untuk pertanyaan Interquine, yang didasarkan pada quine Python normal. Dan saya tahu persis apa yang harus dilakukan ketika kami mendapatkan pertanyaan quad-interquine;)

aaay aaay
sumber
1

CJam , 14 byte

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

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

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

Cobalah online!

Penjelasan

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

Solusi alternatif menggunakan Function.prototype.toString(cheaty, 30 byte)

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

Lambda Calculus , 38 karakter, 44 byte

Solusi sederhana berdasarkan ibu dari semua quines: y-combinator :

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

Menggunakan reduksi beta kita melihat bahwa ini memang tri-interkuin:

(λ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
sumber
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);}

Hanya int i=0;perbedaan antara fungsi / output (baik itu 0, 1atau2 ).

Penjelasan:

Cobalah 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

Penjelasan tambahan:

:

  • String s berisi kode sumber yang tidak diformat
  • %s digunakan untuk menempatkan String ini ke dalam dirinya dengan s.format(...)
  • %c, %2$cdan 34digunakan untuk memformat tanda kutip ganda ( ")
  • %%digunakan untuk memformat tanda-modulo ( %)
  • s.format(s,...,34,s) menempatkan semuanya bersama-sama

Perbedaan output / fungsi:

Pendekatan yang sama seperti kebanyakan jawaban lainnya:

  • int imulai dari 0, 1atau2
  • ++i%3mengubah ini ke depan ( 0→1; 1→2; 2→0)
Kevin Cruijssen
sumber
0

> <> , 15 byte

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

Cobalah online!

Menggunakan bentuk umum yang sama dengan quine>> lain, tetapi memiliki karakter tambahan di depan yang digilir melalui 1, 2 dan 4.

Jo King
sumber