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ą 0
i 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 0
do 2**m-1
i 2**m to 2**(m+1)-1
są uzupełnieniami binarnymi. Więc 0
następuje 1
, 01
następuje 10
, 0110
następuje 1001
, i, przeskakując nieco dalej, 0110100110010110
następuje 1001011001101001
.
Wyzwanie polega na napisaniu programu lub funkcji, która wypisze sekwencję Thue-Morse'a dla pierwszych n
elementów, gdzie n
jest 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
n
elementami 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>
Odpowiedzi:
Pyth, 6 bajtów
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:
źródło
CJam,
179 bajtówlub
Sprawdź to tutaj.
Wyjaśnienie
Wykorzystuje to alternatywną definicję podaną na Wikipedii, opartą na parzystości liczby
1
sw reprezentacji binarnej plikun
.Rozwiązanie alternatywne zastosowania
,
włączyćn
bezpoś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^n
bity przed obcięciem don
).Jako L systemu z
0 --> 01
i1 --> 10
:Negując i dołączając poprzednią część:
Używając relacji rekurencji podanej w wyzwaniu, używając
divmod
i XOR, aby rozróżnić dwie rekurencyjne definicje:(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
.)źródło
42
(przy założeniu zestawu bitów) byłoby dość nieracjonalne.:^
czyni mnie szczęśliwym. Z drugiej strony, cholera, to fajny algorytm.:^}
?Dyalog APL,
87 bajtówJest 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:
Dane wyjściowe to lista rozdzielona spacjami
0
i1
. Wypróbuj tutaj .źródło
Mathematica,
3521 bajtówMathematica ma wbudowaną sekwencję Thue-Morse!
Oryginalna odpowiedź:
źródło
LabVIEW, 15 Prymitywów LabVIEW
teraz jako super fantazyjny gif z sondą
źródło
J,
1211 bajtów@ MartinBüttner zapisał bajt.
Jest to funkcja monadyczna (czyli jednoargumentowa), używana w następujący sposób:
Wyjaśnienie
Używam alternatywnej definicji, że T n jest parzystością liczby 1 bitów w binarnej reprezentacji n.
źródło
{.(,-)^:]
działa dla 9 bajtów z pewnym rozciąganiem reguł ( co jest dozwolone ). Np. Dla5
wyjść5 _5 _5 5 _5
. (Dodano tylko jako komentarz ze względu na rozciąganie reguły.)Pyth,
1110 bajtówDane wyjściowe w postaci listy w stylu Pythona.
źródło
F
ponieważ szukałem słowa „redukuj”. Możesz opublikować jako CW ...Japt ,
2911 bajtówWypróbuj online!
Wyprowadza bezpośrednio jako tablicę, która oszczędza około 4 bajtów.
Bez golfa i wyjaśnienia
Edycja: Możesz teraz użyć następującego 8-bajtowego kodu (niepoprawny; funkcja opublikowana po tym wyzwaniu):
źródło
Haskell,
393635 bajtówWypróbuj online!
Jak to działa: zacznij od
[0]
i zastosuj czasyx ++ invert x
-funkcjin
. Weź pierwszen
elementy z wynikowej listy. Dzięki lenistwu Haskellan
obliczane 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:
Edycja: -3 odpowiednio. -4 bajty dzięki @Laikoni. -1 bajt dzięki @ Ørjan Johansen.
źródło
(\x->x++map(1-)x)
można skrócić do([id,(1-)]<*>)
lub(id<>map(1-))
z GHC 8.4.take<*>(iterate([id,(1-)]<*>)[0]!!)
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:
Funkcja
t
przyjmuje dowolną liczbę i zwraca sekwencję Thue-Morse o tej długości. Pozostałe dwie funkcje są pomocnikami.f
reprezentuje dowolną listę;f 0
jest dla sekwencji,f 1
dla odwrotności.g
zajmuje się dodawaniem coraz dłuższych powtórzeń jednej listy do drugiej.Skrzypek: http://goo.gl/wjk9S0
źródło
Pari / GP , 33 bajty
Wypróbuj online!
źródło
Burleska, 21 bajtów
Przykłady:
Wyjaśnienie:
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.źródło
K5,
2713 bajtówObliczanie 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:
Edytować:
Rozwiązanie oparte na parzystości:
W akcji:
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.
źródło
Oktawa,
3331 bajtówZaoszczędzono 2 bajty dzięki Thomasowi Kwa.
źródło
Perl 5,
6249 bajtówTak, nie jest to najlepszy język dla tego języka, ale nadal podoba mi się sposób, w jaki wyszedł. Wymaga 5.14+ dla
/r
isay
.Korzystanie z definicji parzystości wymaga wersji 5.12+ dla
say
:źródło
Prolog (SWI), 115 bajtów
Kod:
Wyjaśnił:
Przykład:
Wypróbuj online tutaj
źródło
Siatkówka ,
7069 bajtówWykorzystanie definicji jako systemu L z początkowymi słowami
0
i produkcjami0 --> 01
oraz1 --> 10
.Dane wejściowe są pobierane w jednoskładnikowa .
Możesz uruchomić kod z jednego pliku z
-s
flagą. Lub po prostu spróbuj online.Wyjaśnienie
Przechodzi
0;
do wejścia, gdzie0
jest początkowe słowo i;
jest tylko separatorem.(
Wskazuje, że jest to początek pętli (która powtarza się aż pętla przestaje zmieniając ciąg). Sam ten etap włącza0
i1
naa
ib
odpowiednio (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 tyle1
s, ile mamy w słowie).Zastąpić
a
(stand-in0
) na01
.Wymień
b
(stand-in na1
) na10
. To także koniec pętli. Pętla kończy się, gdy warunek na etapie transliteracji nie powiedzie się, ponieważ wtedy wszystkie0
s i1
s pozostaną niezmienione, a pozostałe dwa etapy nie znajdą nic pasującego.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.źródło
Ruby, 33
Zadzwoń tak:
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:
źródło
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.
Przykład
Wyjaśnienie
Podejdź 2: 9 bajtów
To używa tego samego podejścia, co odpowiedź Alephalpha .
Przykład
Wyjaśnienie
źródło
C,
8883 bajtówOblicza parzystość dla każdej pozycji.
Fiddle: http://goo.gl/znxmOk
źródło
Galaretka , 4 bajty
Pamiętaj, że to wyzwanie jest starsze niż galaretka.
Wypróbuj online!
Jak to działa
źródło
Matlab, 42
Korzystam z faktu, że jest to to samo, co na początku,
0
a następnie powtarzam krok dodawania uzupełnienia bieżącej seriin
razy.źródło
𝔼𝕊𝕄𝕚𝕟, 11 znaków / 23 bajty (niekonkurencyjny)
Try it here (Firefox only).
Kręgi są w tym mocne.
źródło
Bash,
7166 bajtówNa podstawie definicji, że po pierwszych 2 n cyfrach następuje ta sama sekwencja cyfr odwrócona.
$1
jako parametr jest pożądaną liczbą cyfr.Fiddle: http://goo.gl/RkDZIC
źródło
Partia, 115 + 2 = 117 bajtów
Na podstawie odpowiedzi Bash.
Potrzebuje dodatkowej
/V
inwokacji, aby umożliwić użycie!
s.źródło
ES6, 53 bajty
Rekurencja wydawała się prostsza niż pętla.
źródło
Par , 8 bajtów
Wyjaśnienie:
Wyprowadza coś takiego:
źródło
Matematyka ++ , 86 bajtów
Używa
0.0\n
dla 0 i1.0\n
dla 1źródło
Arcyóu ,
5055 bajtówMusiałem dodać 5 bajtów, aby działało poprawnie :(
Objaśnienie (z pseudokodem Pythonesque z boku:
źródło
Common Lisp , 50 bajtów
Wypróbuj online!
źródło