ใบเสนอราคาที่ปลอดภัย


17

งานของคุณง่ายมาก: เขียนโปรแกรม (หรือฟังก์ชั่น) ที่ไม่มีอินพุตและเอาต์พุต (หรือส่งคืน) ซอร์สโค้ดของมัน สิ่งที่จับได้คือเมื่อโปรแกรมถูกห่อ"quotes"(อักขระ Unicode 34) มันควรจะส่งออกซอร์สโค้ด (ตอนนี้อ้างถึง) อีกครั้ง

ใช้กฎมาตรฐานสำหรับควิน นี่คือดังนั้นโปรแกรมที่สั้นที่สุด (เป็นไบต์) จะชนะ


8
@ ATaco คิดอย่างสร้างสรรค์ ปกติรหัสในเครื่องหมายคำพูดจะไม่ได้รับการดำเนินการ แต่เมื่อโปรแกรมทั้งหมดล้อมรอบด้วยเครื่องหมายคำพูดจะมีการดำเนินการส่วน
Pavel

1
อืมจุดดี
ATaco

สิ่งนี้อาจทำงานร่วมกับ BF ในการใช้งานที่สนับสนุน!...
ผลไม้ที่แยกออกมา

1
คุณต้องใช้"? บางภาษารองรับอักขระเครื่องหมายคำพูดสองหรือสามตัว
Neil

1
@tkellehe Meta: สิ่งที่นับว่าเป็นควินที่เหมาะสม? เท่าที่ฉันเข้าใจ 1 qute ของคุณ quine มันละเมิดข้อกำหนดรหัส / ข้อมูลที่กำหนดในโพสต์โหวตสูงสุด
Laikoni

คำตอบ:


4

Noodel , 9 7 ไบต์

รุ่นนี้ใช้งานได้เหมือนกับที่อื่น ๆ เพียงแค่ฉันลืมว่าNoodelมีวิธีเรียกใช้บล็อกโค้ดหนึ่งครั้งและฉันสร้างภาษาขึ้นมา ...

Ḷ1ḥ-Ð1ḥ@€

ḷḥ-Ðḥ@ḅ

ลองมัน:)


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

ḷḥ-Ðḥ@ḅ # Single statement that builds itself as a string.
ḷ       # Loop the following block of code unconditionally.
 ḥ-     # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
   Ð    # Push the stack as an array to stdout (since is an array it is done by reference).
    ḥ@  # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
      ḅ # Break out of the given loop. (The stack is now ["ḷ", "ḥ-Ðḥ@ḅ"]).

        # The top of the stack is popped off and displayed which modifies the array to produce {["ḷ"], "ḥ-Ðḥ@ḅ"} in stdout.

อ้างความปลอดภัย

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

"ḷḥ-Ðḥ@ḅ"

"         # Pushes on the string literal "\"" onto the stack.

 ḷḥ-Ðḥ@ḅ  # Same execution as before, simply builds the Quine for this loop.
 ḷ        # Loop the following block of code unconditionally.
  ḥ-      # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
    Ð     # Push the stack as an array to stdout (since is an array it is done by reference).
     ḥ@   # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
       ḅ  # Break out of the given loop. (The stack is now ["\"", "ḷ", "ḥ-Ðḥ@ḅ"]).

        " # Pushes on the string literal "\"" onto the stack.

          # The top of the stack is popped off and displayed which modifies the array to produce {["\"", "ḷ", "ḥ-Ðḥ@ḅ"], "\""} in stdout.

"ลองมัน:)"


เกร็ดเล็กเกร็ดน้อย

<div id="noodel" code='ḷḥ-Ðḥ@ḅ' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


<div id="noodel" code='"ḷḥ-Ðḥ@ḅ"' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


ฉันไม่คิดว่าการใช้eนั้นถูกต้อง คำถามที่ไม่ได้ขอตัวละครเข้ารหัสเป็นไบต์ 34 แต่สำหรับอักขระ Unicode 34. เรื่องการเข้ารหัสที่คุณใช้มีเพียงหนึ่ง:"
เดนนิส

@Dennis ฉันคาดเดาสิ่งที่คุณพูดคือการอ้างอิงถึงอักขระ Unicode 34 เพียงเพื่อให้แน่ใจว่าทุกคนใช้เหมือนกัน"หรือไม่ (ขออภัยแค่พยายามทำให้แน่ใจว่าฉันเข้าใจสิ่งที่คุณพูด) นอกจากนี้ฉันควรลบข้อความทั้งหมดในคำตอบที่อ้างถึงการใช้งานeหรือไม่
tkellehe

