Uwaga: kiedy mówię „neguj”, mam na myśli zastąpienie wszystkich zerami (tzn. Negacją bitową)
Sekwencja Thue-Morse'a wygląda jak 01101001
Sposób jego generowania to:
Zacznij od przyjęcia 0. Neguj to, co zostało, i dołącz do końca.
Więc weź 0
. Neguj to i dodaj do końca -01
Następnie weź to i zaneguj i dodaj do końca - 0110
I tak dalej.
Inną interesującą właściwością tego jest to, że odległość między zerami tworzy „irracjonalny” i niepowtarzalny ciąg.
Więc:
0110100110010110
|__|_||__||_|__|
2 1 0 2 01 2 <------------Print this!
Czy potrafisz napisać program, który po wprowadzeniu n wypisze pierwsze n cyfr ciągu do wydrukowania?
To jest kod golfowy, więc wygrywa najmniejsza liczba bajtów!
Odpowiedzi:
Galaretka, 9 bajtów
Wypróbuj online!
Jak to działa
źródło
Python
32,104928884 bajtówJest to dość podstawowe rozwiązanie oparte na budowaniu od podstaw trójskładnikowej sekwencji Thue-Morse. Ta sekwencja jest identyczna z zadawaną, chociaż ktoś inny będzie musiał napisać dokładniejsze wyjaśnienie, dlaczego tak jest. W każdym razie ta sekwencja jest tylko trywialną modyfikacją tej, A036580 .
Edycja: Zmieniłem pętlę for na zrozumienie listy, zmieniłem funkcję z programu i całą rzecz na Python 2. Dzięki Dennis za pomoc w grze w golfa.
źródło
Julia,
5650 bajtówJest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca tablicę liczb całkowitych. Aby go wywołać, przypisz go do zmiennej.
Generujemy sekwencję Thue-Morse'a bitów wymieniane zaczynając od liczby całkowitej
m = 1
, następnie dodać1-m
dom
postaci tablicyn+1
czasu, gdzien
jest wejście. To generuje więcej warunków, niż potrzebujemy. Następnie lokalizujemy te za pomocąfind(m)
, uzyskujemy różnicę między kolejnymi wartościami za pomocądiff
i odejmujemy 1 elementarnie. Biorąc pierwszen
warunki wynikowej tablicy daje nam to, czego chcemy.Zaoszczędziłem 6 bajtów i naprawiłem problem dzięki Dennisowi!
źródło
PowerShell, 102 bajty
Trochę inny sposób obliczeń. PowerShell nie ma łatwego sposobu na „uzyskanie wszystkich indeksów w tej tablicy, w których wartość tego indeksu jest równa takiej i takiej ”, więc musimy być nieco kreatywni.
W tym przypadku używamy A001969 , „liczb z parzystą liczbą 1 w ich rozwinięciu binarnym”, które całkowicie przypadkowo dają indeksy 0 w sekwencji Thue-Morse. ;-)
filter
Oblicza tę liczbę. Na przykładx 4
dałbym9
. Następnie po prostu zapętlamy od0
naszego wejścia$args[0]
, odejmując,1
ponieważ jesteśmy indeksowani do zera, a każda iteracja pętli wypisuje różnicę między kolejną liczbą a bieżącą liczbą. Dane wyjściowe są dodawane do potoku i domyślnie dane wyjściowe z nowymi liniami.Przykład
źródło
Haskell, 42 bajty
Przykład użycia:
(`take`l) 7
->[2,1,0,2,0,1,2]
.Jest to realizacja
a036585_list
od A036585 przesunięty w dół0
,1
i2
. Gra w golfa:concat (map f l)
jestf =<< l
if 0=[0,1,2]; f 1=[0,2]; f 2=[1]
jest([[0..2],[0,2],[1]]!!)
.Uwaga:
l
jest sekwencją nieskończoną. Zaimplementowanie funkcji „pierwszeństwon
pierwiastków” zajmuje 10 bajtów lub około 25% .źródło
Mathematica,
796870 bajtówźródło
n<3
.MATL ,
1411 bajtówWypróbuj online!
Jak wskazał @TimmyD w swojej odpowiedzi , pożądana sekwencja jest podana przez kolejne różnice A001969 . Ten ostatni można z kolei uzyskać jako sekwencję Thue-Morse plus 2 * n . Dlatego pożądana sekwencja jest podana przez (kolejne różnice sekwencji Thue-Morse) plus jeden .
Z drugiej strony sekwencję Thue-Morse'a można uzyskać jako liczbę jedynek w binarnej reprezentacji n , zaczynając od n = 0.
źródło
05AB1E ,
1413 bajtówKod:
Wyjaśnienie:
Wypróbuj online!
źródło
Python, 69 bajtów
i
P określenie tej sekwencji1+t(i+1)-t(i)
, gdziet
to funkcja Thue-Morse. Kod implementuje go rekurencyjnie, czyli krócej niżźródło
Mathematica, 65 bajtów
Przebija moją drugą odpowiedź, ale nie pokonuje wyjątkowo
pikantnejwersji gry w golfa. Teraz normalnie wstawiam kod w cudzysłów, a następnie go wyciągam, ponieważ Mathematica uwielbia dodawać spacje do kodu (które nic nie robią), ale nigdy nie zadziera z łańcuchami, ale to nie działa dla kodu, który sam zawiera cudzysłowy ...Cokolwiek, po prostu używam do tego wbudowanej magii. Dane wyjściowe to ciąg znaków.
źródło
Mathematica, 58 bajtów
źródło
1;;#
można po prostu zastąpić;;#
.Position
).Perl, 45 + 2 = 47 bajtów
Wymaga flagi
-p
i-a
:Port odpowiedzi @ Sherlock9
Zaoszczędź 9 bajtów dzięki Ton
źródło
-a
opcja daje ci darmową kopię danych wejściowych, więc$_=2;s/./(1,20,210)[$&]/ge until/.{@F}/;$_=$&
-p
pomocą-E
:say$&
na koniec, jeśli założymy, że Perl> v5.18JavaScript (ES6),
7367 bajtówPort odpowiedzi @ Sherlock9.
edycja: Zapisano 6 bajtów dzięki @WashingtonGuedes.
źródło
!s[n]
działałby zamiasts.length<n
? A może po prostus[n]
z?:
odwrócony?CJam (19 bajtów)
Demo online
Wykorzystuje to podejście polegające na zwiększaniu kolejnych różnic między elementami sekwencji Thue-Morse.
Moje najkrótsze podejście przy użyciu reguł przepisywania to 21 bajtów:
(Ostrzeżenie: wolne). To koduje reguły przepisywania
tak jak
źródło
Rubinowy, 57 bajtów
Port odpowiedzi Python na xnor. Zmiany przeważnie leżą w trójskładnikowych oświadczenie w
t
miejscu zand
powodu0
bycia truthy w Ruby i korzystania(1..n).map
i1+t[i]-t[i-1]
zapisać bajtów vs. importowania listy bezpośrednio ze zrozumieniem.źródło
0
jest prawdą? Jak to działa??Mathematica (
prawieniewerbalny),107110 bajtówSekwencja jest generowana przez wielokrotne stosowanie reguły zastępowania. Kolejna reguła przekształca ją w pożądany wynik. Jeśli wystarczająco dużo osób jest zainteresowanych, wyjaśnię to szczegółowo.
wersja niealfanumeryczna
zgodnie z sugestią CatsAreFluffy.
źródło
$
i wymienić0
zx-x
(gdzie x jest nieużywany sekwencja$
) (i stosowanie(x-x)!
do 1 (jw)), możemy być alfanumeryczny-free.{x__}
zamiast_[x__]
$[_]:=-/;
(oba przez emulację licznika)