เขียนตัวนับไบนารีในควิน


10

เขียนโค้ดสองส่วนซึ่งเราจะเรียก s_zero และ s_one

โปรแกรม (l, n) ประกอบด้วยสำเนา l ของ s_zero และ s_one ที่สอดคล้องกับตัวเลขของ n ในรูปแบบเลขฐานสองที่มี s_zero ทางด้านซ้าย

ตัวอย่างเช่นถ้า s_zero = fooและ s_one = barดังนั้น
Program (4, 0) = foofoofoofoo
Program (4, 1) = foofoofoobar
Program (4, 2) = foofoobarfoo
เป็นต้น

โปรแกรม (l, n) จะต้องพิมพ์แหล่งที่มาของโปรแกรม (l, (n + 1) mod (2 ^ l)) ให้เป็นมาตรฐาน ในตัวอย่างข้างต้นfoobarfoofooจะต้องพิมพ์foobarfoobarเมื่อดำเนินการ

คะแนนของคุณคือผลรวมของความยาวของชิ้นส่วน s_zero และ s_one


ใกล้ซ้ำกับcodegolf.stackexchange.com/questions/35974/… - การคำนวณกระทำโดยโปรแกรม quining พร้อมด้วยรหัสบล็อก 2 แบบ
feersum

โปรแกรมสามารถอ่านซอร์สโค้ดของตัวเองได้หรือไม่?
Doorknob

2
@feersum ฉันไม่เห็นด้วย อันนี้ง่ายกว่ามากโดยเฉพาะคุณไม่จำเป็นต้องพิจารณาการขึ้นบรรทัดใหม่ นอกจากนี้ฉันคิดว่างานนั้นสร้างความแตกต่างไม่เช่นนั้นความท้าทายควินทั่วไปทั่วไปจะเป็นความท้าทายขั้นพื้นฐานของควิน
Martin Ender

ข้อได้เปรียบของงานที่ง่ายกว่าคือส่งเสริมให้มีการแข่งขันเพื่อสร้างคำตอบสั้น ๆ ที่น่าตกใจจนฉันหวังว่าจะพิสูจน์ความท้าทายนี้ให้แตกต่าง!
QuadmasterXLII

1
น่าจะเป็นที่น่าสังเกตว่า s_zero และ s_one จะต้องแตกต่างกัน มิฉะนั้นฉันมีวิธีแก้ปัญหามากมายด้วยคะแนน 2 * n
randomra

คำตอบ:


6

CJam, 29 + 29 = 58 ไบต์

รหัส 0:

0{"_~"]]z(3\+2b(2b2>a\+z~[}_~

รหัส 1:

1{"_~"]]z(3\+2b(2b2>a\+z~[}_~

คำอธิบาย

0                       " Push the current bit. ";
{"_~"                   " The basic quine structure. ";
    ]                   " Make an array of the current bit, the function and _~.
                          That is the code fragment itself. ";
    ]                   " Make an array of all code fragments in the stack. ";
    z(                  " Extract the array of the bits. ";
    3\+2b(2b2>          " Convert from base 2, decrease by one and convert back,
                          keeping the length. ";
    a\+z                " Put the bits back to the original position. ";
    ~                   " Dump the array of code fragments back into the stack. ";
    [                   " Mark the beginning position of the array of the next code fragment. ";
}_~


3

CJam, 47 + 47 = 94 bytes

รหัส 0:

{`"_~"+]:+T2*0+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

รหัส 1:

{`"_~"+]:+T2*1+:T)\AsSerS/_,(@2Y$#+2bU@->]zs}_~

แก้ตัวการเพิ่มเข้าไป

ฉันแน่ใจว่าฉันยังสามารถโกนทิ้งได้ไม่กี่ไบต์ ฉันจะเพิ่มคำอธิบายเมื่อฉันตัดสินใจว่าฉันจะไม่ใส่ใจกับการเล่นกอล์ฟอีกต่อไป

ทดสอบที่นี่



1

GolfScript, 37 + 37 = 74 ไบต์

0{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~
1{`".~"+:q;]-2%1\{1$^.@&q@}%\;-1%~}.~

ไม่สั้นเท่ากับโซลูชัน CJam ของผู้ใช้ 23013แต่ฉันคิดว่าฉันโพสต์สิ่งนี้ต่อไปถ้าเพียง (เล็กน้อย) เพิ่มความหลากหลายของภาษาที่ใช้

โซลูชันของฉันไม่ได้ขึ้นอยู่กับโซลูชันที่มีอยู่โดยตรงใด ๆ (และแน่นอนฉันไม่ได้ตรวจสอบอย่างละเอียดเนื่องจากฉันยังอ่าน CJam ไม่ดี) แต่พวกเขาทั้งหมดมีคุณสมบัติที่แตกต่างกันของโครงสร้างพื้นฐาน quine เดียวกัน ( {".~"}.~ใน GolfScript {"_~"}_~ใน CJam) ไม่น่าแปลกใจนักเนื่องจากดูเหมือนว่าจะเป็นหนึ่งในวิธีที่มีประสิทธิภาพที่สุดในการเขียนควินินที่มีน้ำหนักบรรทุกตามอำเภอใจในภาษาเหล่านี้

มีหลายส่วนของรหัสนี้ที่ฉันไม่ชอบและฉันคิดว่ามันเป็นไปได้ที่จะตีกอล์ฟต่อไป แต่ฉันใช้เวลากับมันมากเกินไป

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