Napisz sekwencję Thue-Morse

22

Na tej stronie jest sporo wyzwań, które wymagają wydrukowania sekwencji i nie jest to wyjątkiem.

(Poniższe wyjaśnienie sekwencji dla tego wyzwania zakłada, że ​​symbolami w sekwencji są 0i 1).

Rekurencyjne określenie sekwencji Thue-Morse jest

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

Bardziej bezpośrednią definicją jest to, że sekwencja od 0do 2**m-1i 2**m to 2**(m+1)-1są uzupełnieniami binarnymi. Więc 0następuje 1, 01następuje 10, 0110następuje 1001, i, przeskakując nieco dalej, 0110100110010110następuje 1001011001101001.

Wyzwanie polega na napisaniu programu lub funkcji, która wypisze sekwencję Thue-Morse'a dla pierwszych nelementów, gdzie njest dowolna liczba całkowita nieujemna. Dane wyjściowe mogą wykorzystywać dowolne dwa symbole, jak pokazano w poniższych przykładach.

Przykłady

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

Zasady

  • Wejście będzie dowolną liczbą całkowitą nieujemną. Możesz założyć, że wszystkie dane wejściowe są prawidłowe.

  • Dane wyjściowe muszą być pierwszymi nelementami sekwencji Thue-Morse, przy użyciu dowolnych symboli, które są wygodne. Jeśli chcesz, możesz także dodać separator. W moich przykładach nie mam. Uwaga: Ta reguła zezwala na listy (podobnie jak w Pythonie), ponieważ ,jest to prawidłowy separator i nie mam nic przeciwko wiodącym lub końcowym znakom, takim jak [i ]na wyjściu.

  • To jest kod golfowy, więc wygrywa najmniejsza liczba bajtów.

Jak zawsze, jeśli problem jest niejasny, daj mi znać. Powodzenia i dobrej gry w golfa!

Katalog

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>

Sherlock9
źródło
1
Związane z.
Martin Ender,
1
prościej mówiąc: funkcja jest rekurencyjna, zaneguj dane wejściowe i dołącz je.
Eumel,
2
Borderline dupe
Peter Taylor,
2
@PeterTaylor W jaki sposób? Jedną z możliwych odpowiedzi na powiązane pytanie jest sekwencja Thue-Morse, ale to pytanie ma wygenerować Thue-Morse i nic więcej.
Sherlock9,
1
Ponieważ niektóre odpowiedzi na poprzednie pytanie można wykorzystać do udzielenia odpowiedzi na to pytanie w trywialny sposób, a wszystkie odpowiedzi na to pytanie można zastosować do udzielenia odpowiedzi na poprzednie pytanie w trywialny sposób.
Peter Taylor,

Odpowiedzi:

14

Pyth, 6 bajtów

xMjR2Q

Wypróbuj online: demonstracja

Na podstawie rozwiązania @ThomasKwa i odmiany @FryAmTheEggman.

Wykorzystuje ona następującą formułę: the i-ty cyfra sekwencji Thue-Morse jest: xor(digits of i in base 2).

Wyjaśnienie:

xMjR2Q   implicit: Q = input number
  jR2Q   convert each number in [0, 1, ..., Q-1] to its binary digits
xM       xor each binary list
Jakube
źródło
9

CJam, 17 9 bajtów

ri{2b:^}/

lub

ri,2fb::^

Sprawdź to tutaj.

Wyjaśnienie

Wykorzystuje to alternatywną definicję podaną na Wikipedii, opartą na parzystości liczby 1sw reprezentacji binarnej pliku 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.
}/

Rozwiązanie alternatywne zastosowania ,włączyć nbezpośrednio do zakresu [0 ... n-1]przed użyciem infiksowych operatorów do obliczenia binarnego przedstawienia i XOR, bez konieczności stosowania bloku.

Rozwiązania premiowe

Oto kilka rozwiązań opartych na innych definicjach. Jeśli istnieją dwa rozwiązania, krótsze bardzo szybko wysadzi pamięć (ponieważ wstępne obliczenia generują 2^nbity przed obcięciem do n).

Jako L systemu z 0 --> 01i 1 --> 10:

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

Negując i dołączając poprzednią część:

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

Używając relacji rekurencji podanej w wyzwaniu, używając divmodi XOR, aby rozróżnić dwie rekurencyjne definicje:

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

