เขียนโพลีควิน


33

โพลีวินเป็นทั้งควินินและพูดได้หลายภาษา 1คุณจะต้องเขียนควินินที่ใช้ได้อย่างน้อยสองภาษา นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

1ฉันทำมันขึ้นมา หรือค่อนข้างGeobits ได้ เห็นได้ชัดว่าเขาไม่ใช่คนแรกเช่นกัน

กฏสำหรับ Quines

ยอมรับ Quines จริงเท่านั้น นั่นคือคุณต้องพิมพ์คำต่อคำทั้งหมดเพื่อ STDOUT โดยไม่ต้อง :

  • อ่านซอร์สโค้ดของคุณโดยตรงหรือโดยอ้อม
  • อาศัยสภาพแวดล้อม REPL ซึ่งเพียงประเมินและพิมพ์นิพจน์ทุกครั้งที่คุณป้อน
  • อาศัยคุณสมบัติภาษาที่เพิ่งพิมพ์ออกมาในบางกรณี
  • ใช้ข้อความแสดงข้อผิดพลาดหรือ STDERR เพื่อเขียนทั้งหมดหรือบางส่วนของควิน (คุณสามารถเขียนสิ่งต่าง ๆ ไปยัง STDERR หรือสร้างข้อผิดพลาด / เตือนไม่ใช่ข้อผิดพลาดได้ตราบใดที่ STDOUT เป็นควินินที่ถูกต้องและข้อความผิดพลาดไม่ได้เป็นส่วนหนึ่งของมัน)

นอกจากนี้รหัสของคุณจะต้องมีตัวอักษรสตริง

กฎระเบียบสำหรับ Polyglots

สองภาษาที่ใช้จะต้องแตกต่างกันอย่างชัดเจน โดยเฉพาะอย่างยิ่ง:

  • พวกเขาจะต้องไม่ใช้ภาษาเดียวกันในเวอร์ชันที่แตกต่างกัน (เช่น Python 2 กับ Python 3)
  • พวกเขาจะต้องไม่เป็นภาษาถิ่นของภาษาเดียวกันที่แตกต่างกัน (เช่น Pascal vs. Delphi)
  • ภาษาหนึ่งอาจไม่ใช่ชุดย่อยของอีกภาษาหนึ่ง (เช่น C กับ C ++)

4
"รหัสของคุณต้องมีตัวอักษรสตริง" แม้แต่ในภาษาที่ไม่มีตัวอักษรสตริงเช่น Brainfuck?
Peter Olson

@PeterOlson จุดประสงค์ของกฏคือหลีกเลี่ยงช่องโหว่บางส่วนในภาษาเฉพาะกอล์ฟ (เช่นอันนี้ ) เนื่องจากฉันไม่สามารถคาดการณ์ได้ว่าสิ่งที่ลบหรือทำให้กฎอ่อนแอลงจะนำไปสู่ ​​(และเนื่องจากฉันไม่ใช่แฟนของการเปลี่ยนแปลงกฎเว้นแต่จำเป็นจริงๆ) ฉันขอโทษ แต่การส่ง BF จะไม่ถูกต้องสำหรับจุดประสงค์นี้ ท้าทาย. หากเป็นการปลอบใจใด ๆ การยื่นขอ BF จะไม่สามารถแข่งขันได้ ;)
Martin Ender

1
"เขาไม่ใช่คนแรกเลย" เชื่อมโยงไปยังที่ไหน
Erik the Outgolfer

2
C ไม่ใช่ส่วนย่อยของ C ++
MD XF

ภาษาที่ใช้ Brainf ** k แตกต่างกันสองภาษานับเป็นภาษาเดียวกันเช่น Brainf ** k และ MOO หรือไม่
MD XF

คำตอบ:


14

CJam / GolfScript, 34 ไบต์

