เขียนลำดับ Thue-Morse


22

มีความท้าทายเล็กน้อยในไซต์นี้ที่ขอให้คุณพิมพ์ลำดับและนี่ไม่ใช่ข้อยกเว้น

(คำอธิบายต่อไปนี้ของลำดับสำหรับการท้าทายนี้ถือว่าสัญลักษณ์ในลำดับคือ0และ1.)

คำจำกัดความซ้ำของลำดับThue-Morseคือ

T_0 = 0
T_2n = T_n
T_2n+1 = 1 - T_n

คำนิยามที่ตรงกว่าคือลำดับจาก0ถึง2**m-1และ2**m to 2**(m+1)-1เป็นส่วนเติมเต็มไบนารี ดังนั้น0จะตามด้วย1, 01ตามด้วย10, 0110มีผู้ติดตาม1001และกระโดดไปข้างหน้าเล็กน้อยตามด้วย01101001100101101001011001101001

ความท้าทายคือการเขียนโปรแกรมหรือฟังก์ชั่นที่พิมพ์ลำดับ Thue-Morseสำหรับnองค์ประกอบแรกซึ่งnเป็นจำนวนเต็มใด ๆ ที่ไม่เป็นลบ เอาต์พุตสามารถใช้สองสัญลักษณ์ใด ๆ ดังแสดงในตัวอย่างด้านล่าง

ตัวอย่าง

>>> tm_01(20)
01101001100101101001
>>> tm_ab(42)
abbabaabbaababbabaababbaabbabaabbaababbaab
>>> tm_paren(37)
())()(())(()())()(()())(())()(())(()(
>>> tm_space_star(12)
 ** *  **  *
>>> tm_01(0)
                # to show that this is a valid input

กฎระเบียบ

  • อินพุตจะเป็นจำนวนเต็มใด ๆ ที่ไม่เป็นลบ คุณสามารถสมมติว่าอินพุตทั้งหมดนั้นถูกต้อง

  • เอาต์พุตจะต้องเป็นnองค์ประกอบแรกของลำดับ Thue-Morse โดยใช้สัญลักษณ์ใด ๆ ที่สะดวก หากต้องการคุณสามารถเพิ่มตัวคั่นได้ ในตัวอย่างของฉันฉันไม่ได้ หมายเหตุ:กฎนี้อนุญาตรายการ (เช่นเดียวกับ Python) เนื่องจาก,เป็นตัวคั่นที่ถูกต้องและฉันไม่รังเกียจที่จะนำหน้าหรือต่อท้ายอักขระเช่น[และ]ในผลลัพธ์

  • นี่คือรหัสกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

เช่นเคยหากปัญหายังไม่ชัดเจนโปรดแจ้งให้เราทราบ ขอให้โชคดีและกอล์ฟที่ดี!

แค็ตตาล็อก

var QUESTION_ID=65549;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=47581;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"http://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>



1
ในคำที่ง่ายกว่าคุณสามารถพูดได้: ฟังก์ชั่นซ้ำเรียกคืนลบอินพุตและต่อท้าย
Eumel


2
@PeterTaylor เป็นไงบ้าง? หนึ่งคำตอบที่เป็นไปได้สำหรับคำถามที่เชื่อมโยงคือลำดับ Thue-Morse แต่คำถามนี้คือการสร้าง Thue-Morse และไม่มีอะไรอื่น
Sherlock9

1
เนื่องจากบางคำตอบของคำถามก่อนหน้านี้สามารถใช้เพื่อตอบคำถามนี้ด้วยการเปลี่ยนแปลงเล็กน้อยและคำตอบทั้งหมดสำหรับคำถามนี้สามารถใช้เพื่อตอบคำถามก่อนหน้านี้ด้วยการเปลี่ยนแปลงเล็กน้อย
Peter Taylor

คำตอบ:


14

Pyth, 6 ไบต์

xMjR2Q

ลองใช้งานออนไลน์: การสาธิต

อิงตามโซลูชันจาก @ThomasKwa และรูปแบบของ @FryAmTheEggman

โดยจะใช้สูตรต่อไปนี้: iบาท -th ในลำดับ xor(digits of i in base 2)Thue-มอร์ส:

คำอธิบาย:

xMjR2Q   implicit: Q = input number
  jR2Q   convert each number in [0, 1, ..., Q-1] to its binary digits
xM       xor each binary list

9

CJam, 17 9 ไบต์

ri{2b:^}/

หรือ

ri,2fb::^

ทดสอบที่นี่

คำอธิบาย

นี้ใช้คำนิยามทางเลือกที่ได้รับในวิกิพีเดียอยู่บนพื้นฐานของความเท่าเทียมกันของจำนวนที่อยู่ในฐานเป็นตัวแทนของ1n

ri   e# Read input and convert to integer n.
{    e# For each i from 0 to n-1...
  2b e#   Convert i to base 2.
  :^ e#   Fold XOR over the bits to compute the parity of the number of 1s.
}/

การใช้โซลูชั่นทางเลือก,ที่จะเปิดnอย่างชัดเจนลงไปในช่วง[0 ... n-1]ก่อนที่จะใช้ประกอบการมัดการคำนวณการแสดงไบนารีและแฮคเกอร์โดยไม่จำเป็นต้องบล็อก

โซลูชั่นโบนัส

ต่อไปนี้เป็นวิธีแก้ไขปัญหาตามคำจำกัดความอื่น ๆ หากมีสองการแก้ปัญหาหนึ่งที่สั้นกว่าจะระเบิดขึ้นในหน่วยความจำมากได้อย่างรวดเร็ว (เพราะ precomputation สร้าง2^nบิตก่อนที่จะตัดทอนไปn)

ในฐานะที่เป็นระบบ L ด้วย0 --> 01และ1 --> 10:

ri_2mL2,\{2,aA+f=s:~}*<
ri_2,\{2,aA+f=s:~}*<

โดยปฏิเสธและผนวกส่วนก่อนหน้านี้:

ri_2mL2,\{_:!+}*<
ri_2,\{_:!+}*<

การใช้ความสัมพันธ์ที่เกิดซ้ำในการท้าทายการใช้divmodและ XOR เพื่อแยกความแตกต่างระหว่างคำจำกัดความการเกิดซ้ำทั้งสอง:

ri{Ta{2md\j^}j}/

(แม้ว่าแน่นอนความสัมพันธ์ที่เกิดซ้ำนี้เป็นเพียงวิธีที่แตกต่างกันในการแสดงลำดับ Thue-Morse เป็นพาริตีของ 1 บิตในการแทนเลขฐานสองของn)


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

@JohnE แก้ไขปัญหาแล้ว ;)
Martin Ender

:^ทำให้ฉันมีความสุข ในบันทึกอื่นอึศักดิ์สิทธิ์นั่นเป็นอัลกอริทึมที่ยอดเยี่ยม
คดีฟ้องร้องกองทุนโมนิก้า

@QPaysTaxes ไม่ได้:^}?
TheLethalCoder

