Viết ra trình tự Thue-Morse


22

Có khá nhiều thử thách trên trang web này yêu cầu bạn in ra một chuỗi và điều này cũng không ngoại lệ.

(Giải thích sau đây về trình tự cho thử thách này giả định các ký hiệu trong chuỗi là 01.)

Định nghĩa đệ quy của chuỗi Thue-Morse

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

Một định nghĩa trực tiếp hơn là chuỗi từ 0đến 2**m-12**m to 2**(m+1)-1là bổ sung nhị phân. Vì vậy, 0được theo sau 1, 01được theo sau 10, 0110được theo sau 1001, và, bỏ qua phía trước một chút, 0110100110010110được theo sau 1001011001101001.

Thách thức là viết một chương trình hoặc một hàm in ra chuỗi Thue-Morse cho các nphần tử đầu tiên , trong đó ncó bất kỳ số nguyên không âm nào. Đầu ra có thể sử dụng bất kỳ hai biểu tượng, như thể hiện trong các ví dụ dưới đây.

Ví dụ

>>> 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

Quy tắc

  • Đầu vào sẽ là bất kỳ số nguyên không âm. Bạn có thể giả sử tất cả các đầu vào là hợp lệ.

  • Đầu ra phải là các nyếu tố đầu tiên của chuỗi Thue-Morse, sử dụng bất kỳ ký hiệu nào thuận tiện. Nếu bạn thích, bạn cũng có thể thêm một dấu phân cách. Trong ví dụ của tôi, tôi không có. Lưu ý: Quy tắc này cho phép các danh sách (như của Python), như ,là một dấu tách hợp lệ và tôi không bận tâm đến các ký tự dẫn đầu hoặc dấu, chẳng hạn như []trong đầu ra.

  • Đây là mã golf, vì vậy số byte nhỏ nhất sẽ thắng.

Như mọi khi, nếu vấn đề không rõ ràng, xin vui lòng cho tôi biết. Chúc may mắn và chơi golf tốt!

Mục lục

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
nói một cách đơn giản hơn bạn có thể nói: hàm được đệ quy, phủ định đầu vào và nối thêm nó.
Eumel


2
@PeterTaylor theo cách nào? Một câu trả lời khả dĩ cho câu hỏi được liên kết là trình tự Thue-Morse, nhưng câu hỏi này là để tạo ra Thue-Morse và không có gì khác.
Sherlock9

1
Bởi vì một số câu trả lời cho câu hỏi trước có thể được sử dụng để trả lời câu hỏi này với những thay đổi nhỏ và tất cả các câu trả lời cho câu hỏi này có thể được sử dụng để trả lời câu hỏi trước với những thay đổi nhỏ.
Peter Taylor

Câu trả lời:


14

Bình thường, 6 byte

xMjR2Q

Dùng thử trực tuyến: Trình diễn

Dựa trên giải pháp từ @ThomasKwa và một biến thể của @FryAmTheEggman.

Nó sử dụng công thức sau: ichữ số -th trong chuỗi Thue-Morse là : xor(digits of i in base 2).

Giải trình:

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 byte

ri{2b:^}/

hoặc là

ri,2fb::^

Kiểm tra nó ở đây.

Giải trình

Điều này sử dụng định nghĩa thay thế được đưa ra trên Wikipedia, dựa trên tính chẵn lẻ của số 1s trong biểu diễn nhị phân của n.

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.
}/

Giải pháp thay thế sử dụng ,để biến nrõ ràng thành một phạm vi [0 ... n-1]trước khi sử dụng các toán tử infix để tính toán các biểu diễn nhị phân và XOR mà không cần một khối.

Giải pháp tiền thưởng

Dưới đây là một số giải pháp dựa trên các định nghĩa khác. Nếu có hai giải pháp, giải pháp ngắn hơn sẽ làm nổ bộ nhớ rất nhanh (vì tính toán trước tạo ra 2^ncác bit trước khi cắt ngắn n).

Là một hệ thống L với 0 --> 011 --> 10:

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

Bằng cách phủ định và nối thêm phần trước:

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

Sử dụng mối quan hệ lặp lại được đưa ra trong thử thách, sử dụng divmodvà XOR để phân biệt giữa hai định nghĩa đệ quy:

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

(Mặc dù, tất nhiên, mối quan hệ lặp lại này chỉ là một cách khác để diễn tả chuỗi Thue-Morse là tính chẵn lẻ của 1 bit trong biểu diễn nhị phân của n.)


