Ouroboros Quine ในระดับ n


11

ouroboros quine 128 ภาษานี้ (โปรแกรมที่ส่งออกโปรแกรมในภาษาอื่นซึ่งส่งออกโปรแกรมในภาษาอื่น (125 ภาษาในภายหลัง) ซึ่งแสดงผลโปรแกรมต้นฉบับ) ค่อนข้างน่าประทับใจ แต่น่าเสียดายที่มันมีการวนซ้ำแบบคงที่

เขียนโปรแกรมที่แสดงผลโปรแกรม (ไม่จำเป็นต้องเป็นภาษาอื่น แต่สามารถเป็นได้) ซึ่งแสดงผลโปรแกรมซึ่งแสดงผลโปรแกรม ฯลฯ ซึ่งหลังจากทำซ้ำแล้ว n จะแสดงผลลัพธ์โปรแกรมต้นฉบับเป็นครั้งแรก (เช่นไม่มีสื่อกลาง โปรแกรมควรเหมือนกันกับต้นฉบับเพราะไม่เช่นนั้นควินที่ไม่สนใจอินพุตจะทำงานได้) โดยที่ n เป็นจำนวนเต็มที่ไม่เป็นลบที่จัดเตรียมให้เป็นอินพุต ข้อมูลที่ป้อนต้องไม่เป็นตัวเลขในซอร์สโค้ดต้นฉบับ (เช่นx = <the value of n>เริ่มต้นโปรแกรมของคุณ) ซึ่งควรเป็นหนึ่งในสิ่งต่อไปนี้:

  1. ส่งผ่านเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
  2. อ่านจากอินพุตมาตรฐาน
  3. ส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชันซึ่งส่งคืน / ส่งออกโปรแกรมใหม่

สำหรับสเตจกลางใน ouroboros โปรแกรมของคุณอาจเป็นโปรแกรมที่ทำงานได้อย่างสมบูรณ์หรือฟังก์ชั่นที่ไม่มีข้อโต้แย้งซึ่งเมื่อเรียกแล้วจะส่งคืน / ส่งออกในส่วนถัดไป

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

เพื่อความชัดเจนหากn = 0โปรแกรมควรส่งออกซอร์สโค้ดของตัวเอง

หากn = 1โปรแกรมควรแสดงผลเป็นโปรแกรมอื่นซึ่งจะแสดงรหัสต้นฉบับดั้งเดิม

และอื่น ๆ ...

ไบต์ที่น้อยที่สุดจะชนะ!

แก้ไข:

ฉันควรเขียนว่า "สำหรับสเตจกลางใน ouroboros โปรแกรมของคุณอาจเป็นโปรแกรมที่ทำงานได้อย่างสมบูรณ์โดยไม่มีอินพุตหรือฟังก์ชันที่ไม่มีอาร์กิวเมนต์" หากโปรแกรมของคุณส่งออกรายการถัดไปในกลุ่มจากนั้นรอการป้อนข้อมูลนั่นเป็นเรื่องปกติ แต่โปรแกรมของคุณไม่จำเป็นต้องมีค่าดั้งเดิมเท่ากับ n


ที่เกี่ยวข้อง , ที่เกี่ยวข้อง
Kevin Cruijssen

เราสามารถ 1 ดัชนี n ได้ไหม? ดังนั้น n = 1 หมายถึงซอร์สโค้ดการพิมพ์, n = 2 หมายถึงโค้ดการพิมพ์ซึ่งจะพิมพ์ซอร์สโค้ดเป็นต้น
ข้อมูลหมดอายุ

1
เวอร์ชันการทำซ้ำจะยังคงมีอินพุตเริ่มต้นหรือไม่ สมมุติว่าอินพุตแรกของฉันคือ 3 และฉันรันโปรแกรมที่มันส่งออก จะยังคงมีอินพุต 3 หรือไม่มีอินพุตเลยหรือไม่? หากไม่มีการป้อนข้อมูลฉันคิดว่าเราต้องจัดการกับสิ่งนั้นในกรณีที่getInput()มีการใช้งานบางอย่างโดยไม่มีการป้อนข้อมูลใด ๆ หรือเราสามารถขอพูดอะไรบางอย่างการป้อนข้อมูลแบบสุ่มที่ไม่ได้ใช้สำหรับการทำซ้ำในภายหลังเพื่อป้องกันข้อผิดพลาดสำหรับgetInput()? Aka เป็นคำตอบของ Python ที่ถูกต้องหรือไม่?
Kevin Cruijssen

