TryItOnquine Challenge


48

(ขึ้นอยู่กับโพสต์นี้และการสนทนาที่ตามมาในการแชท - ขอบคุณ Dennis for TIO!)

ความท้าทาย

เลือกภาษาที่ใช้ได้ในขณะนี้ในที่เว็บไซต์ TryItOnlineเช่นPowerShell เขียนรหัสในภาษานั้นในหน้านั้นซึ่งไม่ได้รับอินพุตใด ๆ เช่นเมื่อคลิกปุ่มRunผลลัพธ์ในหน้านั้นจะเหมือนกับที่อยู่ในฟิลด์ "URL ล้วน" เมื่อบันทึก / จัดเก็บคลิกปุ่มแทน

สำหรับตัวอย่างที่สมมติว่าสมมติว่าaaaเป็นรหัสสำหรับวิธีการแก้ไขปัญหานี้ใน PowerShell จากนั้นผลลัพธ์ของการคลิกเรียกใช้ด้วยaaaรหัสที่https://tio.run/#powershellควรส่งออกhttps://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAซึ่งเป็นฟิลด์ "URL ธรรมดา" เมื่อคลิกที่ปุ่มบันทึก / จัดเก็บ

เกณฑ์การให้คะแนน

URL ที่เป็นส่งของคุณความท้าทายนี้ ผู้ชนะคือ URL ที่สั้นที่สุดวัดเป็นไบต์ สำหรับตัวอย่างข้างต้น URL ที่https://tio.run/##K8gvTy0qzkjNyfn/PzEx8f9/AAเป็นการส่งต่อความท้าทายที่44 ไบต์ URL ที่สั้นที่สุดที่ตอบสนองความท้าทายที่เหลืออยู่นี้จะได้รับความท้าทายและได้รับคะแนนบราวนี่ (ไม่สามารถแลกคะแนนได้) เนื่องจากมีความยาวต่ำสุดที่เป็นไปได้ที่ชัดเจนหากการส่งสองครั้งเสมอกันการส่งก่อนหน้านี้จะชนะ

การสร้าง URL

นี่คือจุดเริ่มต้นของอัลกอริทึมการสร้าง URL ในที่เก็บ คุณสามารถดูวิธีการใช้พื้นที่รหัสหลักองค์ประกอบพิเศษใด ๆ ต่อท้ายสตริงจะกิ่วและการแปลง Base64 แล้วเสริม##ไว้ล่วงหน้า ฯลฯ ฉันจะไม่ลงรายละเอียดทั้งหมดที่นี่ ส่วนหนึ่งของความท้าทายคือการแยกวิเคราะห์และทำความเข้าใจวิธีสร้าง URL เพื่อใช้ประโยชน์จากองค์ประกอบที่เป็นไปได้ในอัลกอริทึมดังกล่าว

กฎ / ชี้แจง

  • รหัสจริงไม่ควรใช้อินพุตและสร้างเฉพาะ quine-URL เป็นเอาต์พุต
    - ซึ่งหมายความว่าช่องข้อความเท่านั้นที่ควรจะมีประชากรเมื่อคลิกเข้าสู่ URL ที่เป็นCode, Header, Footerหรือตรงกัน "คอมไพเลอร์ธง" เขต; InputและArgumentsสาขาที่เป็นสิ่งต้องห้ามและจะต้องยังคงว่างเปล่า / ไม่ได้ใช้ การคลิกปุ่มเรียกใช้ควรเปลี่ยนเฉพาะOutputฟิลด์ สำหรับความท้าทายDebugนี้ฟิลด์จะถูกละเว้นในทุกสถานการณ์
  • กฎควินินปกติใช้กับโค้ดเท่าที่เป็นไปได้ (ตัวอย่างเช่นโค้ดไม่สามารถอ่านซอร์สโค้ดของตัวเองผ่านทาง.code.tio)
  • โปรดระบุคำอธิบายวิธีการทำงานของรหัสในการส่งของคุณ
  • ส่ง quine "cheaty" โดยส่งคำร้องขอ Git pull ไปยังที่เก็บ TIO เพื่อสร้าง URL "หลอกลวง" หรือทางลัดหรือไม่อนุญาต
  • ในทำนองเดียวกันการส่งคำขอดึงเพื่ออัปเดตภาษาเฉพาะเพื่อสร้าง URL "หลอกลวง" ไม่ได้รับอนุญาต
  • โปรดทำดีกับเซิร์ฟเวอร์ของเดนนิสและอย่าละเมิดหรือพยายามหาช่องโหว่เพื่อความท้าทายนี้