1
@TheLethalCoder นั่นทำให้ฉันมีความสุขด้วย
คดีของกองทุนโมนิกา

8

Dyalog APL, 8 7 ไบต์

≠⌿⍴∘2⊤⍳

รถไฟขบวนนี้เป็น monadic ที่คาดว่าจะกำเนิดดัชนีเป็น 0 ( ⎕IO←0) {≠⌿(⍵⍴2)⊤⍳⍵}เทียบเท่าฟังก์ชั่นที่ไม่ใช่รถไฟ

คำอธิบาย:

      ⍳      List of numbers from 0 to (input-1)
  ⍴∘2        (input) copies of 2
     ⊤       Convert all the elements in ⍳ to base 2 to (input) digits
≠⌿           Reduce over the first axis by not-equal

เอาท์พุทเป็นรายการพื้นที่ที่คั่นของและ0 1ลองมันนี่


8

Mathematica, 35 21 ไบต์

Mathematica มีลำดับเหตุการณ์ในตัวสำหรับ Thue-Morse!

Array[ThueMorse,#,0]&

คำตอบเดิม:

#&@@@DigitCount[Range@#-1,2]~Mod~2&

7

LabVIEW ดั้งเดิม 15 LabVIEW

ตอนนี้เป็น gif แฟนซีสุด ๆ พร้อมโพรบ

ป้อนคำอธิบายรูปภาพที่นี่


3
คุณช่วยอธิบายวิธีทดสอบนี้ได้ไหม?
JohnE

ตัวเลือกที่ 1: รับรุ่นทดสอบ LabVIEW และสร้างมันตัวเลือก: แนะนำวิธีที่ฉันจะส่งข้อมูลนี้ให้คุณเป็น .exe หรือ .vi (สำหรับหลังคุณต้องได้รับ LabVIEW เช่นกัน)
Eumel

1
จริงๆแล้วฉันแค่อยากจะดูว่ามันทำงานอย่างไรเมื่อมันทำงาน การบันทึก GIF จะเป็นตัวอย่างหรือไม่
JohnE

เป็นความคิดที่ดีที่ฉันเพิ่งทำไปและจะเพิ่มเป็นวินาที
Eumel

6

J, 12 11 ไบต์

@ MartinBüttnerบันทึกเป็นไบต์

~:/@#:"0@i.

นี่คือฟังก์ชัน monadic (หมายถึง unary) ซึ่งใช้ดังนี้:

   f =: ~:/@#:"0@i.
   f 10
0 1 1 0 1 0 0 1 1 0

คำอธิบาย

ฉันใช้คำนิยามทางเลือกที่ T nคือความเท่าเทียมกันของจำนวน 1 บิตในฐานเป็นตัวแทนของ n

~:/@#:"0@i.  Input is n.
~:/          Output is XOR folded over
   @#:       the binary representations of
      "0     each element of
        @i.  integers from 0 to n-1.

{.(,-)^:]ใช้งานได้ 9 ไบต์โดยมีการยืดกฎ ( ซึ่งได้รับอนุญาต ) เช่นสำหรับมันจะออกผลลัพธ์5 5 _5 _5 5 _5(เพิ่มเป็นความคิดเห็นเท่านั้นเนื่องจากกฎยืดออกไป)
Randomra

4

Pyth, 11 10 ไบต์

m%ssM.Bd2Q

เอาต์พุตเป็นรายการสไตล์ Python


ฉันลองใช้ XOR แทนสายอักขระไบนารี แต่ฉันก็ไม่รู้ว่า Pyth จะทำอะไรได้ มันสั้นกว่านี้มาก +1
ETHproductions

@FryAmTheEggman อ่าฉันไม่รู้Fเพราะฉันค้นหา 'ลด' คุณสามารถโพสต์ในฐานะ CW ...
lirtosiast

4

Japt , 29 11 ไบต์

Uo ®¤¬r@X^Y

ลองออนไลน์!

ส่งออกโดยตรงเป็นอาร์เรย์ซึ่งจะช่วยประหยัดประมาณ 4 ไบต์

Ungolfed และคำอธิบาย

Uo ®   ¤  ¬ r@  X^Y
Uo mZ{Zs2 q rXY{X^Y}}
        // Implicit: U = input number
Uo      // Create an array of integers in the range `[0, U)`. 
mZ{Zs2  // Map each item Z in this range to Z.toString(2),
q rXY{  //  split into chars, and reduced by
X^Y}}   //   XORing.
        //  This returns (number of 1s in the binary string) % 2.
        // Implicit: output last expression

แก้ไข:ตอนนี้คุณสามารถใช้รหัส8 ไบต์ต่อไปนี้(ไม่ถูกต้องคุณลักษณะที่เผยแพร่หลังจากการท้าทายนี้):

Uo ®¤¬r^

คุณอาจต้องการอัปเดตคำอธิบายของคุณ
Eumel

@Eumel ฉันทำไปแล้ว ... ?
ETHproductions

รหัสที่คุณอธิบายและรหัสด้านบนนั้นดูแตกต่างออกไป
Eumel

@Eumel นั่นมันดีกว่าเหรอ?
ETHproductions

สมบูรณ์แบบ :)
Eumel