1
ใช่มีการเข้ารหัสนับพัน แต่มีชุดอักขระ Unicode เพียงชุดเดียว เนื่องจากผลงานที่ผมต้องการเพียงแค่ลบการอภิปรายและการใช้งานเพียงแค่" "
Dennis

11

Python 2 3, 181 152 130 124 122 ไบต์

""" """>" "or exec("oct=0");p='"""" """>" "or exec("oct=0");p=%r;a=oct==0;print(p[a:~a]%%p)#".';a=oct==0;print(p[a:~a]%p)#

ลองออนไลน์! TIO มาพร้อมกับส่วนหัวและส่วนท้ายที่ทดสอบความถูกต้องของควายโดยอัตโนมัติ คุณสามารถล้างพวกมันออกไปเพื่อควินิน

รหัสนี้ทำงานโดยใช้สตริงที่มีการเสนอราคาสามใน Python """ """เท่ากับ' 'และจะมีค่าเท่ากับ"""" """'" '

รหัสนี้ใช้execแต่ไม่ใช่สำหรับวิธี "ที่ไม่ใช่ quiney" ในการดำเนินการข้อมูลเป็นรหัสเพียงแค่การตั้งค่าตัวแปรจากภายในนิพจน์ execมีการเข้ารหัสอย่างถูกต้องในข้อมูลที่มากเกินไป

คำสั่งแรกเปรียบเทียบสตริงอาจเป็นไปได้ว่ามีการอ้างอิงคำพูดถึง" "และตั้งค่าตัวแปรให้octสอดคล้องกัน (ตัวแปรอาจเป็นตัวย่อในตัวก็ได้)

ส่วนที่เหลือของรหัสนั้นใช้ Python Quine ดั้งเดิมโดยใช้%rการจัดรูปแบบสตริงโดยมีรหัสเพิ่มเติมบางอย่างที่ตัดราคาพิเศษถ้าoctไม่เปลี่ยนแปลง

รุ่นอื่นที่ใช้ "cheaty" execมีขนาด 126 ไบต์โดยมีรหัสซ้ำน้อยกว่า:

""" """>" "and exec("oct=0");s='"""" """>" "and exec("oct=0");s=%r;p=%r;exec(p)#".';p='a=oct!=0;print(s[a:~a]%(s,p))';exec(p)#

ลองออนไลน์!


7

StandardML , 182 176 108 bytes

";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))

เวอร์ชันที่ไม่ได้อ้างอิง: ลองใช้บน codingground
รุ่นที่ยกมา: ลองใน codingground

โปรดทราบว่าผลลัพธ์มีลักษณะเช่นนี้

> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit

เพราะรหัสถูกตีความประกาศโดยการประกาศ (แต่ละ;ปลายประกาศ) และแสดงค่าและประเภทของการประกาศแต่ละ


พื้นหลัง

ใน SML มีรูปแบบ quine <code>"<code in quotes>":

str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))" 

และหนึ่งในรูปแบบ"<code in quotes>"<code>:

";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)

ทั้งสองต้องพึ่งพาความจริงที่ว่า<code>-part มีคำพูดใด ๆ ดังนั้นจึงสามารถอ้างที่มีออกมาความจำเป็นในการหลบหนีอะไรที่จำเป็นในการส่งออกควินจะได้รับโดย"str(chr 34)

พวกเขายังต้องพึ่งพาตัวบ่งชี้นัยitซึ่งใช้เมื่อไม่มีตัวระบุที่ชัดเจนในการประกาศ

ในควินแรกstr(chr 34);ผูกitกับสตริงที่มี", fn x=>เริ่มต้นการทำงานที่ไม่ระบุชื่อการหนึ่งโต้แย้งxแล้ว concatenates x^it^x^itและพิมพ์สตริงที่เกิด ฟังก์ชั่นนี้ไม่ระบุชื่อถูกนำมาใช้โดยตรงกับสตริงที่มีรหัสโปรแกรมเพื่อการ concatenation อัตราผลตอบแทนx^it^x^it<code>"<code>"