14
โปรดจำไว้ว่ากฎสุดท้ายเป็นสิ่งสำคัญ! มีการโจมตี DDoS จำนวนมากที่เกิดขึ้น
Erik the Outgolfer

"PR" คืออะไร?
Adám

1
ตัวอย่างสมมติ: หากการส่งของฉันเป็นhttps://tio.run/##a+aลิงค์ไปยังโปรแกรมที่ส่งออกhttps://tio.run/##a+aจะใช้งานได้หรือไม่แม้จะเป็นการยากที่ลิงค์ที่สร้างขึ้นsaveStateจะได้รับhttps://tio.run/##a@a
TwiNight

1
@TwiNight เป็นคำถามที่ดี นั่นจะเป็นสถานการณ์ที่น่าสนใจ แต่จะไม่เข้ากับกฎที่นี่และดังนั้นจึงไม่ใช่การส่งที่ถูกต้อง
AdmBorkBork

1
คุณรอจนถึง TIOv2 เพื่อโพสต์สิ่งนี้หรือไม่?
mbomb007

คำตอบ:


15

Python 2ความยาว URL = 170 ไบต์

https://tio.run/##K6gsycjPM/r/v9hWqQDCjqlISwPhYlvVIuvM3IL8ohKFpMTiVDMT64KizLwS9YySkoJiK339ksx8vaLSPH1lZXVtiAK9JDOT1Lzk/JRUDY1iVdViTT0YT70qJzNJXVMz2shK1yRWE2aHEkUW4Db//38A
s="python2\xff\xffs=%r;import base64;print'https://tio.run/##'+base64.b64encode((s%%s).encode(('zlib'))[2:-4])\xff\xff";import base64;print'https://tio.run/##'+base64.b64encode((s%s).encode(('zlib'))[2:-4])

ลองออนไลน์!

เรื่องนี้ต้องอาศัยความบังเอิญสามประการ:

  1. เริ่มต้น zlib ระดับ 6 เกิดขึ้นเพื่อให้ผลลัพธ์เช่นเดียวกับ zlib ระดับ 9 สำหรับสายนี้โมดูโลส่วนหัวที่ฉันตัด
  2. ความยาวที่ถูกบีบอัดสามารถหารด้วย 3 ได้ดังนั้น base64 จะไม่สร้าง=อักขระการขยายใด ๆ
  3. เอาต์พุต base64 ไม่มี+อักขระใด ๆ

15

Bash , 174 166 165 157 bytes

https://tio.run/##S0oszvj/v6QosUBBV1dBvaAoM68kTSGjpKSg2EpfvyQzP0avqDRPX1lZRQMqp6RaHFORlgbCSgpJQO0KSgkg/QlKNelVmQU1JYmZOQq6ydqGhjVA2VQzEwXdckNjS011BdcIz5D//wE

สิ่งนี้เข้ารหัสโปรแกรม Bash ต่อไปนี้

trap -- 'printf https://tio\.run/##$(printf "%s\xff\xff" bash "`trap`"|gzip|tail -c+11|base64 -w139)' EXIT

ลองออนไลน์!

ขอบคุณ @ jimmy23013 สำหรับการเล่นกอล์ฟ 8 ไบต์จากวิธีการเดิมของฉันสำหรับวิธีการที่บันทึกไบต์อื่นและสำหรับการเล่นกอล์ฟอีก 8 ไบต์จากวิธีการนั้น!



1
@ jimmy23013 ฉันไม่สามารถนับจำนวนครั้งที่ฉันพิมพ์base64 | tr -d \\nลงในเทอร์มินัลของฉัน ... ขอบคุณ!
Dennis

tio.run/##S0oszvj/…น่าเสียดายที่มี + ที่ฉันไม่ทราบวิธีลบ
jimmy23013

@ jimmy23013 จัดการเพื่อกำจัดมัน แต่เสียค่าใช้จ่ายสามไบต์ น่ารำคาญtio.run/##S0oszvj/…กำจัด + นั้น แต่แนะนำอีกอันหนึ่งที่อื่น
Dennis