Giải pháp lãng phí bộ nhớ cũng là suy nghĩ đầu tiên của tôi, nhưng tôi nghĩ rằng việc sử dụng hơn nửa terabyte bộ nhớ để tính toán đầu ra cho 42(giả sử một bitet) sẽ khá vô lý.
JohnE

@JohnE Vấn đề được giải quyết. ;)
Martin Ender

:^làm cho tôi hạnh phúc. Một lưu ý khác, tào lao thần thánh, đó là một thuật toán tuyệt vời.
Vụ kiện của Quỹ Monica

@QPaysTaxes không :^}?
TheLethalCoder

1
@TheLethalCoder Điều đó cũng làm tôi hạnh phúc
Vụ kiện của Quỹ Monica

8

APL Dyalog, 8 7 byte

≠⌿⍴∘2⊤⍳

Đây là một chuyến tàu đơn nguyên có nguồn gốc chỉ số là 0 ( ⎕IO←0). Hàm không đào tạo tương đương là {≠⌿(⍵⍴2)⊤⍳⍵}.

Giải trình:

      ⍳      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

Đầu ra là một danh sách được phân tách bằng dấu cách 01. Hãy thử nó ở đây .


8

Toán học, 35 21 byte

Mathematica có tích hợp sẵn cho chuỗi Thue-Morse!

Array[ThueMorse,#,0]&

Câu trả lời gốc:

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

7

LabVIEW, 15 LabVIEW Primitive

bây giờ là gif siêu ưa thích với một đầu dò

nhập mô tả hình ảnh ở đây


3
Bạn có thể giải thích làm thế nào điều này sẽ được thử nghiệm?
JohnE

tùy chọn 1: nhận phiên bản thử nghiệm labview và xây dựng lại nó, Tùy chọn: đề xuất một cách tôi có thể gửi cái này cho bạn dưới dạng .exe hoặc .vi (đối với cái sau bạn cũng phải lấy labview)
Eumel

1
Thực sự tôi chỉ muốn xem cách nó hoạt động khi nó chạy. Ghi lại một GIF sẽ được minh họa?
JohnE

đó là một ý tưởng tuyệt vời tôi vừa thực hiện và sẽ thực hiện nó trong một giây
Eumel

6

J, 12 11 byte

@ MartinBüttner đã lưu một byte.

~:/@#:"0@i.

Đây là một hàm đơn âm (có nghĩa là đơn nguyên), được sử dụng như sau:

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

Giải trình

Tôi đang sử dụng định nghĩa thay thế rằng T n là tính chẵn lẻ của số lượng 1 bit trong biểu diễn nhị phân của 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.

{.(,-)^:]hoạt động cho 9 byte với một số quy tắc kéo dài ( đã được cho phép ). Ví dụ cho 5nó đầu ra 5 _5 _5 5 _5. (Chỉ được thêm dưới dạng nhận xét vì quy tắc kéo dài.)
Randomra

4

Bình thường, 11 10 byte

m%ssM.Bd2Q

Đầu ra dưới dạng danh sách kiểu Python.


Tôi đã thử sử dụng XOR qua chuỗi nhị phân, nhưng tôi không biết gần như đủ về Pyth để làm điều đó. Điều này dù sao cũng ngắn hơn nhiều. +1
Sản xuất ETH

@FryAmTheEggman Ah, tôi không biết Fvì tôi đã tìm kiếm 'giảm'. Bạn có thể đăng bài dưới dạng CW ...
lirtosiast

4

Japt , 29 11 byte

Uo ®¤¬r@X^Y

Hãy thử trực tuyến!

Đầu ra trực tiếp dưới dạng một mảng, giúp tiết kiệm khoảng 4 byte.

Ung dung và giải thích

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

Chỉnh sửa: Bây giờ bạn có thể sử dụng mã 8 byte sau (không hợp lệ; tính năng được xuất bản sau thử thách này):

Uo ®¤¬r^

bạn có thể muốn cập nhật lời giải thích của mình
Eumel

@Eumel Tôi đã làm ...?
Sản xuất ETH

mã bạn giải thích và mã ở trên trông khác nhau
Eumel

@Eumel Ở đó, có tốt hơn không?
Sản xuất ETH

thật hoàn hảo :)
Eumel

4

Haskell, 39 36 35 byte

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

Hãy thử trực tuyến!

