สร้างควินที่หมุน


26

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

print ")import sys; sys.stdout.write("

มันสามารถหมุนได้ในรูปแบบ

import sys; sys.stdout.write("print ")

ซึ่งเป็นโปรแกรมไพ ธ อนที่ถูกต้อง

ความท้าทายของคุณคือการเขียนโปรแกรมที่ส่งออกการหมุนของตัวเองซึ่งเมื่อทำงานจะส่งออกโปรแกรมเดิม คะแนนโบนัสสำหรับการเข้าร่วมใด ๆ ที่มีความยาววงมากกว่าสอง

นี่คือรหัสกอล์ฟการให้คะแนนที่แน่นอนจะเป็น: (ความยาวของรหัส) / (ความยาวรอบ - 1)

แก้ไข: เรามีผู้ชนะ (เว้นแต่มีคนอื่นสามารถเอาชนะคะแนน 4)! ฉันยังสนใจที่จะดูโซลูชันอื่น ๆ ไม่ว่าพวกเขาจะเข้าชิงหรือไม่ก็ตาม


2
ดี! คุณได้ยกเว้นการต่อข้อมูลราคาถูกด้วยการถ่วงน้ำหนัก (ความยาวรอบที่ 1) ของคุณ
Boothby

3
ลองทำสิ่งนี้ในBefungeด้วยการหมุนตัวอักษร
หอยทากเครื่องกล

การใช้ไก่และไข่ก็เป็นสิ่งที่ดีเช่นกัน
meawoppl

คำตอบ:


21

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'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และคูณว่า

และเราทำเสร็จแล้ว!


ว้าวเจ๋งมากฉันไม่ได้คาดหวังอะไรแบบนี้เมื่อฉันเขียนคำถามดั้งเดิม! ฉันไม่ได้พูด APL เลยมีโอกาสที่คุณจะให้ภาพรวมของการทำงานนี้หรือไม่?
Gordon Bailey

แน่นอน! ฉันมีรุ่นเพิ่มเติมอีกสองสามรายการที่จะโพสต์ (ด้วยคะแนนที่ต่ำกว่าตามหลักทฤษฏี) ดังนั้นฉันจะเพิ่มภาพรวมของวันพรุ่งนี้
Dillon Cower

ขอบคุณมากสำหรับเอกสารที่ละเอียดมากของคุณคุณกำลังใช้ลูกเล่นบางอย่างที่นี่ ฉันชอบการใช้โอเปอเรเตอร์ (?) โดยเฉพาะอย่างยิ่ง ฉันคิดว่าฉันจะต้องอ่านเรื่องทั้งหมดสองสามครั้งก่อนที่ฉันจะย่อยมันให้เต็มที่!
Gordon Bailey

13

GolfScript, 10046/9999 ≈ 1.0047 (คะแนนซีสโมติก 1)

ตกลงฉันจะลองและเอาชนะรายการ APL ของ DCด้วย:

{\''+.,{(;\'.~1'}{'1'9999*@'.~']puts:puts}if}.~

รหัสข้างต้นไม่ใช่ quine จริง - ฉันรู้สึกว่าการโพสต์ซับขนาด 10kB จะไม่ใช่ความคิดที่ดีมาก แต่การเรียกใช้โค้ดข้างต้นจะสร้างโปรแกรม GolfScript 1,046 ตัวจริงซึ่งเมื่อทำซ้ำตามที่ระบุในคำถามจะสร้างการหมุนรอบตัวเอง 9999 ครั้งและในที่สุดก็กลับมาอีกครั้ง

ความยาวของวงจร (และโปรแกรม) 9999สามารถปรับได้โดยการเปลี่ยนแปลงอย่างต่อเนื่อง เพื่อความกระชับและความสะดวกสบายที่ฉันจะแสดงสิ่งที่มีลักษณะการส่งออกซ้ำชอบถ้าคงที่จะลดลงไป9:

111111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~
11111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1
1111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11
111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111
11111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1111
1111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11111
111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111111
11{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1111111
1{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11111111
{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111111111
111111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~
11111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~1
1111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~11
111111{\''+.,{(;\'.~1'}{'1'9*@'.~']puts:puts}if}.~111
etc.

เมื่อค่าคงที่9999เพิ่มขึ้นอัตราส่วนของความยาวของโปรแกรมและความยาวของวงจร (ลบหนึ่ง) มีแนวโน้มที่จะเป็นหนึ่ง ฉันค่อนข้างมั่นใจว่าวิธีนี้จะไม่สามารถเอาชนะได้อย่างน้อยก็ไม่แสดงอาการ ;-)

มันทำงานยังไง?

GolfScript เป็นภาษาสวยง่ายที่จะเขียนใน quines ตั้งแต่พื้นใด ๆ ที่แท้จริงจำนวนทำหน้าที่เป็นควิน A: ตัวอย่างเช่นโปรแกรม GolfScript 12345เอาท์พุท - คุณ guessed มัน 12345- นอกจากนี้การเชื่อมหลาย quines โดยทั่วไปจะสร้างควินิน ดังนั้นฉันสามารถใช้ตัวเลขอย่างง่ายเช่น11111...111เดียวกับส่วนซ้ำ ๆ ของควินหารอบของฉัน

อย่างไรก็ตามเพื่อให้ควินหารอบจริงเราต้องดำเนินการและดำเนินการ "payload" ที่ไม่สำคัญ GolfScript ที่ง่ายที่สุดที่ฉันคิดได้ว่าทำได้ดังนี้:

{PAYLOAD'.~'}.~

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

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

อย่างไรก็ตามจะกลายเป็นวิธีที่ไม่มีเอกสาร (AFAIK) เพื่อหลีกเลี่ยงสิ่งนั้น: ล่ามจริง ๆ แล้วเรียกฟังก์ชันที่กำหนดไว้ล่วงหน้าputsเพื่อทำการพิมพ์ดังนั้นการนิยามใหม่ของฟังก์ชั่นนั้นเมื่อไม่ใช้งานจะหยุดเอาต์พุตอัตโนมัติ แน่นอนนี่หมายความว่าเราต้องเรียกputsตัวเองก่อนว่าพิมพ์ส่วนของสแต็คที่เราต้องการพิมพ์

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


ดูเหมือนว่าจะทำงานให้ฉันโดยไม่ต้องputs{}:putsแม้ว่าฉันจะได้เห็นการโต้เถียงเพราะ{print}:putsบรรทัดใหม่ในการส่งออกจะหมายความว่ามันไม่ได้ขี่จักรยานอย่างเคร่งครัด
Peter Taylor

@Peter: ]puts{}:putsเป็นสิ่งที่จำเป็นสำหรับการปิดล้อมจาก{STUFF}.~111111111ไปยัง111111111{STUFF}.~มิฉะนั้นจำนวนของ1s ในตอนท้ายของโปรแกรมเพียงแค่การเติบโตและการเติบโต ( {}ดูเหมือนจะไม่จำเป็น แต่เห็นได้ชัดว่าล่าม GolfScript ช่วยให้การมอบหมายจากกองที่ว่างเปล่า)
Ilmari Karonen

ดีมากแม้ว่าดูเหมือนว่า DC จะโพสต์วิธีแก้ปัญหาด้วยคะแนนแบบซีมโทติค 1 ดังนั้นเราอาจมีเน็คไท
Gordon Bailey

-3

HTML, ลบอนันต์ (เกือบ)

-2

AA

-10

AAAAAAAAAA

และอื่น ๆ ... หากมีคนบอกว่ามันเป็นการโกงเราสามารถโต้เถียงเกี่ยวกับมัน แต่ฉันได้พบช่องโหว่ในคำถาม :)

ดังนั้นฉันเดาว่าทุกคนเข้าใจว่าโค้ดนั้นไม่มีลูปดังนั้นลูปที่ยาวที่สุดคือ0และเมื่อพิจารณาความยาวของโปรแกรมnคะแนนคือn / (0 - 1)หรือ-nฉันสามารถเขียนโปรแกรมที่มีnจำนวนเต็มบวกขนาดใหญ่ แต่ไม่มีประโยชน์เพราะทุกคนเข้าใจมัน


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