การคว้าน แต่ด้วยไฟล์ Windows!


9

เขียนควินที่เมื่อทำงานจะสร้างตัวเองในไดเรกทอรีปัจจุบันในไฟล์ต้นฉบับที่ชื่อตัวเอง เราจะใช้ Windows ในการนี้ดังนั้นชื่อไฟล์ (และดังนั้นควินิน) จะต้องมีข้อ จำกัด ดังต่อไปนี้:

  • ไม่มีตัวละครเหล่านี้ \ / : ? * < > |
  • น้อยกว่า211 255 ตัวอักษร

ข้อ จำกัด และสมมติฐาน

  • รหัสของคุณจะต้องเป็นโปรแกรมเต็มรูปแบบ (มันจะถูกเรียกใช้หลังจากทั้งหมด)

  • ไม่มีการคัดลอกจากไฟล์ต้นฉบับ

  • คุณสามารถสมมติว่าไม่มีไฟล์อื่นที่มี Quine ของคุณเป็นชื่อของมัน (เพราะมันจะสร้างQuine (1))

  • อนุญาตให้มีข้อผิดพลาดได้ (ตราบใดที่ไม่ได้อยู่ในซอร์สโค้ด

นี่คือ รหัสสั้นที่สุดเป็นไบต์ชนะ!

แก้ไข

บางทีฉันอาจจะไม่ชัดเจนไฟล์ที่มีชื่อของควินินจะต้องมีการควินจริง ความผิดฉันเอง.


ข้อ จำกัด ของอักขระที่ไม่ใช่ ASCII ในโปรแกรมคืออะไร (สำหรับ Windows นี่อาจขึ้นอยู่กับว่ามีการติดตั้ง Windows รุ่นภาษาใดบ้างฉันลืมกฎที่ถูกต้องและไม่ว่าพวกเขาจะเปลี่ยนไปตามกาลเวลาหรือไม่)

ทำไมน้อยกว่า 211 ไบต์ นั่นเป็นข้อ จำกัด โดยพลการ ...
mbomb007

@ mbomb007 ขนาดไฟล์สูงสุดที่ฉันเชื่อ
Addison Crump

1
@VoteToClose มันคือ 255. stackoverflow.com/a/265782/2415524
mbomb007

@ mbomb007 พิมพ์ผิดใช่ไหม?
Addison Crump

คำตอบ:


6

Vitsy, 10 27 ไบต์

'rddd++&"rdd8++a[v}v1-D);].

หาก:ได้รับอนุญาตฉันสามารถย่อให้เหลือ 11 ไบต์ :(

คำอธิบาย:

'rddd++&"rdd8++a[v}v1-D);].
'                           Capture all instructions as a string until encountering
                              ' again, looping if necessary.
 r                          Reverse the current stack (output is top-down).
  ddd++                     Push char literal ' to the stack.
       &                    Push a new stack to the stack stack.
        "                   Same as ', but " specific.
         r                  Reverse the current stack.
          dd8++             Push char literal " to the stack.
               a            Push 10 to the stack.
                [        ]  Loop forever.
                 v          Capture the top value as a variable.
                  }         Take the bottom item of the stack and put it on the top.
                   v        Dump the variable to the stack.
                    1-      Subtract 1.
                      D     Duplicate the top item.
                       );   Pop n; if n is 0, exit the loop.
               a[v v1-D);]  This is a makeshift for loop with 10 iterations.
                          . Pop the top stack as n, and the second stack as o. 
                              Write a file called "n" with the contents of "o".

สแต็คทั้งสองจะเหมือนกันในตอนท้าย ในบางรุ่น Java นี้อาจโยนFileNotFoundExceptionเนื่องจากการใช้งานที่แตกต่างกันของFileInputStreamคลาส

คำตอบก่อนหน้าก่อนที่จะแก้ไข:

&'rddd++}.

คำอธิบาย:

&           Push a new stack to the stack stack.
 'rddd++    Modified standard quine.
        }   Move the ' to the right place.
         .  Pop the top stack as n, and the second stack as o. Write a file called
                 "n" with the contents of "o". (Quine name, no content)

เพราะฉันอาจเช่นกันนี่คือแผนภาพของขั้นตอนที่เกิดขึ้นภายในสแต็ก (แต่ละสแต็กแสดงโดย[]):

Initial state: [[]]