Cách thức hoạt động: bắt đầu với [0]và áp dụng các lần x ++ invert xchức năng n. Lấy các nyếu tố đầu tiên từ danh sách kết quả. Nhờ sự lười biếng của Haskell, chỉ những nyếu tố đầu tiên thực sự được tính toán. Lưu ý: đầu tiên <*>là trong bối cảnh chức năng, thứ hai trong bối cảnh danh sách.

Với GHC v8.4 (không có sẵn tại thời điểm thử thách), có một giải pháp 34 byte:

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

Chỉnh sửa: -3 resp. -4 byte nhờ @Laikoni. -1 byte nhờ @ janrjan Johansen.


(\x->x++map(1-)x)có thể rút ngắn xuống ([id,(1-)]<*>)hoặc (id<>map(1-))bằng GHC 8.4.
Laikoni

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

3

Haskell, 54 byte

Ít gọn hơn giải pháp của nimi, nhưng tôi không muốn từ chối bạn đoạn mã chức năng này. Hoạt động cho bất kỳ cặp đối tượng; ví dụ bạn có thể thay thế (f 0.f 1)bằng (f 'A'.f 'B').

Dựa trên định nghĩa rằng 2 n chữ số đầu tiên được theo sau bởi cùng một chuỗi các chữ số được đảo ngược. Những gì chúng tôi làm là xây dựng hai danh sách cạnh nhau; Một cho chuỗi, một cho nghịch đảo. Chúng tôi liên tục nối các phần ngày càng dài của danh sách này sang danh sách khác.

Việc thực hiện bao gồm ba định nghĩa:

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

Hàm tchấp nhận bất kỳ số nào và trả về chuỗi Thue-Morse có độ dài đó. Hai chức năng khác là người trợ giúp.

  • Hàm fđại diện cho một trong hai danh sách; f 0là cho chuỗi, f 1cho nghịch đảo.
  • Chức năng gchăm sóc nối thêm các lần lặp lại ngày càng dài của danh sách này sang danh sách khác.

Câu đố: http://goo.gl/wjk9S0



2

Burlesque, 21 byte

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

Ví dụ:

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}

Giải trình:

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

Không có jri.+phần bạn sẽ hết bộ nhớ (bởi vì nó sẽ tính toán chuỗi morse có độ dài vô cùng lớn ). Nhưng vì Burlesque lười biếng, chỉ cần yêu cầu phần tử n đầu tiên sẽ hoạt động.


Tốt đẹp. Tương tự như giải pháp Haskell của tôi. Tuy nhiên, tôi chỉ lặp lại 99 lần để lưu một byte.
nimi

2

K5, 27 13 byte

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

Tính toán trình tự là khá dễ dàng, vấn đề là tránh tính toán quá nhiều. Chúng ta có thể nhận ra rằng việc mở rộng dễ dàng của chuỗi cung cấp cho chúng ta một chuỗi các chuỗi có sức mạnh liên tiếp có hai chiều dài. Lấy cơ sở nhật ký 2 của đầu vào và làm tròn sẽ cho chúng ta đủ để làm việc và sau đó chúng ta có thể cắt nó xuống kích thước phù hợp:

  {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
 ())

Chỉnh sửa:

Một giải pháp dựa trên tính chẵn lẻ:

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

Trong hành động:

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

Lưu ý rằng vì K5 không có một nguyên hàm chuyển đổi thành nhị phân tùy ý, tôi phải chỉ định, ví dụ, giải mã 64 bit. K5 không sử dụng toán chính xác tùy ý, do đó sẽ có giới hạn về kích thước của đầu vào mà chúng ta có thể xử lý trong mọi trường hợp.


2

Octave, 33 31 byte

Lưu được 2 byte nhờ Thomas Kwa.

