APL (158 ตัวอักษร, คะแนน = 4)
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
ฉันใช้ Dyalog APL ที่นี่ จำนวนรอบสามารถเพิ่มขึ้นหนึ่งรอบด้วยการเพิ่ม0 (0 ตามด้วยช่องว่าง) ไปยังจุดสิ้นสุดของนิพจน์และต่อท้ายสตริง (ก่อนหน้า''') ความยาวรอบเป็นและความยาวของการแสดงออกคือ(# 0's) + 1 150 + 4*(cycle length))สมมติว่าเรายังคงเพิ่มศูนย์ตลอดไปคะแนนคือLimit[(150 + 4*n)/(n - 1), n -> Infinity] = 4ที่nมีความยาวรอบ
นี่คือตัวอย่างที่มีความยาววง = 6:
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0
0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0
0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0
0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0
0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0
0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0
0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0
0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1
0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 0 0 0 0
192 ตัวอักษร, คะแนน = 2
'''{2≠⍴⍺:¯3⌽(2×1+⍴⍺)⍴(1+⍴⍺)⍴⍺ ⋄ a←⊃2⌷⍺ ⋄ ⍵=0:¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a⋄(-4+⌊10⍟⊃⍺)⌽(2×1+⍴a)⍴(1+⍴a)⍴a}01'''{2≠⍴⍺:¯3⌽(2×1+⍴⍺)⍴(1+⍴⍺)⍴⍺⋄a←⊃2⌷⍺⋄⍵=0:¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a⋄(-4+⌊10⍟⊃⍺)⌽(2×1+⍴a)⍴(1+⍴a)⍴a}01
จุดหนึ่งของความล้มเหลวอาจเกิดขึ้นได้เมื่อจำนวนเต็มนำหน้ากับสตริงมีขนาดใหญ่เกินไป ในทางทฤษฎีเราสามารถเพิ่มวงรอบได้ด้วยการเพิ่มตัวละครสองตัวคือ - 1ที่ท้ายสตริง (ก่อน''') และ a 1ที่ท้ายบรรทัดทั้งหมด
200 ตัวอักษร, คะแนน = 1
'''{a←{2=⍴⍵:⊃2⌷⍵⋄⍵}⍺⋄(⍺{⍵=9:⍬⋄⍕1+{2=⍴⍵:10×⊃⍵⋄0}⍺}⍵),(¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a),⍺{⍵=9:(⍕9),⍕⊃⍺⋄⍕⌊⍵÷10}⍵}'''{a←{2=⍴⍵:⊃2⌷⍵⋄⍵}⍺⋄(⍺{⍵=9:⍬⋄⍕1+{2=⍴⍵:10×⊃⍵⋄0}⍺}⍵),(¯2⌽(2×1+⍴a)⍴(1+⍴a)⍴a),⍺{⍵=9:(⍕9),⍕⊃⍺⋄⍕⌊⍵÷10}⍵}91
การใช้ APL ของฉันไม่มีจำนวนเต็มความแม่นยำไม่ จำกัด โดยค่าเริ่มต้นดังนั้นจำนวนเต็มจะถูกแปลงเป็นทศนิยมเมื่อมันใหญ่เกินไปทำให้เอาท์พุทผิด ดังนั้นอันนี้เป็น finicky มากที่สุด แต่ในทางทฤษฎี (ด้วยมือหรือล่าม APL ที่แตกต่างกัน) ก็ควรจะมีคะแนน 1 เพียงแค่เพิ่ม1ไปยังจุดสิ้นสุดของการแสดงออกและคุณจะได้รอบอีก
ภาพรวม (ด้วยควินที่สั้นกว่า)
ฉันจะให้ภาพรวมของเวอร์ชันแรกเพราะฉันคิดว่าอาจเป็นวิธีที่เข้าใจง่ายที่สุด อย่างไรก็ตามก่อนที่จะจัดการกับเวอร์ชันนั้นเราจะพิจารณาquineอย่างง่ายใน APL :
1⌽22⍴11⍴'''1⌽22⍴11⍴'''
ฉันได้พบว่าหนึ่งในวิธีที่ดีที่สุดในการทำความเข้าใจกับนิพจน์ APL บางอย่างคือดูผลลัพธ์จากตัวดำเนินการ / ฟังก์ชันทั้งหมด โอเปอเรเตอร์และฟังก์ชั่นทั้งหมดใน APL มีความสัมพันธ์ทางขวาและมีความสำคัญเหมือนกันดังนั้นนี่คือจากขวาไปซ้าย:
'''1⌽22⍴11⍴''': นี่เป็นเพียงตัวอักษรสตริง (รายการอักขระ) ''เป็นวิธีของ APL ในการหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยว ผลลัพธ์: '1⌽22⍴11⍴'.
11⍴'''1⌽22⍴11⍴''': ที่นี่เราก่อร่างใหม่ ( ⍴) 11สตริงที่มีความยาว เนื่องจากความยาวของสตริงต่ำกว่า 11 จึงเป็นซ้ำ (เช่น5⍴'abc'จะให้ผลผลิต'abcab') ผลลัพธ์: '1⌽22⍴11⍴''. ดังนั้นตอนนี้เรามีเครื่องหมายคำพูดสองอันในตอนท้าย - เรากำลังหาที่อยู่!
22⍴11⍴'''1⌽22⍴11⍴''': 22ในทำนองเดียวกันตอนนี้เราก่อร่างการส่งออกก่อนหน้านี้ของเราที่จะมีความยาว ผลลัพธ์: '1⌽22⍴11⍴'''1⌽22⍴11⍴''. เราเกือบจะอยู่ที่นั่นแล้ว - เราแค่ต้องย้ายการอ้างอิงเดี่ยวครั้งแรกไปยังจุดสิ้นสุด
1⌽22⍴11⍴'''1⌽22⍴11⍴''': ที่นี่เราหมุน ( ⌽) 1รายการของตัวอักษรโดย นี่ย้ายอักขระตัวแรกของสตริงไปยังจุดสิ้นสุด เป็นอีกหนึ่งตัวอย่างผลตอบแทน2⌽'abcdef' 'cdefab'ผลลัพธ์: 1⌽22⍴11⍴'''1⌽22⍴11⍴'''.
ควินหมูหมุน
ควินสั้นนั้นเป็นพื้นฐานสำคัญสำหรับควินที่กำลังหมุนของเรา ทีนี้ด้วยความคิดนั้นลองมาดูเรื่องของเรา:
'''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0
{ ... }กำหนดฟังก์ชั่นที่ไม่มีชื่อซึ่งเป็นที่ที่เราจะทำงาน โปรดทราบว่าฟังก์ชั่นใน APL รับอาร์กิวเมนต์ด้านขวาแสดงโดย⍵และอาร์กิวเมนต์ตัวเลือกด้านซ้ายซึ่งแสดงด้วย⍺(think infix) เราต้องการที่จะเลี้ยงฟังก์ชั่นนี้ทั้งสตริงควินของเราและบางสิ่งบางอย่างเพื่อช่วยเราในการสร้างจำนวนรอบโดยพลการ เพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้นในตัวเรา (และใครก็ตามที่ต้องการเพิ่มรอบ) เราจะทำให้สตริง quine เป็นอาร์กิวเมนต์ด้านซ้าย อาร์กิวเมนต์ที่ถูกต้องคือที่ที่เราใส่รายการรอบของเรา รายการอย่างน้อย 2 รายการคั่นด้วยช่องว่างสร้างรายการดังนั้นในตัวอย่างนี้เรามีรายการ 2 องค์ประกอบซึ่งประกอบด้วย a 1และ a0และ
เราจะเห็นได้ว่าฟังก์ชั่นนี้ดูเหมือนกับควินินเมื่อก่อน เรามี...⌽...⍴...⍴...แบบฟอร์มเดียวกันจากก่อนหน้านี้ นั่นเป็นเรื่องดี - อย่างน้อยเราก็เข้าใจมาก! ลองเจาะลึกลงไปในจุดไข่ปลาเริ่มต้นด้วยทุกอย่างหลังสุด⍴: ⊃,/(~^/¨⍺=0)/⍺.
- ดังที่คุณเห็นโดยดูจากตัวอย่างข้างต้นเรานำหน้าสตริงด้วย 0 จากทางด้านขวาเพิ่มอีกหนึ่งรายการด้วยการวนซ้ำแต่ละครั้ง แต่ตอนนี้เราไม่สนใจพวกนั้น เราแค่ต้องการสตริง!
- ก่อนอื่นให้พิจารณาสิ่งที่อยู่ในวงเล็บ (พวกเขาจัดกลุ่มในภาษาอื่น ๆ ส่วนใหญ่โดยวิธี)
⍺=0ส่งคืนรายการในกรณีนี้ที่มีรูปร่างเหมือนกัน⍺โดยที่แต่ละองค์ประกอบใน⍺จะถูกแทนที่ด้วย a 1ถ้ามันเท่ากับ0และ0อื่น ๆ การดำเนินการนี้เกิดขึ้นซ้ำ ๆ ดังนั้นถ้าเรามีรายการของรายการของตัวละครแต่ละตัวจะถูกทดสอบกับ 0 และคุณจะได้รับกลับรายการของรายการของรายการค่าไบนารี
- ดังนั้นถ้า
⍺ประกอบด้วยเพียงสตริงของเราเราจะกลับรายการ 0 มิฉะนั้นอาร์กิวเมนต์ซ้ายของเรามี 0 นำหน้าบางส่วน (เช่น, 0 0 0 'quinestring') ดังนั้นจึงเป็นรายการที่ประกอบด้วย 0's และอีกรายการหนึ่งคือสตริงของเรา 1 1 1 <sub-list of zeros>จากนั้นผลผลิตของเราดูเหมือนว่า
^/¨⍺=0: เราใช้ฟังก์ชั่นที่ได้มา^/ซึ่งจะช่วยลด ( /) โดยใช้ตรรกะและ ( ^) ฟังก์ชั่นให้กับแต่ละ ( ¨) ⍺=0องค์ประกอบของ นี่คือการทำให้แบนย่อยรายการของศูนย์เพื่อให้เราสามารถพิจารณาสตริง quine เป็นค่าไบนารีหนึ่ง เมื่อพิจารณาจากตัวอย่างก่อนหน้านี้ผลลัพธ์จะเป็น1 1 1 0พิจารณาตัวอย่างก่อนหน้านี้การส่งออกจะเป็น
~: เราไม่ได้แต่ละค่าจากก่อนหน้านี้ (เช่นกลับมา0 0 0 1)
(~^/¨⍺=0)/⍺: สำหรับแต่ละองค์ประกอบใน⍺เราจะทำซ้ำ ( /) มันจำนวนครั้งที่กำหนดโดยองค์ประกอบที่สอดคล้องกันในอาร์กิวเมนต์ซ้าย สิ่งนี้จะกำจัด 0 ทั้งหมดทิ้งเราไว้กับสตริง quine ของเรา
⊃,/เป็นเอกสารที่จำเป็นบางอย่างเพื่อให้แน่ใจว่าเราได้รับรายชื่อตัวอักษรกลับคืนโดยการลดผลลัพธ์ด้วยฟังก์ชันการต่อข้อมูล ( ,) หากอินพุตนั้นเป็นรายการที่แบนอยู่แล้ว (เช่นอาร์กิวเมนต์ซ้ายของฟังก์ชันหลักของเราคือสตริงเท่านั้น) เราจะได้รับรายการ 1 องค์ประกอบที่มีรายการนั้น ในอีกกรณีหนึ่งเมื่อเรามีรายการที่ประกอบด้วยรายการย่อยสำหรับสตริงเราได้รับสิ่งเดียวกันกลับ (รายการที่มีรายการย่อย) จากนั้นเราจะแกะสิ่งนี้ ( ⊃) โดยให้องค์ประกอบแรกของรายการเท่านั้น (เช่นรายการย่อยของอักขระ) สิ่งนี้อาจดูเหมือนไม่จำเป็น แต่อย่างอื่นเราจะพยายามปรับแต่งรายการ 1 องค์ประกอบ!
ต่อไปเราจะดูความยาวที่กำหนดสำหรับการปรับรูปร่างครั้งแรกภายในวงเล็บ:
⍺,⍵: เราต่ออาร์กิวเมนต์ที่เหมาะสมเข้ากับอาร์กิวเมนต์แรก
⊃,/⍺,⍵: เหมือนก่อน - ปรับรายการให้เรียบ
+/0=⊃,/⍺,⍵: เพิ่มจำนวนศูนย์ในรายการโดยการลด ( /) โดยใช้การเพิ่ม (+ฟังก์ชั่น )
2×+/0=⊃,/⍺,⍵: คูณตัวเลขนั้นด้วยสอง
z←2×+/0=⊃,/⍺,⍵: กำหนด ( ←) zผลให้ตัวแปร เพื่อสรุปzตอนนี้คือจำนวนศูนย์สองเท่าที่พบในทั้งอาร์กิวเมนต์ซ้ายและขวา
77+z←2×+/0=⊃,/⍺,⍵: จากนั้นเราเพิ่ม77สำหรับอักขระในสตริง quine โดยละเว้นทุกอย่างหลังจากเว้นวรรคตาม1สำหรับตัวละครในสตริงควินที่ไม่สนใจทุกอย่างหลังจากพื้นที่ดังต่อไปนี้เช่นเดียวกับในตัวอย่าง quine เริ่มต้นเราบวก 1 เข้ากับความยาวของสตริงเพื่อรับเครื่องหมายคำพูดเดี่ยวอีกอัน
- ผลลัพธ์ของการปรับรูปร่างนี้ในตัวอย่างนี้คือ:
'{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 ''
อาร์กิวเมนต์ของการปรับรูปร่างที่ตามมานั้นเป็นเรื่องง่ายและสะท้อนให้เห็นถึงควายสั้น ๆ (2 เท่าของความยาวสำหรับการปรับรูปร่างครั้งแรก) ผลลัพธ์ของเราตอนนี้คือ:
'{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 '''{(((3+z)×^/⍵)-5+2×+/+/¨⍺=0)⌽(2×77+z)⍴(77+z←2×+/0=⊃,/⍺,⍵)⍴⊃,/(~^/¨⍺=0)/⍺}1 0 ''
ตอนนี้สำหรับขั้นตอนสุดท้ายที่เราคำนวณจำนวนการหมุนสตริงผลลัพธ์:
- ดังที่คุณสามารถดูได้โดยดูที่ผลลัพธ์ก่อนหน้าเราต้องการหมุนกลับ (จำนวนลบ) เพื่อนำราคา 2 สุดท้ายไปยังจุดเริ่มต้น เพราะเราต้องการ
0 (และช่องว่างอื่น) เพื่อย้ายไปยังจุดเริ่มต้นด้วยเราต้องการหมุนกลับไปอีก 3 ตัวอักษร
+/+/¨⍺=0: เพิ่มจำนวนศูนย์ในอาร์กิวเมนต์ซ้าย รายการแรก (จากขวา) +/¨สรุปจำนวนองค์ประกอบของแต่ละรายการ (เช่นรายการย่อยหรือเพียงจำนวนเต็ม) และรายการที่สอง+/ให้ผลรวมของรายการผลลัพธ์นั้น
5+2×+/+/¨⍺=0: คูณสอง (เพื่อหมุนช่องว่างเช่นกัน) และเพิ่ม 5 (ผลลัพธ์ที่เราเคยได้รับมาก่อน)
- ตอนนี้เราลบค่าก่อนหน้าจากอาร์กิวเมนต์ซ้ายไปที่
-เพื่อจัดการกับกรณีเมื่อเรากดจุดสิ้นสุดของวงจร:
(3+z)×^/⍵และทุกองค์ประกอบในการร่วมกันโต้แย้งสิทธิที่จะดูว่าเราได้ถึงจุดสิ้นสุดของเรา ( 1) 3+zและคูณว่า
และเราทำเสร็จแล้ว!