&              [[], []]
                  Push a new stack to the stack stack.

 '             [[], ["r", "d", "d", "d", "+", "+", "}", ".", "&"]]
                  This stack state occurs because ' will loop around the line
                    until finding the next '.

  r            [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r"]]
                  Reverses the top (last) stack.

   ddd         [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r", 13, 13, 13]
                  Push thirteen thrice.

      ++       [[], ["&", ".", "}", "+", "+", "d", "d", "d", "r", "'"]
                  Because char ' is 39 = 13 + 13 + 13.

        }      [[], [".", "}", "+", "+", "d", "d", "d", "r", "'", "&"]]
                  Takes the bottom item, then puts it on the top.

         .     []
                  Writes a file with content from the second-to-top stack and the
                    name as the concatenation of all elements in the top stack,
                    with top member priority (backwards from my representation).

จริง ๆ แล้วฉันไม่แน่ใจว่ามันทำงานอย่างไร การเปลี่ยนแปลงนาทีทำให้สิ่งนี้หยุด ตัวอย่างเช่นการวางตำแหน่ง&ในตำแหน่งอื่น ๆ ควรใช้งานได้เช่นกัน แต่มันทำให้ClassCastExceptions, IOExceptions และArrayOutOfBoundsExceptions ขึ้นอยู่กับตำแหน่งที่คุณวาง ฉันอาจต้องแก้ไขข้อผิดพลาดบางอย่าง


1
+1 สำหรับPush a new stack to the stack stack.
Pavel

1
+1 จากฉันหากคุณสามารถผลักดันสแต็กสแต็กใหม่ไปยังสแต็กสแต็กมิฉะนั้นลืมมัน! ... ล้อเล่น +1 ฉันก็หัวเราะเหมือนกัน
Magic Octopus Urn

2
@carusocomputing จะเกิดอะไรขึ้นถ้าฉันบอกคุณว่าฉันสามารถทำได้o? ;)
Addison Crump

ถอนหายใจเครื่องรูด ...
เมจิกปลาหมึกโกศ

1
อืม ... ฉันคิดว่าไฟล์ที่สร้างขึ้นควรจะมีรหัส (เช่นเนื้อหาควรจะเท่ากับชื่อไฟล์)
Leo

5

Node.js, 56 52 ไบต์

function f(){require('fs').writeFile(f+='f()',f)}f()

สิ่งนี้พิมพ์คำเตือน

DeprecationWarning: การเรียกใช้ฟังก์ชันอะซิงโครนัสโดยไม่มีการโทรกลับถูกเลิกใช้

ถ้าคุณต้องการให้ทุกสีเขียวว่าค่าใช้จ่าย 4 ไบต์มีการเปลี่ยนแปลงไปwriteFilewriteFileSync


2

Lua, 96 ไบต์

s="s=%qs=string.format(s,s)f=io.open(s)f.write(f,s)"s=string.format(s,s)f=io.open(s)f.write(f,s)

พิมพ์สิ่งนี้ลงในโทรศัพท์ของฉันควรใช้งานได้ แต่ฉันจะทดสอบเมื่อฉันไปถึงคอมพิวเตอร์


12
ฉันคิดว่าอย่างน้อยที่สุดคุณจะต้องเปลี่ยนsting.formatเป็นstring.formatสองเท่า
Peter Taylor

@ PeterTaylor คุณไม่ชอบ Sting ใช่ไหม?
KeyWeeUsr

5
@KeyWeeUsr ฉันไม่มีอะไรกับเขาเป็นการส่วนตัวและจริง ๆ แล้วเขาช่วยจ่ายค่าเลี้ยงดูฉัน แต่ฉันคิดว่าห้องสมุดมาตรฐาน Lua อาจได้รับการออกแบบมาเพื่อการใช้งานทั่วไปโดยคนที่คุ้นเคยกับ API ที่คล้ายกันมากกว่าสำหรับแฟนตำรวจโดยเฉพาะ
Peter Taylor

1

C, 134 ไบต์

s[255];fd;char p[255]="s[255];fd;char p[255]=%c%s%c;main(){sprintf(s,p,34,p,34);creat(s,0);}";main(){sprintf(s,p,34,p,34);creat(s,0);}

แหล่งที่มาที่นี่มี*ดังนั้นจึงไม่เหมือนกับที่อนุญาตตามกฎ
มูลค่าหมึก

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