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>



1
prościej mówiąc: funkcja jest rekurencyjna, zaneguj dane wejściowe i dołącz je.
Eumel,


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

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


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 .


8

Mathematica, 35 21 bajtów

Mathematica ma wbudowaną sekwencję Thue-Morse!

Array[ThueMorse,#,0]&

Oryginalna odpowiedź:

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

7

LabVIEW, 15 Prymitywów LabVIEW

teraz jako super fantazyjny gif z sondą

enter image description here


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.

{.(,-)^:]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.


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^

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.


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



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.


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.


2

Oktawa, 33 31 bajtów

Zaoszczędzono 2 bajty dzięki Thomasowi Kwa.

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

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}

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


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.


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

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


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.

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)

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


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.


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.


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)


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.