{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~

จำนวนไบต์ประกอบด้วยการป้อนบรรทัดต่อเนื่องจากโปรแกรมจะไม่เป็นควินหากไม่มี

แม้ว่า CJam และ GolfScript จะคล้ายกันมากในบางแง่มุม แต่ก็มีความแตกต่างมากมาย เพื่อให้เป็นโพลีควินที่ "ซื่อสัตย์" ฉันตัดสินใจที่จะพึ่งพาความแตกต่างให้มากที่สุด ยกเว้นไวยากรณ์ของบล็อกและสตริง (ซึ่งภาษาใช้ร่วมกับผู้อื่นมากมาย) ไม่มีส่วนใดของรหัสที่ได้รับเหมือนกันทั้งสองภาษา

ล่าม GolfScript ออนไลน์มีข้อผิดพลาด; โปรแกรมนี้ทำงานร่วมกับล่ามอย่างเป็นทางการเท่านั้น

ตัวอย่างการวิ่ง

$ cat polyquine
{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~
$ md5sum polyquine <(cjam polyquine) <(golfscript polyquine)
e2f1f3cd68abbbceec58080513f98d9a  polyquine
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/63
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/62

มันทำงานอย่างไร (CJam)

" Push that block.                                                                        ";

{"__X.0#@@?LL
;~"N}

" Push two copies of the block, 1 (computed as 1**0) and rotate the block copies on top.  ";

__X.0#@@

" If 1 is truthy (oh, the uncertainty), execute the first copy; else, execute the second.
  Evaluating the block pushes the string it contains; N pushes a linefeed.                ";

?

" Push two empty arrays.                                                                  ";

LL

" Discard one empty array and dump the second.                                            ";

;~

" (implicit) Print all items on the stack.                                                ";

มันทำงานอย่างไร (GolfScript)

# Push that block.

{"__X.0#@@?LL
;~"N}

# Push a copy of the block; _ and X are noops, # initiates an inline comment.

__X.0#@@?LL

# Discard the 0 and execute the copy of the block.
# Evaluating the block pushes the string it contains; N is a noop.

;~

# (implicit) Print all items on the stack, followed by a linefeed.

CJam / GolfScript ขนาด 12 ไบต์

{"0$~"N}0$~

วิธีแก้ปัญหาแบบโกงที่หลีกเลี่ยงความแตกต่างของภาษาให้มากที่สุด

ลองออนไลน์:

มันทำงานอย่างไร (CJam)

 "0$~"       " Push that string.                                                          ";
      N      " Push a linefeed.                                                           ";
{      }0$~  " Push a copy of the block and execute it.                                   ";
             " (implicit) Print the stack.                                                ";

มันทำงานอย่างไร (GolfScript)

 "0$~"       # Push that string.
      N      # Undefined token (noop).
{      }0$~  # Push a copy of the block and execute it.
             # (implicit) Print the stack, followed by a linefeed.

14

C # / Java, 746 ไบต์

ฉันใช้คุณสมบัติที่ตัวอักษรใน Java สามารถเขียนเป็นลำดับยูนิโค้ดเหมือนกัน หากเรามีAคำสั่งสำหรับคอมไพเลอร์ C # และBคำแนะนำสำหรับ Java เราสามารถใช้ส่วนรหัสต่อไปนี้:

//\u000A\u002F\u002A
A//\u002A\u002FB

มันจะ "ถูกจดจำ" โดยวิธีต่อไปนี้กับ C #:

//\u000A\u002F\u002A
A//\u002A\u002FB

และโดยวิธีต่อไปนี้โดย Java:

//
/*
A//*/B

เนื่องจากการ\u000Aแบ่งบรรทัด\u002Fเป็น/และ\u002Aอยู่*ใน Java

ดังนั้น polyglot-quine สุดท้ายคือ:

//\u000A\u002F\u002A
using System;//\u002A\u002F
class Program{public static void//\u000A\u002F\u002A
Main//\u002A\u002Fmain
(String[]z){String s="//@#'^using System;//'#^class Program{public static void//@#'^Main//'#main^(String[]z){String s=!$!,t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&'!,s};for(int i=0;i<7;i++)t=t.//@#'^Replace//'#replace^(!!+(char)a[i],b[i]);//@#'^Console.Write//'#System.out.printf^(t);}}",t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A",s};for(int i=0;i<7;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);//\u000A\u002F\u002A
Console.Write//\u002A\u002FSystem.out.printf
(t);}}

อย่างไรก็ตามขนาดใหญ่เกินไปเนื่องจากภาษาใช้คำฟุ่มเฟื่อย

สะสมที่มีอยู่บน ideone.com: C # , Java


3
ยินดีต้อนรับสู่ชุมชนการเขียนโปรแกรมปริศนา & รหัสกอล์ฟ!
Erik the Outgolfer

2
ฉันรู้ว่ามันเกือบสองปีแล้ว แต่คุณสามารถตีกอล์ฟได้ 58 ไบต์ ลองออนไลน์จาวา และลองออนไลน์ C # .NET
Kevin Cruijssen

คุณหมายถึง 688 bytes หรือเปล่า
Ivan Kochurkin

13

Python 3 และ JavaScript ขนาด 134 ไบต์

นี่คือความพยายาม (ขั้นสุดท้ายของฉัน):

a='eval(a.split(" ")[2%-4]),1//2# q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8)) print(a[-12:]%a) a=%r;eval(a)';eval(a)

มันอาจจะสามารถเล่นกอล์ฟได้มากขึ้นโดยเฉพาะถ้าใครรู้วิธีที่ดีกว่าในการรับราคาเดียวใน JavaScript


เมื่อต้มแล้วโปรแกรมจะมีลักษณะดังนี้:

a='a long string';eval(a)

eval()ฟังก์ชั่นจะประเมินการแสดงออกทั้งสองภาษา ดังนั้นสตริงที่ยาวจะถูกดำเนินการ:

eval(a.split(" ")[2%-4]),1//2# ... the rest gets commented out

2%-4นี้แยกสายยาวด้วยช่องว่างและประเมินผลย่อยจัดทำดัชนีโดย JavaScript จะเรียกใช้ substring ที่สาม ( 2 % -4 == 2) และ Python ที่สองที่ผ่านมา ( 2 % -4 == -2) เนื่องจากตัวดำเนินการ modulo ของพวกเขาทำงานแตกต่างกันสำหรับเนกาทีฟ

ส่วนที่เหลือของสตริงจะถูกละเว้นในทั้งสองภาษา หยุด JavaScript ในขณะที่งูใหญ่เห็นว่ามันเป็นส่วนจำนวนเต็มและหยุดที่//#

ดังนั้น JavaScript จึงพิมพ์ซอร์สโค้ดไปยังคอนโซลที่นี่:

q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8))

และ Python ที่นี่:

print(a[-12:]%a)

ทั้งสองใช้ส่วนสุดท้ายของสตริงซึ่งเป็นแม่แบบของโปรแกรม:

a=%r;eval(a)

+1 แข็งแรงเล่นกอล์ฟมันถึง 140 a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])ไบต์: ทดสอบใน JavaScript แต่ไม่ใช่ใน python ... แต่ควรใช้งานได้
soktinpk