(Chociaż oczywiście ta relacja powtarzalności jest tylko innym sposobem wyrażenia sekwencji Thue-Morse'a jako parzystości 1-bitów w reprezentacji binarnej n.)

Martin Ender
źródło
Rozwiązanie, które marnowało pamięć, było moją pierwszą myślą, ale pomyślałem, że użycie ponad połowy terabajta pamięci do obliczenia wyniku 42(przy założeniu zestawu bitów) byłoby dość nieracjonalne.
JohnE
@JohnE Problem rozwiązany. ;)
Martin Ender,
:^czyni mnie szczęśliwym. Z drugiej strony, cholera, to fajny algorytm.
pozew funduszu Moniki
@QPaysTaxes nie :^}?
TheLethalCoder,
1
@ TheLethalCoder To mnie też cieszy
pozew
8

Dyalog APL, 8 7 bajtów

≠⌿⍴∘2⊤⍳

Jest to monadyczny ciąg, który oczekuje, że indeks zacznie od 0 ( ⎕IO←0). Równoważną funkcją inną niż pociąg jest {≠⌿(⍵⍴2)⊤⍳⍵}.

Wyjaśnienie:

      ⍳      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

Dane wyjściowe to lista rozdzielona spacjami 0 i 1. Wypróbuj tutaj .

lirtosiast
źródło
8

Mathematica, 35 21 bajtów

Mathematica ma wbudowaną sekwencję Thue-Morse!

Array[ThueMorse,#,0]&

Oryginalna odpowiedź:

#&@@@DigitCount[Range@#-1,2]~Mod~2&
alephalpha
źródło
7

LabVIEW, 15 Prymitywów LabVIEW

teraz jako super fantazyjny gif z sondą

enter image description here

Eumel
źródło
3
Czy możesz wyjaśnić, w jaki sposób zostanie to przetestowane?
JohnE
opcja 1: pobierz wersję testową labview i przebuduj ją, opcja: zasugeruj sposób, w jaki mogę wysłać to do Ciebie jako .exe lub .vi (w przypadku tego drugiego musisz również uzyskać
labview
1
Naprawdę chciałbym tylko zobaczyć, jak to się zachowuje, gdy działa. Czy nagrywanie GIF-a byłoby ilustracyjne?
JohnE
ten świetny pomysł właśnie to zrobiłem i za chwilę go
wzmocnię
6

J, 12 11 bajtów

@ MartinBüttner zapisał bajt.

~:/@#:"0@i.

Jest to funkcja monadyczna (czyli jednoargumentowa), używana w następujący sposób:

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

Wyjaśnienie

Używam alternatywnej definicji, że T n jest parzystością liczby 1 bitów w binarnej reprezentacji 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.
Zgarb
źródło
{.(,-)^:]działa dla 9 bajtów z pewnym rozciąganiem reguł ( co jest dozwolone ). Np. Dla 5wyjść 5 _5 _5 5 _5. (Dodano tylko jako komentarz ze względu na rozciąganie reguły.)
randomra
4

Pyth, 11 10 bajtów

m%ssM.Bd2Q

Dane wyjściowe w postaci listy w stylu Pythona.

lirtosiast
źródło
Próbowałem użyć XOR zamiast ciągu binarnego, ale nie wiem wystarczająco dużo o Pyth, aby to zrobić. To i tak jest znacznie krótsze. +1
ETHproductions
@FryAmTheEggman Ach, nie wiedziałem o tym, Fponieważ szukałem słowa „redukuj”. Możesz opublikować jako CW ...
lirtosiast
4

Japt , 29 11 bajtów

Uo ®¤¬r@X^Y

Wypróbuj online!

Wyprowadza bezpośrednio jako tablicę, która oszczędza około 4 bajtów.

Bez golfa i wyjaśnienia

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

Edycja: Możesz teraz użyć następującego 8-bajtowego kodu (niepoprawny; funkcja opublikowana po tym wyzwaniu):

Uo ®¤¬r^
ETHprodukcje
źródło
warto zaktualizować wyjaśnienie
Eumel,
@Eumel już to zrobiłem ...?
ETHproductions
kod, który wyjaśnisz, i powyższy kod wyglądają inaczej
Eumel
@Eumel Tam jest lepiej?
ETHproductions
to idealne :)
Eumel
4

Haskell, 39 36 35 bajtów

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

Wypróbuj online!

Jak to działa: zacznij od [0] i zastosuj czasy x ++ invert x-funkcji n. Weź pierwsze nelementy z wynikowej listy. Dzięki lenistwu Haskella nobliczane są tylko pierwsze elementy. Uwaga: pierwszy<*> znajduje się w kontekście funkcji, drugi w kontekście listy.

W przypadku GHC 8.4 (który nie był dostępny w momencie wyzwania) istnieje rozwiązanie 34-bajtowe:

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

Edycja: -3 odpowiednio. -4 bajty dzięki @Laikoni. -1 bajt dzięki @ Ørjan Johansen.

nimi
źródło
(\x->x++map(1-)x)można skrócić do ([id,(1-)]<*>)lub (id<>map(1-))z GHC 8.4.
Laikoni
take<*>(iterate([id,(1-)]<*>)[0]!!)
Ørjan Johansen
3

Haskell, 54 bajty

Mniej zwarty niż rozwiązanie nich, ale nie chciałem odmawiać ci tego funkcjonalnego zaciemnienia kodu. Działa dla dowolnej pary obiektów; np. możesz wymienić(f 0.f 1) przez (f 'A'.f 'B').

Na podstawie definicji, że pierwsze 2 n cyfrach następuje ta sama sekwencja cyfr odwrócona. Tworzymy dwie listy obok siebie; jeden dla sekwencji, jeden dla odwrotności. Ciągle dołączamy coraz dłuższe części jednej listy do drugiej.

Implementacja składa się z trzech definicji:

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

Funkcja tprzyjmuje dowolną liczbę i zwraca sekwencję Thue-Morse o tej długości. Pozostałe dwie funkcje są pomocnikami.

  • Funkcja freprezentuje dowolną listę; f 0jest dla sekwencji,f 1 dla odwrotności.
  • Funkcjonować g zajmuje się dodawaniem coraz dłuższych powtórzeń jednej listy do drugiej.

Skrzypek: http://goo.gl/wjk9S0

Ruud Helderman
źródło
2

Burleska, 21 bajtów

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

Przykłady:

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}