4

Haskell, 39 36 35 bytes

take<*>(iterate([id,(1-)]<*>)[0]!!)

ลองออนไลน์!

มันทำงานอย่างไร: เริ่มด้วย[0]และใช้x ++ invert x-function ntimes ใช้nองค์ประกอบแรกจากรายการผลลัพธ์ ด้วยความเกียจคร้านของ Haskell มีเพียงการnคำนวณองค์ประกอบแรกเท่านั้น หมายเหตุ: อันแรก<*>อยู่ในบริบทของฟังก์ชันส่วนที่สองในบริบทรายการ

ด้วย GHC v8.4 (ซึ่งไม่สามารถใช้ได้ในเวลาที่มีการท้าทาย) มีวิธีแก้ปัญหา 34 ไบต์:

take<*>(iterate(id<>map(1-))[0]!!)

แก้ไข: -3 Resp -4 ไบต์ขอบคุณ @Laikoni -1 ไบต์ขอบคุณ @ Ørjan Johansen


(\x->x++map(1-)x)สามารถย่อให้สั้นลง([id,(1-)]<*>)หรือ(id<>map(1-))ใช้ GHC 8.4
Laikoni

take<*>(iterate([id,(1-)]<*>)[0]!!)
Ørjan Johansen

3

Haskell, 54 ไบต์