ฉันสงสัยว่าสิ่งที่เราขอให้ทำคือให้จำนวนเต็มnออกโปรแกรมที่เป็น "โปรแกรมเริ่มต้น" ของการnวนซ้ำของ ouroboros และคำตอบของเราไม่ควรนับเป็นหนึ่งในการnทำซ้ำ ถูกต้องหรือไม่
Erik the Outgolfer

@KevinCruijssen ฉันน่าจะชัดเจนกว่านี้ ขั้นตอนกลางไม่สามารถป้อนข้อมูลในรูปแบบใด ๆ ฉันเดาว่าโปรแกรมเอาท์พุทหนึ่งถัดไปแล้วรอการป้อนข้อมูลที่จะดี
Leo Tenenbaum

คำตอบ:


5

05AB1E , 28 ไบต์

-4 ไบต์ + แก้ไขด้วย Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

ลองออนไลน์!


คำอธิบาย

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


dไม่เป็นลบ ( >=0) แทนค่าบวก ( >0) ปัญหาคือว่าการตรวจสอบdโดยไม่ต้อง popping มันคุณจะต้องทำซ้ำแรก แต่แล้วก็ยังจะต้องมีการทิ้งทวนมิฉะนั้นจะส่งออกซ้ำ0"quinsting" 0:(
Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ìสำหรับขนาด 28 ไบต์ (ซึ่งยังคงใกล้เคียงกับที่คุณต้องการ) (ฉันเกรงว่าเวอร์ชั่นปัจจุบันของคุณสำหรับ0"34çìD«s<Ddiì"34çìD«s<Ddiìผลการทำซ้ำ-1จากDuplicate .. )
Kevin Cruijssen

4

เวทมนตร์รูน 39 ไบต์

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

ลองออนไลน์!

จะเป็น4 ไบต์สั้นกว่า 05AB1E 10ใช้กลยุทธ์เดียวกันถ้าปัจจัยการผลิตที่น้อยกว่าหรือเท่ากับ แต่เนื่องจากเราต้องการสนับสนุนค่าที่มีขนาดใหญ่ตามอำเภอใจมันจึงซับซ้อนมากขึ้น

ค่าตัวเลขของได้รับอยู่ที่ด้านหน้าและแยกวิเคราะห์เป็นจำนวนอย่างต่อเนื่องโดยใช้ตัวอักษรn เป็นรหัสควินพื้นฐาน หากไม่มีค่าอยู่ด้านหน้าความยาวของสแต็กจะเท่ากับ 1 (ควินิน) มิฉะนั้น 2 ให้กำหนดวิธีจัดการกับสิ่งต่าง ๆ จากที่นั่น´"3X4+kSql1=d*?

  • หากมีค่าให้S:1-}'LA2+-}เรียกใช้: สลับค่าไปที่ด้านบนลบ 1 ทำซ้ำทิ้งสำเนาไว้ที่ด้านล่างของสแต็กรับ Log 10ของค่านั้นคูณ 100 (ส่งผลให้ความยาวอักขระของค่าบวก 1 สำหรับตัว´) ให้ลบอักขระจำนวนมากออกจากจุดสิ้นสุดของสตริง (ตัดส่วนท้ายออกอย่างมีประสิทธิภาพทั้งที่ไม่จำเป็นและเพราะมีค่าที่ไม่ถูกต้อง) Cสั้นกว่าหนึ่งไบต์2+และให้ผลลัพธ์ในค่าเดียวกัน

  • หากไม่มีค่าให้อ่านค่าจากอินพุต

คำนึงถึง: :0)2*?ทำซ้ำและเปรียบเทียบกับศูนย์

  • ´ถ้าไม่ใช่ศูนย์การผลักดัน

  • หากศูนย์ให้เติมค่า เราสามารถโกงการใช้!แทน2?และบันทึก byte ได้เพราะเมื่อ´พยายามที่จะประมวลผล byte แรกที่มันเห็นนั้นไม่ใช่ตัวเลขและจะออกจากโหมด number ทันทีในตำแหน่งเดียวกัน

