Tri-interquine - สามโปรแกรมที่แสดงผลเป็นวง


10

ที่เกี่ยวข้อง: Interquine

โปรแกรม A เอาท์พุทโค้ดของโปรแกรม B เมื่อทำงานและ B เอาต์พุตแหล่งที่มาของ C และ C ที่เอาต์พุตของแหล่ง A

เวลานี้คุณไม่สามารถแลกเปลี่ยนตัวละครสองตัวและแลกเปลี่ยนอีกครั้ง :)

ที่ต้องการ:

  • เพียงหนึ่งภาษาในทุกโปรแกรม
  • มีข้อ จำกัด ช่องโหว่มาตรฐาน
  • โปรแกรมทั้งหมดนั้นแตกต่างกัน โปรแกรมหนึ่งที่ออกเองไม่มีสิทธิ์ได้รับ เอาต์พุตสองตัวที่กันและกันไม่มีคุณสมบัติเช่นกัน
  • โปรแกรมทั้งหมดไม่ว่างเปล่าหรือมีความยาวอย่างน้อย 1 ไบต์
  • ไม่มีอะไรให้อ่านเพราะ stdin เชื่อมต่อกับ/dev/null(คุณสามารถละเมิดกฎนี้ได้ถ้าทำได้ ) เอาต์พุตไปที่ stdout
  • อย่าใช้ฟังก์ชันที่สร้างผลลัพธ์แบบสุ่ม

เพิ่มเติม:

  • ให้คำอธิบายถ้าเป็นไปได้

คะแนนคือความยาวของโปรแกรมที่สั้นที่สุด (คุณสามารถสร้างโปรแกรมที่มีความยาวได้จากโปรแกรมสั้น ๆ ) กรุณาเขียนความยาวของโปรแกรมทั้งหมดและเน้นจำนวนที่น้อยที่สุด การขึ้นบรรทัดใหม่จะไม่นับรวม ต่ำสุดชนะคะแนน


2
ที่เกี่ยวข้อง (สิ่งเดียวกันภาษาต่าง ๆ )
Martin Ender

คำตอบ:


19

Python 3 , 50 ไบต์

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

ลองออนไลน์!

การแสดงออกที่ผ่านไปจาก1*2%7การ2*2%7ไปแล้วกลับไป4*2%71*2%7


6
ดูเหมือนว่าคำตอบทั่วไปของ n-interquine คุณจะต้องแทนที่ 7 ด้วย (2 ^ n) -1
iBug

4
ในหลาม 2, การทำแผนที่1-2/_ในรูปแบบ 3 รอบด้วยซึ่งจะช่วยประหยัดไบต์โดยไม่ต้องหลบหนีสำหรับ(1,-1,3) %
xnor

@iBug หรือแม้กระทั่งสั้นขนาดใหญ่n, s='s=%r;print(s%%(s,-~%i%%3))';print(s%(s,-~1%3))การแทนที่3ด้วยn
PurkkaKoodari

4

RProgN 2 , 12 8 ไบต์

1
«\2*7%

อธิบาย

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 สิ่งนี้จะทิ้งตัวเลขซึ่งจะวนระหว่าง 1, 2 และ 4 ในบรรทัดแรกและรุ่นที่เป็นสตริงของฟังก์ชันในวินาที แรงบันดาลใจจากคำตอบ Pythonของ@LeakyNun

ลองออนไลน์!


4

CJam , 17 ไบต์

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

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

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

ลองออนไลน์!

อาจจะไม่ดีที่สุด แต่นี้คือการเปลี่ยนแปลงของวิธีการของฉันกับความท้าทายก่อนหน้านี้

แนวคิดพื้นฐานเหมือนกัน แต่เราดำเนินการสลับสองครั้งหนึ่งในนั้นก็คือไม่มีการเลือก ดัชนีได้รับผลกระทบ2, 3และ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 ไบต์

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

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

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

ลองออนไลน์!

โปรแกรมอื่น ๆ มีความยาว 26 และ 38 ไบต์ตามลำดับ

คำอธิบาย

อีกวิธีหนึ่ง!

{       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 และ 127 ไบต์

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

พิมพ์

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

พิมพ์

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

นี่ขึ้นอยู่กับคำตอบของฉันสำหรับคำถาม Interquine ซึ่งเป็นไปตาม Python Quine ปกติ และฉันรู้อย่างแน่นอนว่าต้องทำอย่างไรเมื่อเราได้รับคำถามแบบควอด - อินควิก;)


1

CJam , 14 ไบต์

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

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

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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>

โซลูชันทางเลือกโดยใช้Function.prototype.toString(cheaty, 30 bytes)

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

1

แลมบ์ดาแคลคูลัส , 38 ตัวอักษร, 44 ไบต์

วิธีการแก้ปัญหาที่ง่ายขึ้นอยู่กับแม่ของ quines ทั้งหมด: y-combinator :

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

การใช้การลดเบต้าเราเห็นว่านี่เป็น 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 ไบต์

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

เพียง แต่int i=0;เป็นความแตกต่างระหว่างการทำงาน / เอาท์พุท (มันอย่างใดอย่างหนึ่ง0, 1หรือ2)

คำอธิบาย:

ลองออนไลน์

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

คำอธิบายเพิ่มเติม:

:

  • String s มีซอร์สโค้ดที่ยังไม่ฟอร์แมต
  • %s จะใช้ในการใส่สายนี้เป็นของตัวเองด้วย s.format(...)
  • %c, %2$cและ34จะใช้ในการจัดรูปแบบราคาสองครั้ง ( ")
  • %%ใช้ในการจัดรูปแบบ modulo-sign ( %)
  • s.format(s,...,34,s) ทำให้มันเข้าด้วยกัน

ความแตกต่างของผลลัพธ์ / ฟังก์ชั่น:

วิธีการเช่นเดียวกับคำตอบอื่น ๆ ส่วนใหญ่:

  • int iเริ่มต้นที่ทั้งสอง0, 1หรือ2
  • ++i%3แปลงนี้ไปถัดไป ( 0→1; 1→2; 2→0)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.