Tri-interquine - Bir döngü içinde birbirini veren üç program


10

İlgili: Interquine

Program A, çalıştırıldığında programın B kodunu, B de C'nin kaynağını ve C, A'nın kaynağını çıkarır.

Bu sefer iki karakter ve tekrar takas yapamazsın :)

Gereksinimler:

  • Tüm programlarda yalnızca bir dil
  • Standart boşluklar kısıtlamaları geçerlidir
  • Tüm programlar farklıdır. Kendini çıktısı alan bir program geçerli değildir. Birbirini çıkaran iki kişi de hak kazanmaz.
  • Tüm programlar boş değil veya en az 1 bayt uzunluğunda.
  • Okunacak bir şey yok çünkü stdin bağlı /dev/null(Yapabiliyorsanız bu kuralı kötüye kullanabilirsiniz ). Çıktı stdout'a gider.
  • Rastgele sonuçlar üreten işlevleri kullanmayın.

Ek:

  • Mümkünse açıklama yapın

Puan en kısa sürenin uzunluğudur (kısa bir programdan uzun bir program oluşturabilir misiniz?). Lütfen tüm programların uzunluğunu yazın ve en küçük sayıyı vurgulayın. Sondaki satır sonu sayılmaz. En düşük puan kazanır .


2
İlişkili. (Aynı şey, farklı diller.)
Martin Ender

Yanıtlar:


19

Python 3 , 50 bayt

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

Çevrimiçi deneyin!

Geçen ifadesi gider 1*2%7etmek 2*2%7için 4*2%7daha sonra geri 1*2%7.


6
N-interquine için evrensel bir çözüm gibi görünüyor. Yalnızca 7 değerini (2 ^ n) -1 ile değiştirmeniz gerekir.
iBug

4
Python 2'de, eşleme , kaçması gerekmeden bir bayt tasarrufu sağlayan 1-2/_bir 3-döngüsü (1,-1,3)oluşturur %.
xnor

@iBug veya büyük için daha kısa n, s='s=%r;print(s%%(s,-~%i%%3))';print(s%(s,-~1%3))değiştirilmesi 3ilen
PurkkaKoodari

4

RProgN 2 , 12 8 bayt

1
«\2*7%

Açıklaması

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.

RProgN'nin varsayılan olarak nasıl çıktı verdiğinin uygun doğası nedeniyle, bu, ilk satırda 1, 2 ve 4 arasında dolaşan sayıyı ve ikinci satırda işlevin dizilmiş sürümünü bırakır. Esinlenen @LeakyNun 's Python Cevap

Çevrimiçi deneyin!


4

CJam , 17 bayt

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

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

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

Çevrimiçi deneyin!

Muhtemelen optimal değil, ama bu önceki meydan okumaya yaklaşımımın bir modifikasyonu .

Temel fikir aynıdır, ancak biri her zaman işlemeyen iki takas yaparız. Etkilenen indeksi olan 2, 3ve 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 bayt

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

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

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

Çevrimiçi deneyin!

Diğer programlar sırasıyla 26 ve 38 bayt uzunluğundadır.

açıklama

Yine başka bir yaklaşım!

{       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

Python 3, 127, 127 ve 127 bayt

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

baskılar

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

baskılar

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

Bu, normal bir Python sorgusuna dayanan Interquine sorusuna cevabımı temel alıyor. Ve dörtlü bir soru aldığımızda tam olarak ne yapacağımı biliyorum;)


1

CJam , 14 bayt

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

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

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

Çevrimiçi deneyin!

açıklama

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 bayt

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>

Kullanarak alternatif çözüm Function.prototype.toString(ucuz, 30 bayt)

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

1

Lambda Hesabı , 38 karakter, 44 bayt

Tüm tırnakların annesine dayanan basit bir çözüm: y-birleştirici :

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

Beta indirgeme yöntemlerini kullanarak bunun gerçekten bir üç interquine olduğunu görüyoruz:

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

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

Sadece int i=0;fonksiyonlar / çıkışlar arasındaki farktır (ya 0, 1ya da 2).

Açıklama:

Çevrimiçi deneyin.

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

Ek açıklama:

-part:

  • String s biçimlendirilmemiş kaynak kodunu içerir
  • %s bu String'i kendi içine koymak için kullanılır s.format(...)
  • %c, %2$cve 34çift ​​tırnak işaretlerini ( ") biçimlendirmek için kullanılır
  • %% modulo işaretini biçimlendirmek için kullanılır (% )
  • s.format(s,...,34,s) hepsini bir araya getirir

Çıkışların / fonksiyonların farkı:

Diğer cevapların çoğu ile aynı yaklaşım:

  • int iya başlar 0, 1ya da2
  • ++i%3Bu sonraki dönüştürür ( 0→1; 1→2; 2→0)

0

> <> , 15 bayt

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

Çevrimiçi deneyin!

Diğer> <> tırnaklarla aynı genel formu kullanır, ancak önünde 1, 2 ve 4 arasında değişen ekstra bir karakter vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.