@soktinpk ขอบคุณ a.split(1)แต่ผมไม่คิดว่าจะช่วยให้งูหลาม
grc

1
-8 ไบต์:q=unescape("%27")
Patrick Roberts

8

Ruby / Perl / PHP, 52

$b='$b=%c%s%c;printf$b,39,$b,39;';printf$b,39,$b,39;

คัดลอกคำต่อคำจากวินคริสโตเฟอร์ของ Durr

นี่คือการละเมิดกฎ Ruby และ Perl ไม่ใช่ภาษาเดียวกันหรือ Perl เป็นเซตย่อยของ Ruby (ตัวอย่างของ Perl ที่เชื่อมโยงส่วนใหญ่จะไม่ทำงานใน Ruby เช่น) แต่รูบี้ถูกออกแบบมาให้มีลักษณะเหมือน Perl ถ้าคุณต้องการและมันเกิดขึ้นมากมายเมื่อเล่นกอล์ฟ


สิ่งนี้สามารถใช้เพื่อทำงาน (หรือใช้งานได้แล้ว) ใน PHP ด้วยหรือไม่ หากฉันอ่านเอกสารอย่างถูกต้องคุณสามารถเรียกใช้บนบรรทัดคำสั่งด้วย-Rและคุณไม่จำเป็นต้องใช้แท็กสคริปต์ php.net/manual/th/features.commandline.options.php
hmatt1

ฉันจะไม่เรียกมันว่ากฎการละเมิด การค้นหาควินินซึ่งทำงานบนสองภาษาเป็นวิธีที่ถูกต้องในการเข้าถึงคำถามนี้ อย่างไรก็ตามการเห็นว่านี่ไม่ใช่งานของคุณเองฉันต้องการได้ถ้าคุณทำเครื่องหมายว่าเป็นวิกิชุมชน
Martin Ender

@ chilemagic แน่นอนมัน!
ประวัติศาสตร์

@ MartinBüttnerเสร็จแล้ว
ประวัติศาสตร์

6

Bash / GolfScript, 73

.~0 () 
{ 
    declare "-f" @* ".~0" " () 
"+@n.;
    echo '.~0;'
}
.~0;

มีช่องว่างต่อท้ายใน 3 บรรทัดแรก

Bash / GolfScript, 78

alias :a~a.='eval "alias :a~a."\
;set [61 39]+a[39]+n"":a;echo ":a~a."'
:a~a.

5

PHP / Perl - 171

#<?PHP$s=1;$t="";
$a='%s<%cPHP$s=1;$t="";%c$a=%c%s%c;$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);%c#%c>';$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);
#?>

ทำงานด้วย:

$ php quine.pl
$ perl quine.pl