มีขนาดกะทัดรัดน้อยกว่าโซลูชันของ nimi แต่ฉันไม่ต้องการที่จะปฏิเสธการใช้งานโค้ดที่ทำให้งงงวย ใช้ได้กับทุกคู่ของวัตถุ เช่นคุณสามารถแทนที่โดย(f 0.f 1)(f 'A'.f 'B')

ขึ้นอยู่กับคำจำกัดความว่าตัวเลข2 nแรกตามด้วยตัวเลขลำดับเดียวกันกลับหัว สิ่งที่เราทำคือสร้างรายการสองรายการแบบเคียงข้างกัน สำหรับลำดับหนึ่งสำหรับผกผัน อย่างต่อเนื่องเราผนวกส่วนยาวมากขึ้นของรายการหนึ่งไปยังอีก

การดำเนินการประกอบด้วยสามคำจำกัดความ:

t=(f 0.f 1)t
f c=flip take.(c:).g 1
g n l=l n++g(n+n)l

ฟังก์ชั่นtยอมรับหมายเลขใด ๆ และส่งกลับลำดับ Thue-Morse ของความยาวนั้น อีกสองฟังก์ชั่นเป็นผู้ช่วยเหลือ

  • ฟังก์ชั่นfหมายถึงรายการใดรายการหนึ่ง; f 0สำหรับลำดับf 1สำหรับอินเวอร์ส
  • ฟังก์ชั่นgจะดูแลการเพิ่มการซ้ำของรายการหนึ่งไปอีกอันหนึ่งที่ยาวมากขึ้น

ซอ: http://goo.gl/wjk9S0



2

Burlesque, 21 ไบต์

{0}{J)n!_+}400E!jri.+

ตัวอย่าง:

blsq ) "20"{0}{J)n!_+}400E!jri.+
{0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1}
blsq ) "42"{0}{J)n!_+}400E!jri.+
{0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1}

คำอธิบาย:

{0}      -- setup
{J)n!_+} -- duplicate, map invert, concatenate
400E!    -- do 400 times (this will eventually run
            out of memory).
jri.+    -- take n elements

ถ้าไม่มีjri.+ส่วนใดคุณก็จะหมดหน่วยความจำ (เพราะมันจะคำนวณลำดับมอร์สของความยาวจำนวนมหาศาลอย่างไม่น่าเชื่อ ) แต่เนื่องจาก Burlesque ขี้เกียจแค่ขอให้องค์ประกอบ n แรกจะทำงานได้


ดี คล้ายกับโซลูชัน Haskell ของฉัน อย่างไรก็ตามฉันทำซ้ำเพียง 99 ครั้งเพื่อบันทึกหนึ่งไบต์
nimi

2

K5, 27 13 ไบต์