พิมพ์ทั้งสแต็คจากบนลงล่าง


3

Java 10, 145 ไบต์

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

ลองมันออนไลน์และดูผลของการทำซ้ำบาง

คำอธิบาย:

คำอธิบาย :

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

ส่วนที่ท้าทาย:

ฟังก์ชัน lambda แรกรับlongอินพุตเป็นพารามิเตอร์

  • นี่เป็นตัวแปรLong N=n;ในการวนซ้ำครั้งแรก หรือในLong N=%s;การทำซ้ำต่อไป
  • การตรวจสอบแบบไตรภาคN>0?N-1+"L":"n"จะเติมสิ่งนี้%sด้วยค่าN-1ต่อท้ายLเนื่องจากมันยาวและจะแปลงเป็นสตริงสำหรับ%sถ้าNมีค่ามากกว่า 1 ถ้าNเป็น 0 แทน (อินพุตเริ่มแรกคือ0หรือนี่เป็นการทำซ้ำครั้งสุดท้ายของ interquine- ' loop ') มันจะเติมค่านี้%sด้วยค่าเริ่มต้นnแทน

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

@EmbodimentofIgnorance ฉันรู้ว่านั่นคือสิ่งที่ฉันมี ฟังก์ชั่นแลมบ์ดาครั้งแรกที่ใช้longฟังก์ชั่นพารามิเตอร์และฟังก์ชั่นแลมบ์ดาอื่น ๆ ใช้ไม่ได้ใช้Voidพารามิเตอร์ซึ่งผมก็มักจะใช้สำหรับความท้าทายที่ระบุจะใช้ใส่ไม่เพราะv->เป็น 1 ()->ไบต์สั้นกว่า
Kevin Cruijssen

2

Haskell , 195 164 bytes

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

ลองออนไลน์!

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




1

Perl 6 , 44 ไบต์

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

ลองออนไลน์!

รับอินพุตผ่านอินพุตมาตรฐานและส่งคืนโปรแกรมที่สิ่งเดียวที่เปลี่ยนแปลงคือหมายเลขแรก แต่ละโปรแกรมที่ตามมาจะส่งออกโปรแกรมเดียวกันยกเว้นด้วยจำนวนที่ลดลง


1

C # (Visual C # Interactive คอมไพเลอร์) , 112 ไบต์

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

บันทึกจำนวนมากแล้วต้องขอบคุณ @NickKennedy!

ลองออนไลน์!


เอาท์พุทกลางไม่ได้เป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่ใช้อาร์กิวเมนต์เดียว นอกจากนี้ฉันคิดว่าคุณมีบางอย่างnที่ควรจะlเป็น วิธีการเกี่ยวกับtio.run/##Sy7WTS7O/P@/…
Nick Kennedy

1

Python 3.8 (เผยแพร่ล่วงหน้า) , 60 56 55 53 ไบต์

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

ลองออนไลน์!

-2 ไบต์ขอบคุณ Jo King

ในฐานะของเวอร์ชัน 53 ไบต์ก็ใช้งานได้ใน Python 2 และ Python 3


ฟังก์ชั่นระดับกลางดูเหมือนจะไม่เป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นที่ไม่มีข้อโต้แย้ง
Nick Kennedy

ตัวดำเนินการวอลรัส:=นั้นเป็นส่วนเสริมของ Python อย่างแน่นอน
mbomb007

"สำหรับสเตจกลางใน ouroboros โปรแกรมของคุณอาจเป็นโปรแกรมที่ทำงานได้อย่างสมบูรณ์หรือฟังก์ชั่นที่ไม่มีข้อโต้แย้งซึ่งเมื่อเรียกแล้วจะส่งกลับ / ส่งออกชิ้นถัดไป"
mbomb007

@NickKennedy อัปเดตเพื่อให้สอดคล้องกับข้อมูลจำเพาะและบันทึกโดยบังเอิญ 4 ไบต์
ลบเจ็ด

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