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
และคูณว่า
และเราทำเสร็จแล้ว!