phpรหัสทำงานจริง (ไม่ได้เป็นเพียงการพิมพ์เอง)


5

Bash / Ruby, 104 82

"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
a

รุ่นเก่ากว่า:

"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
a

Bash / Ruby, 128 โดยไม่มีพฤติกรรมที่ไม่ได้กำหนด

"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
a

ว้าวฉันไม่เข้าใจด้วยซ้ำว่ารหัส Ruby ทำงานอย่างไร: D
Martin Ender

@ MartinBüttner <<aใน Ruby ทำงานเหมือนกับ Bash แต่ส่งคืนสตริง ฉันไม่ได้เขียนโปรแกรม Ruby มาก่อน ฉันเพิ่งพบภาษาที่สุ่มด้วยคุณสมบัตินี้
jimmy23013

ฉันไม่รู้ว่ามันทำงานอย่างไรในการทุบตี: P
Martin Ender

@ MartinBüttnerมันถูกเรียกว่า heredoc ส่งกลับสตริงปิดโดยบรรทัดมีเพียงหนึ่งเดียว<<word word
jimmy23013

5

reticular / befunge-98, 28 ไบต์ [ไม่ใช่การลบล้างข้อมูล]

<@,+1!',k- ';';Oc'43'q@$;!0"

ลองตาข่าย ลองใช้ befunge 98!

