Quine / Quine ย้อนกลับ


26

เขียนโปรแกรมที่สมบูรณ์ซึ่งรับอินพุตจำนวนเต็มบูลีนหรือไม่เป็นลบ มันจะต้อง:

  • ส่งออกซอร์สโค้ดของตัวเองหากค่าอินพุตเป็นเท็จ
  • เอาท์พุทซอร์สโค้ดของตัวเองในสิ่งที่ตรงกันข้ามถ้าค่าอินพุตเป็นความจริง

โปรแกรมของคุณไม่สามารถเป็น palindromic และไม่สามารถอ่านซอร์สโค้ดของตัวเองด้วยวิธีการใด ๆ

นี่คือรหัสกอล์ฟ - รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


6
ดังนั้น ... ถ้าภาษาของฉันไม่มีบูลีน แต่ 0 เป็นเท็จและจำนวนเต็มบวกเป็นจริง ฉันสามารถสันนิษฐานได้ว่าการป้อนข้อมูลจะเป็นเพียง 0 หรือ 1 (ในฐานะสแตนอินสำหรับบูลีน - ในความเป็นจริงแล้วภาษาจะให้ผลลัพธ์หนึ่งในสองสิ่งนั้นตามผลของตัวดำเนินการตามเงื่อนไข) หรือไม่ หรือฉันต้องสนับสนุนจำนวนเต็มใด ๆ เนื่องจากฉันไม่สามารถใช้บูลีน "จริง"
Martin Ender

คำตอบ:


9

Gol> <> , 9 ไบต์

'rd3*I?rH

ฉันรู้สึกอึดอัดใจเล็กน้อยที่โพสต์สิ่งนี้เนื่องจากเรามีคำตอบ> <>, Vitsy และ Minkolang แล้ว การเพิ่มเติมไปยัง quine มาตรฐานคือI(อ่านอินพุตจำนวนเต็ม), ?(ดำเนินการต่อไปหากความจริง) และr(reverse stack)

ลองมันออนไลน์


เข้าร่วมคลับ! : D คุณจะชนะอย่างไรก็ตาม +1
Addison Crump

1
8 bytes:sP#Hr?I"
Jo King

18

CJam, 17 16 ไบต์