ที่สองควินเริ่มต้นที่มีเพียงแค่รหัสโปรแกรมเป็นสตริงที่ถูกผูกไว้กับ";str(chr 34)^it;print(it^it)"; itจากนั้นstr(chr 34)^it;เชื่อมใบเสนอราคาจะเริ่มต้นของสตริงและเป็นอีกครั้งระบุไม่ชัดเจนจะได้รับสตริงส่งผลให้ถูกผูกไว้กับ"<code> itในที่สุดprint(it^it)concatenates สตริงด้วยตัวเองยอม"<code>"<code>ซึ่งพิมพ์แล้ว


คำอธิบาย

แก้ไข:ไม่ทันสมัยกับรุ่น 108 ไบต์ แต่อาจเข้าใจได้หลังจากอ่านคำอธิบายนี้แล้ว

"<code>"<code>อ้างปลอดภัยรวมทั้งควินของวิธีการข้างต้นและเป็นตัวเองของแบบฟอร์ม การใส่สิ่งนี้ลงไปอีกครั้งในเครื่องหมายคำพูดทำให้""<code>"<code>"เราได้สตริงที่ว่างแล้วจึงเป็นแบบฟอร์มอื่น

นั่นหมายความว่าโปรแกรมนั้นจะได้รับแหล่งที่มาของตัวเองในรูปแบบ"<code>โดยตัวระบุitหรือitเป็นเพียง"และเราจะได้รับแหล่งที่มาของเรา<code>เป็นข้อโต้แย้งและจะต้องเป็นฟังก์ชั่นที่จัดการข้อโต้แย้งดังกล่าว

(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))

ในการระบุในกรณีที่เราเป็นเราตรวจสอบว่าขนาดของitมีขนาดใหญ่กว่า 1 ถ้าไม่itเป็น"และเราอยู่ในกรณีที่สองดังนั้นelseส่วนที่ส่งกลับฟังก์ชั่นที่ไม่ระบุชื่อfn x=>print(it^it^x^it^x^it)ซึ่งถูกเรียกเพราะมันตามมาด้วยสตริง . สังเกตส่วนนำit^it^ที่จำเป็นสำหรับสตริงว่างตอนเริ่มต้นของโปรแกรม

หากsize itมีขนาดใหญ่กว่า 1 เราอยู่ในthenส่วนและเพียงดำเนินการprint(it^it)ใช่ไหม? ไม่มากนักเพราะฉันละเลยที่จะบอกคุณว่า SML พิมพ์อย่างรุนแรงซึ่งหมายความว่าเงื่อนไขif <cond> then <exp_1> else <exp_2>ต้องมีประเภทเดียวกันเสมอซึ่งหมายความว่าการแสดงออก<exp_1>และ<exp_2>จำเป็นต้องมีประเภทเดียวกันเสมอ เรารู้อยู่แล้วว่าประเภทของelseส่วน: ฟังก์ชั่นที่ไม่ระบุชื่อซึ่งจะใช้เวลาสตริงแล้วเรียกprintมีประเภทstring -> <return type of print>และprintมีประเภทstring -> unit( unitอยู่ในวิธีการบางอย่างที่คล้ายกับvoidในภาษาอื่น ๆ ) string -> unitดังนั้นชนิดที่เกิดขึ้นอีกครั้ง

