Tri-interquine - Ba chương trình xuất ra trong một vòng lặp


10

Liên quan: Interquine

Chương trình A xuất mã của chương trình B khi chạy và B xuất ra nguồn C và C xuất nguồn của A.

Lần này bạn không thể trao đổi hai ký tự và trao đổi lại :)

Yêu cầu:

  • Chỉ một ngôn ngữ trên tất cả các chương trình
  • Hạn chế sơ hở tiêu chuẩn áp dụng
  • Tất cả các chương trình đều khác nhau. Một chương trình đầu ra chính nó không đủ điều kiện. Hai đầu ra lẫn nhau cũng không đủ điều kiện.
  • Tất cả các chương trình không trống, hoặc dài ít nhất 1 byte.
  • Không có gì để đọc vì stdin được kết nối với /dev/null(Bạn có thể lạm dụng quy tắc này nếu có thể ). Đầu ra đi đến thiết bị xuất chuẩn.
  • Không sử dụng các chức năng tạo ra kết quả ngẫu nhiên.

Bổ sung:

  • Đưa ra lời giải thích nếu có thể

Điểm là độ dài của đoạn ngắn nhất (bạn có thể tạo chương trình dài từ chương trình ngắn không?). Vui lòng viết độ dài của tất cả các chương trình và đánh dấu số nhỏ nhất. Trailing newline không được tính. Điểm số thấp nhất chiến thắng .


2
Liên quan. (Điều tương tự, ngôn ngữ khác nhau.)
Martin Ender

Câu trả lời:


19

Python 3 , 50 byte

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

Hãy thử trực tuyến!

Biểu thức cuối cùng đi từ 1*2%7 để 2*2%7để 4*2%7sau đó trở lại 1*2%7.


6
Trông giống như một giải pháp phổ quát cho n-interquine. Bạn chỉ cần thay 7 bằng (2 ^ n) -1.
iBug

4
Trong Python 2, ánh xạ 1-2/_tạo thành một chu kỳ 3 (1,-1,3), giúp tiết kiệm một byte bằng cách không cần thoát %.
xnor

@iBug hoặc thậm chí ngắn hơn cho lớn n, s='s=%r;print(s%%(s,-~%i%%3))';print(s%(s,-~1%3))thay thế 3bằngn
PurkkaKoodari

4

RProgN 2 , 12 8 byte

1
«\2*7%

Giải thích

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.

Do tính chất thuận tiện của cách RProgN xuất ra mặc định, điều này để lại số, vòng lặp giữa 1, 2 và 4, trên dòng đầu tiên và phiên bản được xâu chuỗi của hàm trên giây. Lấy cảm hứng từ @LeakyNun 's Python trả lời

Hãy thử trực tuyến!


4

CJam , 17 byte

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

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

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

Hãy thử trực tuyến!

Có lẽ không tối ưu, nhưng đây là một sửa đổi về cách tiếp cận của tôi với thử thách trước đó .

Ý tưởng cơ bản là như nhau, nhưng chúng tôi thực hiện hai giao dịch hoán đổi, một trong số đó luôn luôn là không có. Các chỉ số bị ảnh hưởng là 2, 36:

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="_~"}_~

Hãy thử trực tuyến!

Các chương trình khác dài lần lượt là 26 và 38 byte.

Giải trình

Một cách tiếp cận khác!

{       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 và 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))

in

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

in

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

Điều này dựa trên câu trả lời của tôi cho câu hỏi Interquine, dựa trên câu hỏi Python bình thường. Và tôi biết chính xác phải làm gì khi chúng tôi nhận được một câu hỏi bốn câu hỏi;)


1

CJam , 14 byte

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

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

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

Hãy thử trực tuyến!

Giải trình

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>

Giải pháp thay thế bằng cách sử dụng Function.prototype.toString(cheaty, 30 byte)

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

1

Tính toán Lambda , 38 ký tự, 44 byte

Một giải pháp đơn giản dựa trên mẹ của tất cả các quines: y-combinator :

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

Sử dụng giảm beta, chúng tôi thấy rằng đây thực sự là một tri thức:

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

Chỉ int i=0;là sự khác biệt giữa các chức năng / đầu ra (nó là một trong hai 0, 1hoặc 2).

Giải trình:

Hãy thử trực tuyến.

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

Giải thích thêm:

-part:

  • String s chứa mã nguồn chưa được định dạng
  • %s được sử dụng để đặt Chuỗi này vào chính nó với s.format(...)
  • %c, %2$c34được sử dụng để định dạng dấu nháy kép ( ")
  • %%được sử dụng để định dạng ký hiệu modulo ( %)
  • s.format(s,...,34,s) đặt tất cả lại với nhau

Sự khác biệt của đầu ra / chức năng:

Cách tiếp cận giống như hầu hết các câu trả lời khác:

  • int ibắt đầu từ một trong hai 0, 1hoặc2
  • ++i%3biến đổi này để tiếp theo ( 0→1; 1→2; 2→0)

0

> <> , 15 byte

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

Hãy thử trực tuyến!

Sử dụng hình thức chung giống như các quines> <> khác, nhưng có thêm một ký tự phía trước được chuyển qua 1, 2 và 4.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.