Wyjaśnienie:

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

Bez tej jri.+części zabraknie ci pamięci (ponieważ obliczy Morse'a sekwencję długości niewiarygodnie ogromną liczbę ). Ale ponieważ Burleska jest leniwy, wystarczy poprosić o pierwszy n-element.

mroman
źródło
Miły. Podobne do mojego rozwiązania Haskell. Jednak powtarzam tylko 99 razy, aby zapisać jeden bajt.
nimi
2

K5, 27 13 bajtów

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

Obliczanie sekwencji jest dość łatwe, problemem jest zbyt duże unikanie obliczeń. Możemy rozpoznać, że łatwe rozszerzenie sekwencji daje nam ciąg ciągów, które są kolejnymi potęgami o długości dwóch. Biorąc logarytmiczną bazę 2 danych wejściowych i zaokrąglając w górę da nam wystarczająco dużo do pracy, a następnie możemy przyciąć ją do odpowiedniego rozmiaru:

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

Edytować:

Rozwiązanie oparte na parzystości:

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

W akcji:

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

Zauważ, że ponieważ K5 nie ma arbitralnej operacji przekształcenia w binarną operację podstawową, muszę określić, na przykład, dekodowanie 64-bitowe. K5 nie używa matematyki o dowolnej precyzji, więc będzie limit wielkości danych wejściowych, z którymi możemy sobie poradzić w każdym przypadku.

JohnE
źródło
2

Oktawa, 33 31 bajtów

Zaoszczędzono 2 bajty dzięki Thomasowi Kwa.

@(n)mod(sum(dec2bin(0:n-1)'),2)
alephalpha
źródło
2

Perl 5, 62 49 bajtów

Tak, nie jest to najlepszy język dla tego języka, ale nadal podoba mi się sposób, w jaki wyszedł. Wymaga 5.14+ dla /ri say.

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

Korzystanie z definicji parzystości wymaga wersji 5.12+ dla say:

sub{say map{sprintf("%b",$_)=~y/1//%2}0..$_[0]-1}
Hobbs
źródło
2

Prolog (SWI), 115 bajtów

Kod:

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

Wyjaśnił:

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

Przykład:

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

Wypróbuj online tutaj

Emigna
źródło
2

Siatkówka , 70 69 bajtów

Wykorzystanie definicji jako systemu L z początkowymi słowami 0i produkcjami 0 --> 01oraz 1 --> 10.

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

Dane wejściowe są pobierane w jednoskładnikowa .

Możesz uruchomić kod z jednego pliku z -sflagą. Lub po prostu spróbuj online.

Wyjaśnienie

^
0;

Przechodzi 0;do wejścia, gdzie 0jest początkowe słowo i ;jest tylko separatorem.

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

(Wskazuje, że jest to początek pętli (która powtarza się aż pętla przestaje zmieniając ciąg). Sam ten etap włącza 0i 1na ai bodpowiednio (bod rozszerza się 0-9). Robi to tak długo, jak bieżące słowo (którego długość jest mierzona, (.)+jest krótsze niż wejście (tj. Dopóki nie możemy odczytać końca łańcucha, dopasowując tyle 1s, ile mamy w słowie).

a
01

Zastąpić a (stand-in 0) na 01.

)`b
10

Wymień b(stand-in na1 ) na 10. To także koniec pętli. Pętla kończy się, gdy warunek na etapie transliteracji nie powiedzie się, ponieważ wtedy wszystkie 0s i 1s pozostaną niezmienione, a pozostałe dwa etapy nie znajdą nic pasującego.

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

Ostatnim krokiem jest obcięcie słowa do długości wejścia. Tym razem mierzymy długość wejścia za pomocą(.)+ wyprzedzeniem. Następnie dopasowujemy tyle znaków od początku łańcucha.

Martin Ender
źródło
2

Ruby, 33

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

Zadzwoń tak:

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

Wykorzystuje fakt, że parzystość liczb binarnych tworzy sekwencję thue-Morse.

Znak separatora to znak nowej linii. Konwertuje liczbęi na ciąg binarny, a następnie oblicza sumę wszystkich kodów ASCII, modulo 2.

Jeśli znak nowej linii nie jest akceptowalnym separatorem, poniższe nie ma separatora dla dodatkowych 2 bajtów:

->n{n.times{|i|$><<("%b"%i).sum%2}}
Level River St
źródło
2

MATL , 9 bajtów

Ten język został zaprojektowany po wyzwaniu .

Podejdź 1: 13 bajtów

To buduje sekwencję, łącząc zanegowane kopie bloków o rosnących rozmiarach.

itBFw"t~h]w:)

Przykład

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

Wyjaśnienie

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

Podejdź 2: 9 bajtów

To używa tego samego podejścia, co odpowiedź Alephalpha .

i:1-B!s2\

Przykład

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

Wyjaśnienie

i           % input "N" 
:1-         % create vector 0, 1, ..., N-1
B           % convert to binary
!           % tranpose
s           % sum
2\          % modulo 2
Luis Mendo
źródło
2

C, 88 83 bajtów

Oblicza parzystość dla każdej pozycji.

i,j;main(int c,char**a){for(;i<atoi(a[1]);putchar(c))for(c=48,j=i++;j;j&=j-1)c^=1;}

Fiddle: http://goo.gl/znxmOk

Ruud Helderman
źródło
2

Galaretka , 4 bajty

ḶB§Ḃ

Pamiętaj, że to wyzwanie jest starsze niż galaretka.

Wypróbuj online!

Jak to działa

Ḷ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.
Dennis
źródło
1

Matlab, 42

Korzystam z faktu, że jest to to samo, co na początku, 0a następnie powtarzam krok dodawania uzupełnienia bieżącej serii nrazy.

t=0;for k=1:input('');t=[t;~t];end;disp(t)
wada
źródło
Można zastąpić disp (t) przez t Myślę, że ...
AlexR
1

Bash, 71 66 bajtów

Na podstawie definicji, że po pierwszych 2 n cyfrach następuje ta sama sekwencja cyfr odwrócona.

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

$1 jako parametr jest pożądaną liczbą cyfr.

Fiddle: http://goo.gl/RkDZIC

Ruud Helderman
źródło
1

Partia, 115 + 2 = 117 bajtów

Na podstawie odpowiedzi 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!

Potrzebuje dodatkowej /Vinwokacji, aby umożliwić użycie !s.

Neil
źródło
1

ES6, 53 bajty

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

Rekurencja wydawała się prostsza niż pętla.

Neil
źródło
1

Par , 8 bajtów

✶u[Σ_✶¨^

Wyjaśnienie:

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

Wyprowadza coś takiego:

(0 1 1 0 1 0 0 1)
Lynn
źródło
1

Matematyka ++ , 86 bajtów

Używa 0.0\ndla 0 i 1.0\ndla 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>$
SuperJedi224
źródło
1

Arcyóu , 50 55 bajtów

Musiałem dodać 5 bajtów, aby działało poprawnie :(

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

Objaśnienie (z pseudokodem Pythonesque z boku:

(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
bkul
źródło