ดังนั้นถ้าthenส่วนนั้นเป็นเพียงแค่print(it^it)ที่มีประเภทunitเราจะได้รับข้อผิดพลาดประเภทไม่ตรงกัน แล้วไงfn _=>print(it^it)ล่ะ ( _เป็นตัวแทนสำหรับอาร์กิวเมนต์ที่ไม่ได้ใช้) ฟังก์ชั่นที่ไม่ระบุตัวตนนี้มีประเภท'a -> unitที่'aยืนสำหรับประเภทใด ๆ ดังนั้นในบริบทของเงื่อนไขของเราซึ่งบังคับใช้string -> unitประเภทนี้จะทำงาน (ตัวแปรประเภท'aรับอินสแตนซ์กับประเภทstring) อย่างไรก็ตามในกรณีนี้เราจะไม่พิมพ์อะไรเลยเพราะฟังก์ชั่นที่ไม่ระบุชื่อจะไม่ถูกเรียก! จำไว้ว่าเมื่อเราเข้าไปในthenส่วนของรหัสโดยรวมคือ"<code>"<code>ดังนั้น<code>ส่วนที่ประเมินถึงฟังก์ชั่น แต่เนื่องจากไม่มีอะไรเกิดขึ้นหลังจากนั้นมันไม่ได้ถูกเรียก

แต่เราใช้ sequentialisation ซึ่งมีแบบฟอร์ม(<exp_1>; ...; <exp_n>)ที่<exp_1>จะ<exp_n-1>อาจจะมีประเภทโดยพลการและประเภทของการ<exp_n>ให้บริการประเภทของ sequentialisation ทั้ง จากมุมมองการทำงานค่าของ<exp_1>ถึง<exp_n-1>ถูกยกเลิกอย่างง่าย ๆ อย่างไรก็ตาม SML ยังสนับสนุนโครงสร้างที่จำเป็นเพื่อให้การแสดงออกอาจมีผลข้างเคียง ในระยะสั้นเราทำ(print(it^it);print)หน้าที่เป็นthenส่วนที่ดังนั้นการพิมพ์ครั้งแรกแล้วกลับมาฟังก์ชั่นprintที่มีประเภทที่ถูกต้อง


7

V , 27 , 23 ไบต์

éPñi"éP241"qpá"lxx|xÿ

ลองออนไลน์!

เนื่องจากสิ่งนี้มีอักขระที่ไม่สามารถพิมพ์ได้บางส่วนนี่เป็นเวอร์ชันที่สามารถอ่านได้:

éPñi"éP<C-v>241<esc>"qpá"lxx|xÿ

และนี่คือ hexdump:

00000000: e950 f169 22e9 5016 3234 311b 2271 70e1  .P.i".P.241."qp.
00000010: 226c 7878 7c78 ff                        "lxx|x.

ดังนั้นสิ่งแรกที่เราต้องทำคือการตรวจสอบว่าตัวละครตัวแรกเป็นคำพูด éPแทรกอักขระ 'P' แต่"éPเป็น NOOP หลังจากนั้นเรารันการแก้ไขเล็กน้อยบนควินมาตรฐานที่ขยายได้ซึ่งก็คือ:

ñi<C-v>241<esc>"qpÿ

เราจะทำมันต่างออกไปเล็กน้อย ก่อนอื่นเราต้องแทรกข้อความ "éP" เริ่มต้น ดังนั้นเราทำ

ñ                        " Start recording into register 'q'
 i                       " Enter insert mode
  "éP<C-v>241<esc>       " Enter the following text: '"éPñ'
                  "qp    " Paste the text in register 'q'
                     á"  " Append a '"'

นี่คือสิ่งที่เกิดการแตกแขนง ข้อความในบัฟเฟอร์ปัจจุบันคือ

"éPñi"éP<C-v>241<esc>"qpá"P
Cursor is here ----------^

นอกจากว่าเราจะใส่ไว้ในเครื่องหมายคำพูดในกรณีนั้นจะไม่มีการแทรก 'P' และบัฟเฟอร์คือ:

"éPñi"éP<C-v>241<esc>"qpá"
Cursor is here ----------^

เนื่องจากเรายังคงบันทึกเราสามารถทำสิ่งที่เราต้องการที่นี่และมันจะถูกเพิ่มลงในบัฟเฟอร์เมื่อ"qpเกิดขึ้น ดังนั้นจากที่นี่มันง่ายที่จะลบเครื่องหมายคำพูดแบบมีเงื่อนไข:

l           " Move one character to the right. If there is no character to the right, 
            " then this is effectively a "break" statement, stopping playback of the recording
 xx         " Delete two characters (the '"P')
   |        " Move to the first character on this line
    x       " Delete one character
     ÿ      " End the program

3

JavaScript (ES6), 239 237 ไบต์

Set=``;eval(";a='Set=``;eval(~;a=1;S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);~)';S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);")

ใช้ความระมัดระวังในการลองใช้แต่ละเวอร์ชันในสภาพแวดล้อมใหม่ (เช่นแท็บเบราว์เซอร์ใหม่)

ต้องมีอย่างน้อยหนึ่งวิธีในการทำให้สิ่งนี้ง่ายขึ้น ...


1
ฉันคิดว่าคุณสามารถใช้อาร์เรย์สำหรับการแทนที่เช่น: [x = "replace"] อาจจะทำสิ่งต่าง ๆ ได้ฉันไม่ค่อยมีประสบการณ์กับควินิน ...
ลูกา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.