{`"_~"+Wq~g#%}_~

ทดสอบที่นี่

การแก้ไข quine มาตรฐานตรงไปตรงมา โซลูชันอื่น ๆ สำหรับ 17 ไบต์:

{`"_~"+q~{W%}&}_~
{`"_~"+q~!2*(%}_~

ถ้าฉันสามารถสันนิษฐานได้ว่าอินพุตเป็นเพียง 0 หรือ 1 (เป็นแบบสแตนด์อะโลนสำหรับบูลีนซึ่งไม่มีประเภทเฉพาะสำหรับใน CJam) ฉันจะได้รับ 15 โดยละเว้นg:

{`"_~"+Wq~#%}_~

คำอธิบาย

{`"_~"+  e# Standard generalised quine framework. Leaves the source code on the stack. 
  W      e# Push a -1.
  q~     e# Read and evaluate input.
  g      e# signum, turning truthy values into 1 (leaving 0 unchanged).
  #      e# Power. -1^0 == 1, -1^1 == -1.
  %      e# Select every Nth element: a no-op for 1 and reverses the string for -1.
}_~

ตั้งแต่ 0 และ 1 มี Booleans CJam gผมไม่คิดว่าคุณจำเป็นต้อง
Dennis

@ เดนนิสใช่ฉันไม่แน่ใจจริงๆเกี่ยวกับเรื่องนั้น
Martin Ender

น่าแปลกที่ฉันก็เอาชนะสิ่งนี้ได้ o ฉันจะไม่แปลกใจถ้าคุณตีมันลงไปอีก : D
Addison Crump

9

Pyth, 17 ไบต์

_WQjN*2]"_WQjN*2]

การปรับเปลี่ยน Pyth Quine แบบตรงไปตรงมา


ประณามฉันจะรอการโพสต์นี้ตั้งแต่หนึ่งชั่วโมงหลังจากที่มันถูก sandboxed
lirtosiast

7

> <>, 17 ไบต์

ต้องการแฟล็ก -v (+1 ไบต์) สำหรับการป้อนอินพุตลงในสแต็ก (หรือให้คุณใส่อินพุตบนสแต็กล่วงหน้าบนล่ามออนไลน์)

'rd3*$?rol?!;70.

คุณสามารถทำด้านล่างสำหรับจำนวนไบต์เดียวกัน (โดยไม่ต้องตั้งค่าสถานะ) หากอนุญาตให้ป้อนจำนวนเต็มเท่านั้น (เช่น 0 สำหรับเท็จ, 1 สำหรับความจริง)

'rd3*ic%?rol?!;80.

ลองออนไลน์

Truthy / falsy สำหรับ> <> เป็นอะไรที่ไม่ใช่ 0 และ 0 ตามลำดับ


6

Vitsyขนาด 15 ไบต์

... ฉัน ... ฉันกำลังเต้น CJam! (ตะโกนมากกว่า) แม่! ดูสิฉันทำมันไป!

'rd3 * * * * * * * * i86 -) RL \ O

คำอธิบาย:

'rd3 * * * * * * * * i86 - (RL \ O
ควินมาตรฐาน แต่มีการบิด:

'จับซอร์สโค้ดเป็นสตริง
 rd3 * สร้างตัวละคร 'ใน ASCII
     i86 * - รับอักขระอินพุตเป็น ASCII จากนั้นลบ 48 อักขระ 
                    ถ้ามันเป็นศูนย์คำสั่ง if จะข้ามคำสั่งถัดไป
          (r หากรายการบนสุดของสแต็คเป็นศูนย์ห้ามทำรายการถัดไป
                    รายการถัดไปที่นี่จะกลับรายการ
            l \ O พิมพ์สแต็ก

Vitsyเวอร์ชันใหม่11 ไบต์

v'rd3 *} V) RZ
จับอินพุตเป็นตัวแปร
 'จับภาพแหล่งข้อมูลจนกว่าจะพบกับอีก'
  ย้อนกลับกองซ้อน
   d3 * กด 'ไปที่สแต็ก
      } หมุนสแต็กไปทางขวา
       v) ดันตัวแปร (อินพุต) ไปยังสแต็กและทดสอบว่าไม่เป็นศูนย์
         r หากเป็นเช่นนั้นให้ย้อนกลับสแต็ก
          Z เอาท์พุททุกอย่างในกอง

2

Javascript (ES6), 42 ไบต์

$=_=>'$='+(_?$:[...''+$].reverse().join``)

นี่คือการเปลี่ยนแปลงของฉันBling ควิน มันยาวเป็นสองเท่าเช่นกัน


สิ่งนี้จริงหรือไม่? คำตอบที่ไม่อนุญาตให้ทำงานใน REPL เท่านั้น
feersum

1
@ETHproductions ที่จะเรียกใช้ฟังก์ชัน แต่ก็ยังคงไม่พิมพ์อะไรเลย นอกจากนี้จะไม่เป็นปัญหาอีกต่อไป
Dennis

@Dennis ขวา ฉันเดาว่านั่นหมายความว่าprompt()จำเป็นเว้นแต่เราจะเปลี่ยนเป็น Node.JS ฉันเชื่อว่า$=_=>(A=`$=${$};$(prompt())`,alert(_?A:[...A].reverse().join``));$(prompt())ทำงานได้อย่างถูกต้องแม้ว่ามันอาจจะลงเล่นกอล์ฟได้มากขึ้น
ETHproductions

1
"โปรแกรมของคุณไม่สามารถ [... ] อ่านซอร์สโค้ดของตัวเองไม่ว่าด้วยวิธีใด" โซลูชันนี้ตกอยู่ในหมวดหมู่นี้หรือไม่
ETHproductions

2

Burlesque, 40 ไบต์

ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

คำอธิบาย:

Burlesque มี built-in ในตัวและการจัดการโค้ดขั้นสูง อันที่จริงแล้วคุณไม่สามารถเข้าถึงซอร์สโค้ดของโปรแกรม แต่คุณสามารถเข้าถึงโค้ดที่เหลือซึ่งจะถูกเรียกใช้ในอนาคต ซึ่งหมายความว่า#Qจะกลับมาทุกรหัสที่ตามมาซึ่งเป็นเหตุผลที่เราต้องเพิ่มทุกอย่างขึ้นอยู่กับการรหัสที่ซึ่งเป็นสิ่งที่เรากำลังทำอยู่ด้วย#Qri#Q

blsq ) #Q1 2++
12 -- this is the result of 1 2++
{1 2 ++} -- this is the result of #Q

++1 2เป็นรหัสที่ผิดกฎหมายในทางเทคนิคเนื่องจากเป็นแบบสแต็ก แต่เราสามารถจัดการโค้ดเพื่อให้รันเป็น1 2++:

blsq ) #Q<-#q++1 2 
12

การทำงานกับบิวด์อินเหล่านี้มีความยุ่งยากอย่างมากและยังไม่มีใครใช้มันเพื่อสิ่งที่มีประสิทธิผลยกเว้นสิ่งที่เกี่ยวข้องกับควินิน ถ้าคุณย้อนกลับ++1 2ที่คุณได้รับ2 1++ที่จะผลิตและไม่ได้21 12เหตุผลที่รหัสข้างต้นสร้างขึ้น12ก็เพราะว่ามัน#Qรวมเอา<-ไว้ด้วยในที่สุดเราก็ลงเอยด้วยการดำเนินการมากกว่าแค่2 1++: p เราจบลงด้วยการดำเนินการซึ่งเป็นผู้ผลิต2 1++#q<-12

เราสามารถแทนที่สิ่งต่าง ๆ ในรหัสของเราตัวอย่างเช่นรหัสนี้แทนที่สิ่งที่เกิดขึ้นทั้งหมด?+ในตัวเอง?*

blsq ) #Q(?+)(?*)r~5.-#q5 5?+
25

การใช้งาน:

$ echo "1" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
hs fi sp "-<" j +. /\ "Q#ir" -~ HS 2Q#ir
$ echo "0" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

2

Haskell, 126 118 108 ไบต์

main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="

คาดหวัง0หรือ1เป็นอินพุต


2

Minkolang 0.10 , 13 ไบต์

"66*2-n,?r$O.

ลองที่นี่

n,?rตรงนี้เป็นเหมือนควินมาตรฐานยกเว้นเหล่านี้สี่ตัวอักษร: nใช้จำนวนเต็มจากอินพุตอินเวอร์,ดังนั้นจึง?ข้ามrหากอินพุตเป็นความจริง ไม่เช่นนั้นให้rสลับสแต็กเพื่อให้เอาต์พุตในลำดับย้อนกลับ


1
ฟ้าร้องของฉันหายไป : c
Addison Crump


0

Java 10 (โปรแกรมเต็มรูปแบบ), 282 ไบต์

interface N{static void main(String[]a){var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}

ลองออนไลน์

Java 10 (เป็นฟังก์ชั่นแลมบ์ดา), 154 ไบต์

b->{var s="b->{var s=%c%s%1$c;s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}";s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}

ลองออนไลน์

คำอธิบาย:

interface N{                          // Class
  static void main(String[]a){        //  Mandatory main-method
    var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";
                                      //   Unformatted source code
    s=s.format(s,34,s);               //   Format the source code (the quine-String)
    System.out.print(                 //   Print:
      new Boolean(a[0])?              //    If the input is true:
       new StringBuffer(s).reverse()  //     Print the quine-String reversed
      :                               //    Else:
       s);}}                          //     Print the quine-String as is

คำอธิบาย :

  • var sมีรหัสที่มาที่ยังไม่ฟอร์แมต
  • %s จะใช้ในการใส่สายนี้เป็นของตัวเองด้วย s.format(...)
  • %c,, %1$cและ34ใช้เพื่อจัดรูปแบบเครื่องหมายคำพูดคู่
  • s.format(s,34,s) ทำให้มันเข้าด้วยกัน

จากนั้นnew StringBuffer(s).reverse()จะใช้ในการย้อนกลับ quine-String หากจำเป็นขึ้นอยู่กับ input-boolean


0

05AB1E , 21 ไบต์

0"D34çý‚sè"D34çý‚sè

ลองออนไลน์

การปรับเปลี่ยนของการเริ่มต้น โดยการเพิ่ม0"D34çý"D34çý‚sè

คำอธิบาย:

0                        # Push 0 to the stack
                         #  STACK: [0]
 "D34çý‚sè"             # Push the string 'D34çý‚sè' to the stack
                         #  STACK: [0, 'D34çý‚sè']
            D            # Duplicate this string
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè']
             34ç         # Push '"' to the stack
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè', '"']
                ý        # Join the stack with '"' delimiter
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè']
                 Â       # Bifurcate (short for Duplicate & Reverse)
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè', 'ès‚Âýç43D"ès‚Âýç43D"0']
                        # Pair them up:
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0']]
                   s     # Swap to get the boolean input (0 or 1)
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0'], 1]
                    è    # Index the input into the list
                         #  STACK: ['ès‚Âýç43D"ès‚Âýç43D"0']
                         # (Output the top of the stack implicitly)

PS: พิมพ์บรรทัดใหม่ต่อท้ายโดยอัตโนมัติ หากควรย้อนกลับเช่นกันจะเป็น 23 ไบต์แทน:

0"D34çý‚sè?"D34çý‚sè?

ลองออนไลน์ ( ?เป็นการพิมพ์ที่ชัดเจนโดยไม่มีบรรทัดใหม่ )

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