@(n)mod(sum(dec2bin(0:n-1)'),2)

2

Perl 5, 62 49 byte

Vâng, không phải là ngôn ngữ tốt nhất cho ngôn ngữ này, nhưng tôi vẫn thích cách nó xuất hiện. Yêu cầu 5.14+ cho /rsay.

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

Sử dụng định nghĩa chẵn lẻ, yêu cầu 5.12+ cho say:

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

2

Prolog (SWI), 115 byte

Mã số:

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).

Giải thích:

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

Thí dụ:

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

Dùng thử trực tuyến tại đây


2

Võng mạc , 70 69 byte

Sử dụng định nghĩa như một hệ thống L với từ 0và sản phẩm ban đầu 0 --> 011 --> 10.

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

Đầu vào được thực hiện trong unary .

Bạn có thể chạy mã từ một tệp duy nhất với -scờ. Hoặc chỉ cần thử trực tuyến.

Giải trình

^
0;

Chuẩn bị 0;cho đầu vào, nơi 0là từ ban đầu và ;chỉ là một dấu phân cách.

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

Dấu (hiệu cho thấy đây là điểm bắt đầu của một vòng lặp (lặp lại cho đến khi vòng lặp dừng thay đổi chuỗi). Giai đoạn này tự biến 01thành abtương ứng (vì dmở rộng đến 0-9). Nó thực hiện điều này miễn là từ hiện tại (có độ dài được đo bằng (.)+ngắn hơn đầu vào (nghĩa là miễn là chúng ta không thể đọc phần cuối của chuỗi bằng cách khớp với nhiều 1s như chúng ta có trong từ).

a
01

Thay thế a(stand-in cho 0) bằng 01.

)`b
10

Thay thế b(stand-in cho 1) bằng 10. Đây cũng là kết thúc của vòng lặp. Vòng lặp chấm dứt khi điều kiện trong giai đoạn chuyển ngữ không thành công, bởi vì sau đó tất cả các 0s và 1s sẽ không thay đổi và hai giai đoạn còn lại sẽ không tìm thấy gì phù hợp.

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

Bước cuối cùng là cắt ngắn từ theo chiều dài của đầu vào. Lần này, chúng tôi đo chiều dài của đầu vào bằng (.)+một cái nhìn. Sau đó, chúng tôi khớp với nhiều ký tự từ đầu chuỗi.


2

Ruby, 33

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

Gọi như thế này:

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

Sử dụng thực tế là tính chẵn lẻ của các số nhị phân tạo thành chuỗi thue-morse.

Ký tự phân cách là dòng mới. Chuyển đổi số ithành chuỗi nhị phân, sau đó tính tổng của tất cả các mã ASCII, modulo 2.

Nếu dòng mới không phải là dấu phân tách có thể chấp nhận, thì dòng sau không có dấu phân cách cho thêm 2 byte:

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

2

MATL , 9 byte

Ngôn ngữ này được thiết kế sau thử thách .

Cách tiếp cận 1: 13 byte

Điều này xây dựng trình tự bằng cách ghép các bản sao phủ định của các khối có kích thước tăng dần.

itBFw"t~h]w:)

Thí dụ

>> 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

Giải trình

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

Cách tiếp cận 2: 9 byte

Điều này sử dụng cách tiếp cận tương tự như câu trả lời của Alephalpha .

i:1-B!s2\

Thí dụ

>> 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

Giải trình

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


2

Thạch , 4 byte

ḶB§Ḃ

Lưu ý rằng thử thách này cũ hơn Jelly.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ḷ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

Tôi đang sử dụng thực tế là nó giống như bắt đầu 0và sau đó lặp lại bước nối thêm phần bổ sung của chuỗi hiện tại, nlần.

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

Bạn có thể thay thế phân tán (t) bằng t tôi nghĩ ...
AlexR


1

Bash, 71 66 byte

Dựa trên định nghĩa rằng 2 n chữ số đầu tiên được theo sau bởi cùng một chuỗi các chữ số được đảo ngược.

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

$1 như một tham số là số chữ số mong muốn.

Câu đố: http://goo.gl/RkDZIC


1

Hàng loạt, 115 + 2 = 117 byte

Dựa trên câu trả lời của 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!

Cần thêm /Vmột lời mời để cho phép sử dụng !s.


1

ES6, 53 byte

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

Đệ quy có vẻ đơn giản hơn một vòng lặp.


1

Mệnh , 8 byte

✶u[Σ_✶¨^

Giải trình:

✶          parse implicit input number
 u         range [0..n-1]
  [        map:
   Σ           convert to binary
    _✶         get digit list
      ¨^       fold with xor

Xuất ra một cái gì đó như:

(0 1 1 0 1 0 0 1)

1

Toán ++ , 86 byte

Sử dụng 0.0\ncho 0 và 1.0\ncho 1

?>n
3*!!(n-m)>$
m>a
0>k
6+6*!a>$
9-2*!(a%2)>$
a/2>a
5>$
(a-1)/2>a
!k>k
5>$
k
m+1>m
2>$

1

Arcyóu , 50 55 byte

Tôi đã phải thêm 5 byte để làm cho nó hoạt động chính xác :(

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

Giải thích (với mã giả Pythonesque dọc theo bên:

(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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.