{x#((log x)%log 2){x,~x}/0}

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

  {x#((log x)%log 2){x,~x}/0}'(20 42 37 12 0)
(0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1
 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1
 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0
 0 1 1 0 1 0 0 1 1 0 0 1
 ())

แก้ไข:

วิธีแก้ปัญหาแบบพาริตี:

~=/'(64#2)\'!

ในการดำเนินการ:

  ~=/'(64#2)\'!20
0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1

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



2

Perl 5, 62 49 ไบต์

ใช่ไม่ใช่ภาษาที่ดีที่สุดสำหรับอันนี้ แต่ฉันก็ยังชอบวิธีที่มันออกมา ต้อง 5.14+ สำหรับและ/rsay

sub{$_=0;$_.=y/01/10/r while$_[0]>length;say substr$_,0,$_[0]}

การใช้คำจำกัดความพาริตีต้องใช้ 5.12+ สำหรับsay:

sub{say map{sprintf("%b",$_)=~y/1//%2}0..$_[0]-1}

2

Prolog (SWI) 115 ไบต์

รหัส:

N*X:-N>1,R is N//2,R*Y,X is(N mod 2)xor Y;X=N.
p(N):-M is N-1,findall(E,between(0,M,E),L),maplist(*,L,K),write(K).

อธิบาย:

N*X:-                                 % Calculate Thue-Morse number at index N
     N>1,                             % Input is bigger than 1
     R is N//2,R*Y,X is(N mod 2)xor Y % Thue-Morse digit at index N is binary digits of N xor'ed
     ;X=N.                            % OR set X to N (end of recursion)
p(N):-
      M is N-1,                       % Get index of Nth number
      findall(E,between(0,M,E),L),    % Make a list of number 0->N-1
      maplist(*,L,K),                 % Map * on list L producing K
      write(K).                       % Print K

ตัวอย่าง:

p(20).
[0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1]

ลองออนไลน์ ที่นี่


2

จอตาติน่า70 70ไบต์

ใช้คำจำกัดความเป็นระบบ L พร้อมคำเริ่มต้น0และการผลิต0 --> 011 --> 10และ

^
0;
(T`d`ab`^(.)+;(?!(?<-1>.)+$)
a
01
)`b
10
!`^(?=.*;(.)+)(?<-1>.)+

การป้อนข้อมูลจะนำมาในเอก

คุณสามารถเรียกใช้รหัสจากไฟล์เดียวด้วย -sธง หรือลองออนไลน์

คำอธิบาย

^
0;

ใส่คำนำ0;หน้าโดยที่0คำเริ่มต้นและ;เป็นเพียงตัวคั่น

(T`d`ab`^(.)+;(?!(?<-1>.)+$)

(บ่งบอกว่านี่คือจุดเริ่มต้นของวง (ซึ่งซ้ำจนกว่าวงหยุดการเปลี่ยนแปลงสตริง) ขั้นตอนนี้จะเปลี่ยน0และ1เข้าสู่aและbตามลำดับ (เพราะdขยายเป็น0-9) มันทำสิ่งนี้ตราบเท่าที่คำในปัจจุบัน (ซึ่งความยาวของการวัด(.)+นั้นสั้นกว่าอินพุท (เช่นตราบใดที่เราไม่สามารถอ่านจุดสิ้นสุดของสตริงโดยจับคู่ให้มาก1ที่สุดเท่าที่เรามีในคำ)

a
01

แทนที่a(Stand-in สำหรับ0) 01ด้วย

)`b
10

แทนที่b(Stand-in สำหรับ1) 10ด้วย นี่คือจุดสิ้นสุดของลูป ลูปจะสิ้นสุดลงเมื่อเงื่อนไขในสเตจการถอดเสียงล้มเหลวเพราะทั้งหมดนั้น0และ1 s ทั้งหมดจะยังคงไม่เปลี่ยนแปลงและอีกสองสเตจจะไม่พบสิ่งใดที่จะตรงกัน

!`^(?=.*;(.)+)(?<-1>.)+

ขั้นตอนสุดท้ายคือการตัดคำให้ยาวตามความยาวของอินพุต เวลานี้เราวัดความยาวของอินพุตด้วย(.)+ใน lookahead จากนั้นเราจับคู่อักขระหลายตัวตั้งแต่ต้นสตริง


2

ทับทิม, 33

->n{n.times{|i|p ("%b"%i).sum%2}}

โทรแบบนี้:

f=->n{n.times{|i|p ("%b"%i).sum%2}}
f[16]

ใช้ความจริงที่ว่าพาริตี้ของเลขฐานสองเป็นรูปแบบลำดับมอร์ส

อักขระตัวคั่นเป็นบรรทัดใหม่ แปลงตัวเลขiให้เป็นสตริงไบนารีจากนั้นคำนวณผลรวมของรหัส ASCII ทั้งหมด, โมดูโล 2

หากบรรทัดใหม่ไม่ใช่ตัวคั่นที่ยอมรับได้สิ่งต่อไปนี้จะไม่มีตัวคั่นสำหรับ 2 ไบต์เพิ่มเติม:

->n{n.times{|i|$><<("%b"%i).sum%2}}

2

MATL , 9 ไบต์

ภาษานี้ถูกออกแบบมาหลังจากที่ท้าทาย

วิธีที่ 1: 13 ไบต์

สิ่งนี้จะสร้างลำดับโดยเชื่อมต่อสำเนาที่ไม่ได้ใช้แล้วของบล็อกที่เพิ่มขนาด

itBFw"t~h]w:)

ตัวอย่าง

>> matl itBFw"t~h]w:)
> 20
0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1

คำอธิบาย

i           % input number, say "N"
tB          % duplicate and convert to binary. Produces a vector
F           % initialize sequence to "false"
w           % swap to bring vector to top
"           % for loop. There will be at least log2(N) iterations
  t~h       % duplicate, negate, concatenate
]           % end for
w           % swap
:)          % index with vector 1, 2, ..., N

วิธีที่ 2: 9 ไบต์

นี้จะใช้วิธีการเช่นเดียวกับคำตอบของ Alephalpha

i:1-B!s2\

ตัวอย่าง

>> matl i:1-B!s2\
> 20
0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1

คำอธิบาย

i           % input "N" 
:1-         % create vector 0, 1, ..., N-1
B           % convert to binary
!           % tranpose
s           % sum
2\          % modulo 2


2

เยลลี่ 4 ไบต์

ḶB§Ḃ

โปรดทราบว่าความท้าทายนี้เก่ากว่าเยลลี่

ลองออนไลน์!

มันทำงานอย่างไร

ḶB§Ḃ  Main link. Argument: n (integer)

Ḷ     Unlength; yield [0, ..., n-1].
 B    Compute the binary representation of each integer in the range.
  §   Take the sum of each binary representation.
   Ḃ  Take the LSB of each sum.

1

Matlab, 42

ฉันใช้ความจริงที่ว่ามันเหมือนกับตอนเริ่มต้น0แล้วทำซ้ำขั้นตอนของการผนวกส่วนประกอบของซีรีย์ปัจจุบันnครั้ง

t=0;for k=1:input('');t=[t;~t];end;disp(t)

คุณสามารถแทนที่จอ (t) โดยทีผมคิดว่า ...
AlexR


1

Bash, 71 66 ไบต์

ขึ้นอยู่กับคำจำกัดความว่าตัวเลข2 nแรกตามด้วยตัวเลขลำดับเดียวกันกลับหัว

x=0;y=1;while((${#x}<$1));do z=$x;x=$x$y;y=$y$z;done;echo ${x::$1}

$1 เป็นพารามิเตอร์คือจำนวนหลักที่ต้องการ

ซอ: http://goo.gl/RkDZIC


1

แบตช์, 115 + 2 = 117 ไบต์

ตามคำตอบ Bash

@echo off
set x=0
set y=1
set z=0
:a
set x=!x!!y!
set y=!y!!z!
set z=!x:~0,%1!
if !z!==!x! goto a
echo !z!

ต้องการส่วนเสริม/Vในการเรียกใช้เพื่ออนุญาตการใช้!s


1

ES6, 53 ไบต์

f=(i,x="0",y=1)=>x.length<i?f(i,x+y,y+x):x.slice(0,i)

การเรียกซ้ำดูเหมือนง่ายกว่าลูป




1

Arcyóu , 50 55 ไบต์

ฉันต้องเพิ่ม 5 ไบต์เพื่อให้มันทำงานอย่างถูกต้อง :(

(f i(_(#(l)))(r b^(@(> i 0)(pg 0(% i 2)(: i(#/ i 2))))0

คำอธิบาย (พร้อม pseudocode Pythonesque ด้านข้าง:

(f i (_ (# (l)))       ; For i in range(int(input())):
  (r b^                ; Reduce with binary xor
    (@ (> i 0)         ; While i > 0:
      (pg 0            ; Return first of its arguments
        (% i 2)        ; i mod 2
        (: i (#/ i 2)) ; i //= 2
      )
    )
    0                  ; Default reduce argument of 0 for the first bit in the sequence

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