สิ่งใดในระหว่าง;s ใน befunge จะถูกละเว้นและ!ข้ามไปยังเซ็กเมนต์ระหว่าง;s สำหรับการไขว้กันเหมือนแห ดังนั้นตาข่ายที่เห็น:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                             move left
                           "  capture string
                          0   push zero
                        ;!    skip `;` (end program)
                       $      drop zero
                     q@       reverse TOS
                 '43'         push 34 (")
                c             convert to char
               O              output all
              ;               end program

Befunge เห็น:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                            move left
                           " capture string
                         !0  push 1
              ;         ;    skip this
         - ';'               push 27
       ,k                    output top 27 chars
   +1!'                      push 34 (")
  ,                          output "
 @                           end program

4

Ruby / Mathematica, 225 ไบต์

นี่คือ polyquine ที่สามารถเอาชนะได้มากของฉันเอง (ซึ่งทำหน้าที่เป็นตัวอย่างและหลักฐานการแนวคิด):

s="s=%p;puts s%%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1";puts s%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1

ส่วนแรกขึ้นอยู่กับ quine ทับทิมนี้และโดยทั่วไป:

s="s=%p;puts s%%s;#MathematicaCode";puts s%s;#MathematicaCode

การกำหนดสตริงเหมือนกันใน Mathematica puts s%sถูกตีความว่าเป็นผลิตภัณฑ์ที่ 4 สัญลักษณ์: putsสตริงs, %(ผล REPL ที่ผ่านมาหรือOut[0]ถ้ามันแสดงออกแรกที่คุณประเมิน) sและอื่น ๆ แน่นอนว่าไม่มีความหมายอย่างสมบูรณ์ แต่ Mathematica ไม่สนใจและ;ระงับผลลัพธ์ใด ๆ ดังนั้นสิ่งนี้จึงถูกประมวลผลอย่างเงียบ ๆ จากนั้น#ทำให้ส่วนที่เหลือของบรรทัดแสดงความคิดเห็นสำหรับ Ruby ในขณะที่ Mathematica ดำเนินการต่อ

สำหรับรหัส Mathematica ส่วนที่ใหญ่ที่สุดของมันคือการจำลองการประมวลผลสตริงรูปแบบของรูบี้โดยไม่ต้องใช้ตัวอักษรสตริงใด ๆ FromCharacterCode@{37,112}เป็น%pและเป็นFromCharacterCode@{37,112} %%อดีตได้รับการแทนที่ด้วยสตริงตัวเอง (ที่InputFormเพิ่มราคา) %หลังมีเพียงหนึ่งเดียว ผลที่ได้คือPrinted จับสุดท้ายคือวิธีการจัดการกับ#ที่ด้านหน้า นี่คือสัญลักษณ์ของ Mathematica สำหรับอาร์กิวเมนต์แรกของฟังก์ชั่น pure (ไม่ระบุชื่อ) ดังนั้นสิ่งที่เราทำคือเราสร้างฟังก์ชั่นล้วนๆโดยการต่อท้าย&และเรียกใช้ฟังก์ชั่นด้วยอาร์กิวเมนต์1ทันที การ1เตรียมการเรียกฟังก์ชันเป็นการ "ทวีคูณ" ด้วย1Mathematica ซึ่งกลืนกินซ้ำอีกครั้งโดยไม่คำนึงว่าฟังก์ชั่นใดถูกส่งคืน


2

> <> และ CJam, 165 ไบต์

"~~~~~~~~~~~~~~~~~~~~~~~r00gol?!v93*0.Hi
'                               <       .1*5av!?log10oar~~~r
'"`{"`"\"_~e#.21 <.2+4*96;!?log10oa"}_~e#.21 <.2+4*96;!?log10oa

สำหรับ CJam โปรแกรมเริ่มต้นด้วยตัวอักษรสตริงหลายบรรทัด สิ่งนี้จะถูกหลีกเลี่ยง`จากนั้นจะใช้ quine มาตรฐานเพื่อพิมพ์รหัส quine รวมถึงความคิดเห็นต่อท้าย

เมื่อต้องการ> <> ตัวแรกจะ"เริ่มต้นตัวอักษรสตริงที่ผ่านทั้งแถวแรกผลักอักขระทุกตัวไปยังสแต็ก หลังจากนั้นช่องว่างต่อท้าย (สร้างขึ้นเนื่องจากอินพุตถูกเติมเต็ม) จะถูกลบออกจากนั้นสแต็กจะถูกย้อนกลับ อักขระทุกตัวในสแต็ก (เช่นทั้งแถวแรก) เป็นเอาต์พุตจากนั้นอักขระจะเลื่อนลงไปที่แถวที่สอง

โดยทั่วไปแล้วแถวที่สองจะทำสิ่งเดียวกันยกเว้นว่าอยู่ในทิศทางตรงกันข้ามดังนั้นคุณไม่จำเป็นต้องย้อนกลับกองซ้อน (ฉันทำเช่นนี้เพราะฉันต้องลบช่องว่างต่อท้าย)

ในที่สุดมันก็ย้ายไปยังบรรทัดที่สาม ข้อแตกต่างที่สำคัญเพียงอย่างเดียวคือคุณต้องข้ามบล็อก CJam ซึ่งทำโดยใช้.เครื่องหมายอัญประกาศเดี่ยวจับทั้งเส้น (อีกครั้งไปข้างหลัง) แล้วก็เป็นเอาท์พุท


2

C / PHP, 266 304 300 282 241 203 + 10 ไบต์

//<?php
function main($a){printf($a="%c//<?php%cfunction main(%ca){printf(%ca=%c%s%c,13,10,36,36,34,%ca,34,36,10,10,10);}%c#if 0%cmain();%c#endif",13,10,36,36,34,$a,34,36,10,10,10);}
#if 0
main();
#endif

10 ไบต์เนื่องจากการรวบรวมใน C -Dfunction=ต้องใช้ธง

มันทำงานอย่างไร (ใน PHP):

  • ล่าม PHP พิมพ์ทุกอย่างก่อนที่จะ<?phpเป็น HTML //ไม่ใช่ความคิดเห็นใน HTML ดังนั้นมันจึงพิมพ์ได้ง่าย
  • mainaถูกประกาศเป็นฟังก์ชันที่มีตัวแปร
  • printfพิมพ์ carriage return (เพื่อแทนที่การพิมพ์ที่มีอยู่แล้ว//) จากนั้นซอร์สโค้ดโดยใช้วิธีการ quining C / PHP มาตรฐาน
  • #if 0 ถูกละเว้นโดย PHP
  • main($a)aเริ่มต้นตัวแปรที่ว่างเปล่า (ก่อนหน้านี้ใช้error_reporting(0)เพื่อละเว้นข้อผิดพลาดที่เกิดจากการโทรmain())
  • #endif ถูกละเว้นโดย PHP

มันทำงานอย่างไร (ใน C):

  • //<?php เป็นความคิดเห็นบรรทัดเดียวดังนั้นมันจึงถูกละเว้น
  • คำหลักจะถูกละเว้นเนื่องจากอาร์กิวเมนต์เรียบเรียงบรรทัดคำสั่งfunction-Dfunction=
  • GCC $และเสียงดังกราวไม่ดูแลถ้าตัวแปรเริ่มต้นด้วยหรือมี (สิ่งนี้ช่วยได้ทั้งวัน)
  • printf พิมพ์การคืนค่าขนส่ง (ไร้ประโยชน์ในตัวอย่างนี้) จากนั้นซอร์สโค้ดโดยใช้วิธีการ quining C / PHP มาตรฐาน
  • #if 0ไม่ต้องสนใจทุกสิ่งจนกระทั่งendifPHP สามารถโทรออกmainได้
  • #endif สิ้นสุดบล็อก "ไม่สนใจฉัน"

2

Wumpus / > <> / Befunge-98 28 ไบต์

"]#34[~#28&o@,k+deg0 #o#!g00

ลองใช้ใน Wumpus! , ลองใน> <>! , ลองใน Befunge-98!

มันทำงานอย่างไร:

รหัสของ Wumpus:

  " Start string literal
    Bounce off end of line and come back
  " End string literal
   ] Push top of stack to bottom
    #34 Push double quote
       [~ Get bottom of stack and swap it with the double quote
         #28 Push 28
            &o@ Print the top 28 items on stack and terminate program

> <> รหัส:

  " Start string literal
    Wrap when it reaches the end of the line
  " End string literal
   ]# Clear stack and reflect
  " Wrapping string literal again, but backwards
                     g00 Get the character from cell 0 (")
                 #o#! Skip into the printing loop
                      Exit with an error

รหัส Befunge-98:

  " Wrapping string literal
   ] Turn right
   ] Turn right again, going West
  " Wrapping string literal going West
                 !g00 Get double quote and invert it
              #o# Skip over the o instruction
           g0   Get double quote
        +de Push 27
     @,k    Print 27+1 items from the stack and terminate program.

1

05AB1E / 2sable, 14 ไบต์, ไม่แข่งขัน

0"D34çý"D34çý

ลองออนไลน์! (05AB1E)
ลองออนไลน์! (2sable)

2sable มาจาก 05AB1E และคล้ายกัน แต่มีความแตกต่างที่สำคัญ

ขึ้นบรรทัดใหม่


1
ฉันไม่รู้ว่าสถานะปัจจุบันของ 2sable และ 05AB1E คืออะไร แต่ครั้งสุดท้ายที่ฉันตรวจสอบฉันจะถือว่าพวกเขาเป็นภาษาถิ่นที่แตกต่างกันของภาษาหนึ่ง
Martin Ender

1

C / TCL, 337 ไบต์

#define set char*f= 
#define F 
#define proc main(){ 
set F "#define set char*f= 
#define F 
#define proc main(){ 
set F %c%s%c; 
proc /* {} {} 
puts -nonewline %cformat %cF 34 %cF 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 
"; 
proc /* {} {} 
puts -nonewline [format $F 34 $F 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 

1

C / Vim 4.0, 1636 ไบต์

มีอักขระควบคุม

map () {}/*
map g ;data0df"f"cf"
f"cf"
f"D2kyyP;g6k2dd4x5jA"JxA","JxA","jyyPkJxA"jok;g2kdd4xkJx3jdd
map ;g O"vdldd0i# 0# 1# 2# 3# 4# 5# #0lx2lx2lx2lx2lx2lx2lx:s/##/#/g
o:s//"/gk0y2lj02lp"addk@ao:s//\\/gk0ly2lj02lp"addk@ao:s///gk04ly2lj02lp05l"vp"addk@ao:s///gk05ly2lj02lp05l"vp"vp"addk@ao:s//
/gk06ly2lj02lp05l"vp"vp"vp"addk@ao:s//
/gk02ly2lj02lp05l"vp"addk@a
unmap ()

map ;data o*/ char*g[]={"map () {}/*#2map g ;data0df#0f#0cf#0#5#3f#0cf#0#5#3f#0D2kyyP;g6k2dd4x5jA#0#3JxA#0,#0#3JxA#0,#0#3jyyPkJxA#0#3jo#3k;g2kdd4xkJx3jdd#2map ;g O#4#4#4#4#3#0vdldd0i## 0## 1## 2## 3## 4## 5## ###30lx2lx2lx2lx2lx2lx2lx:s/####/##/g#5o:s//#0/g#3k0y2lj02lp#0addk@ao:s//#1#1/g#3k0ly2lj02lp#0addk@ao:s//#4#4#3/g#3k04ly2lj02lp05l#0vp#0addk@ao:s///g#3k05ly2lj02lp05l#0vp#0vp#0addk@ao:s//#4#4#5/g#3k06ly2lj02lp05l#0vp#0vp#0vp#0addk@ao:s//#4#4#5/g#3k02ly2lj02lp05l#0vp#0addk@a#2unmap ()#2#2map ;data o*/ char*g[]={","#A#0#a#0,#0#b#0,#0#c#0#C#2","}; /*#3#2#2#0*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf(#0#1n#0);else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}"}; /*

"*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf("\n");else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}

Vim ของคุณต้องมีชุดดังต่อไปนี้:

set noai
set wm=0
set nosi
set tw=0
set nogdefault

1

C / Lisp, 555 ไบต์

t(setq /*;*/){}main(){char q='\"',s='\\';char*a= 
"~%t(setq /*;*/){}main(){char q='~A';char*a= 
~S;char*b=/* 
)(setq a ~S) 
(setq */ ~S;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);}~%";char*b=/* 
)(setq a "\\\"',s='\\\\") 
(setq */ " 
t(setq /*;*/){}main(){char q='%c%c',s='%c%c';char*a= 
%c%s%c;char*b=/* 
)(setq a %c%c%c%c%c',s='%c%c%c%c%c) 
(setq */ %c%s%c;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 
";printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 

บรรทัดแรกว่างโดยเจตนา


1

Perl / Javascript (SpiderMonkey), 106 ไบต์

$_='$q=+[]?h^O:unescape("%27");print("$_="+$q+$_+$q+";eval($_)"||(q($_),"=$q$_$q;",q(eval($_))))';eval($_)

ลองใช้ Perl ออนไลน์!
ลอง JavaScript ออนไลน์!

คำอธิบาย

ข้อมูลควินนั้นถูกเก็บไว้ใน$_ทั้งสองภาษาจากนั้นevaled ซึ่งเป็นขั้นตอนมาตรฐานที่ค่อนข้างมากใน Perl ฉันเลือก SpiderMonkey บน TIO เพราะมันมีprintฟังก์ชั่น แต่มันสามารถส่งไปยังเบราว์เซอร์ได้อย่างง่ายดายสำหรับ 20 ไบต์ (เพิ่มeval("print=alert");ไปยังจุดเริ่มต้นของ$_คำจำกัดความ)

Perl เห็นข้อมูลที่จัดเก็บใน$_และevals ได้ตามปกติ ตั้งแต่+[]เป็น truthy ใน Perl, 'ถูกเก็บไว้ใน$qทาง stringwise-แฮคเกอร์และh Oเคล็ดลับสุดท้ายคือการเรียกไปprintที่ส่วนแรกสำหรับ JavaScript ใช้+ซึ่งใน Perl ถือว่ารายการทั้งหมดเป็นตัวเลขและเพิ่มขึ้น0แล้วเราใช้||ผู้ประกอบการเพื่อกลับสิ่งที่เราต้องการจริง(q($_),"=$q$_$q;",q(eval($_)))ซึ่งเทียบเท่ากับ"\$_=$q$_$q;eval(\$_)"ซึ่งเทียบเท่ากับ

ใน JavaScript ให้+[]ส่งคืน0ดังนั้นเราจึงเรียกunescape("%27")เก็บไว้'ใน$q(น่าเสียดายที่atobไม่มีอยู่ใน SpirderMonkey ... ) ในการเรียกใช้printเนื่องจาก+เป็นตัวดำเนินการเรียงต่อกันใน JavaScript บล็อกแรกจะสร้างเอาต์พุตที่ต้องการและส่วนที่สองหลังจากนั้น||จะถูกละเว้น

ขอบคุณความคิดเห็นของ Patrick Robertsสำหรับunescapeเคล็ดลับ!


Perl / JavaScript (เบราว์เซอร์), 108 ไบต์

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

ลองใช้ Perl ออนไลน์!

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

คำอธิบาย

เราเก็บข้อมูลควินเป็น$_ทั้งสองภาษาและจากนั้นevalซึ่งเป็นขั้นตอนมาตรฐานที่ค่อนข้างมากใน Perl

Perl เห็นข้อมูลที่จัดเก็บใน$_และevals ได้ตามปกติ evalภายใน$_จะถูกดำเนินการและไม่สามารถแยก แต่เนื่องจากมันevalไม่ได้ผิดพลาด printfแล้วจะเรียกว่ามีสายยกเดียวq()กับ`เป็น delimter ที่เป็นเพียงแค่ใช้`จะส่งผลให้คำสั่งที่ถูกดำเนินการในเปลือกแล้วสำหรับครั้งแรกที่ใช้$qเนื่องจาก+[]เป็น truthy ใน Perl, 'ถูกเก็บไว้ใน$qทาง stringwise-แฮคเกอร์และhO

ใน JavaScript ที่evalบล็อกภายใน$_ชุดขึ้นฟังก์ชั่นqที่returns อาร์กิวเมนต์เป็นStringและชื่อแทนconsole.logไปprintfตั้งแต่console.logสตริงรูปแบบเช่นprintfใน Perl เมื่อprintfใดที่เรียกว่า+[]return 0ดังนั้นเราจึงเรียกatobให้ถอดรหัส'และเก็บ$qไว้


1

Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1,031 ไบต์

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='eval("0"?0?"def strtr(s,f,t);s.tr(f,t) end;class String;def chr(n);self+n.chr end;end":"$u=strtr=(s,f,t)=>[...f].reduce((s,a,i)=>s.replace(RegExp(a,`g`),t[i]),s);printf=console.log;(S=String).prototype.chr=function(n){return this+S.fromCharCode(n)}":[]&&"sub strtr{eval q(q(X)=~y/X/X/r)=~s/X/shift/ger}");printf(strtr("%s<?#/.__id__;s=+0;#j;read -d jj q<<jj;s=zj;Q=jecho s=1//2z;_=rksksksz<z?z#/.__id__z;s=+0z;#ksz;read -d ksks qz<z<ksksz;s=zzksz;Q=kskQksz;evalz zkQ;echo kqj;eval kQwk_=j%sj;eval(k_);//;#jjj;f=jjjs=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)jjj;q=_[18]*3;print f%%(q,_,q,q,f,q)%s","jkwz","".chr(39).chr(36).chr(10).chr(92).chr(92)),[]&&"s=1//2;_=r".chr(39).chr(39).chr(39),$_,$u?"":"".chr(10));';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

ยืนยันออนไลน์!

จากการอัปเดตของคำตอบนี้ฉันคิดว่าฉันลองและปรับรหัสที่พิมพ์ต่าง ๆ ให้เหมาะสม แต่จบลงด้วยการเพิ่มใน Bash ซึ่งเพิ่มภาระเพิ่มขึ้นอีก ในขณะที่สิ่งนี้ได้รับการปรับปรุงให้ดีกว่าความพยายามครั้งแรกของฉัน (บันทึกได้มากกว่า 300 ไบต์) ฉันมั่นใจว่ามันจะยังสามารถตีกอล์ฟต่อไปได้


ทางเลือกPerl 5 / ทับทิม / JavaScript (Node.js) / Bash / Python 2 / PHP , 1,040 ไบต์

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='$z=0?"$&".next+92 .chr+10 .chr: 0..a||eval("printf=console.log;unescape`$%27%5C%0Ak`");$q=$z[1]?$z[1]:h^O;printf("%s%s%s%s<?#/.__id__;s=+0;#%s;read -d %s%s q<<%s%s;s=%s%s;Q=%secho s=1//2%s;_=r%ss%ss%ss%s<%s?%s#/.__id__%s;s=+0%s;#%ss%s;read -d %ss%ss q%s<%s<%ss%ss%s;s=%s%s%ss%s;Q=%ss%sQ%ss%s;eval%s %s%sQ;echo %sq%s;eval %sQ%s%s_=%s%s%s;eval(%s_);//;#%s%s%s;f=%s%s%ss=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)%s",[]&&"s=1//2;_=r",$r=[]&&$q,$r,$r,$q,$q,$q,$q,$q,$b=$z[2]?$z[2]:chr(92),$q,$q,$b,$d=$z[0]?$z[0]:h^L,$d,$d,$b,$b,$b,$b,$b,$d,$b,$d,$d,$b,$b,$d,$d,$b,$b,$b,$d,$b,$d,$d,$d,$b,$b,$b,$d,$d,$q,$d,$n=$z[3]?$z[3]:chr(10),$d,$q,$_,$q,$d,$q,$q,$q,$q,$q,$q,$q,$q,$q,$z[4]?"":$n);';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

ยืนยันออนไลน์!

ใกล้กับวิธีดั้งเดิมของฉันเล็กน้อย แต่การทำซ้ำของ args สำหรับprintfยังคงบ้า การใช้อาร์กิวเมนต์ตำแหน่งแทนทำให้ใช้งานได้เฉพาะใน Chrome และเป็นเรื่องยากที่จะทำงานใน PHP เช่นกันเพราะ$sใน%1$sถูกแก้ไข แต่สามารถบันทึกจำนวนมากไบต์บางทีอาจใช้ทั้งสองวิธีร่วมกัน ...


0

C / dc, 152 ไบต์

z1d//[[z1d//]P91PP93P[dx]Pq 
;main(){char*a="z1d//[[z1d//]P91PP93P[dx]Pq%c;main(){char*a=%c%s%c;printf(a,10,34,a,34);}//]dx";printf(a,10,34,a,34);}//]dx

ใช้ประโยชน์จากความคิดเห็นใช่!


0

Perl 5 / Ruby / PHP / JavaScript (เบราว์เซอร์), 153 ไบต์

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

ลองใช้ Perl ออนไลน์!
ลองทับทิมออนไลน์!
ลองใช้ PHP ออนไลน์!

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

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