3
@ SteveBennett ฉันคิดว่าฉันมีเหตุผลที่ดี ฉันจำไม่ค่อยได้
Dennis

12

Pyth , ความยาว URL = 134 ไบต์

https://tio.run/##K6gsyfj/X68syy/ZS6lYmyujpKSg2EpfvyQzX6@oNE9fWZnLwae4OLrI3dA9NITLQZ9LM8vZxqSkRC@qOJqrAKiby9vZyNTUmwtiBpefl7e3ppnJ//8A

รหัส:

.vjNcJ"s+
https://tio.run/##
@Lss[rG1GUT
@/
)jC<4tt.Zs[
pyth
KC255K
.vjNcJ
NJKK)64

ลองออนไลน์!

ใช้ zlib builtin ( .Z) ของ Pyth และการใช้งานแบบอินไลน์ของ base64

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

เวทีด้านนอก:

.vjNcJ"…
      "…    take this 75-byte string
     J      assign it to J
    c       split on whitespace
  jN        join on N = '"'
.v          evaluate as Pyth code

ขั้นตอนภายในที่ได้รับโดยการแทนที่ช่องว่างในสตริงJด้วยเครื่องหมายคำพูดคู่:

s+"https://tio.run/##"@Lss[rG1GUT"@/")jC<4tt.Zs["pyth"KC255K".vjNcJ"NJKK)64
                                               [                             begin a list:
                                                "pyth"                         string,
                                                       C255                    character 255
                                                      K                        assign that to K,
                                                           K                   K again,
                                                            ".vjNcJ"           string,
                                                                    N          '"',
                                                                     J         J (the 75-byte string),
                                                                      K        K again,
                                                                       K       K again
                                                                        )    end list
                                              s  concatenate
                                            .Z   compress with zlib
                                           t     remove first character
                                          t      remove first character
                                        <4       remove last 4 characters
                                       C         convert from base 256
                                      j                                  64
                                                 convert to base 64 digits
                      @L                         map d ↦ the following indexed at d:
                          [                        begin a list:
                            G                        alphabet ("abcdefghijklmnopqrstuvwxyz")
                           r 1                       uppercase,
                              G                      alphabet again,
                               UT                    unary range of length T = 10: [0, …, 9],
                                 "@/"                string,
                                     )             end list
                         s                         concatenate
                        s                          concatenate (we now have the base64 alphabet)
 +"https://tio.run/##"                           prepend string
s                                                concatenate

(มันแย่เกินไปที่ฟิลด์“ อินพุต” ไม่ได้รับอนุญาตหรือฉันมีวิธีแก้ปัญหา 118 ไบต์ )


1
ไม่ ... คุณเพิ่งเอาชนะเดนนิสในความท้าทายที่สร้างขึ้นรอบ ๆ TIO‽
Engineer Toast

4

PowerShell ขนาด 274 ไบต์

https://tio.run/##TY/rCsIwDIVfZaiYFV2HooIbgu8xBrYzboXSljYq3p59VkHZjxAOJydf4uwVfehQ676fphO5e1TK8pPSWBfF1StCobW8EYYUJMyrphO@qmtw/xzMluv1t37maJoePpsm8sVGP5eV7V25JDslsozmgOJRHAcQ3t6BldARuVDkOcVBfzb5eAwRYM0FPcUQWSkCblaBvDJtPLxaLDmPnTf2bCjbsppxj06LBlPYwRxgoGdR74E9vw9mnQ2UZObF@v4N

ทุกอย่างต้องขอบคุณข้อมูลโค้ดต่อไปนี้:

&($b={[io.file]::writeallbytes('b',[char[]]'powershell'+255+255+[char[]]"&(`$b={$b})"+255+255);gzip -f b;$b=[io.file]::readallbytes('b.gz');'https://tio.run/##'+[convert]::tobase64string($b[12..($b.count-9)]).replace('=','').replace('+','@')|write-host -n})

ลองออนไลน์!


พระคริสต์คุณสามารถอธิบายวิธีที่คุณได้คำตอบนี้ได้อย่างไร ถ้าฉันได้ลองใน Java หรือบางสิ่งบางอย่างมันอาจเป็นการลองผิดลองถูก
Magic Octopus Urn

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