Sekwencja zawiera dziesiętną reprezentację liczb binarnych postaci: 10101...
gdzie n-ty składnik ma n bitów.
Sekwencja jest prawdopodobnie najłatwiejsza do wyjaśnienia, po prostu pokazując związki między reprezentacjami liczb binarnych i dziesiętnych:
0 -> 0
1 -> 1
10 -> 2
101 -> 5
1010 -> 10
10101 -> 21
101010 -> 42
Wyzwanie:
Weź wejściową liczbę całkowitą n
i zwróć pierwsze n liczb w sekwencji. Możesz wybrać sekwencję 0-indeksowaną lub 1-indeksowaną.
Przypadki testowe:
n = 1 <- 1-indexed
0
n = 18
0, 1, 2, 5, 10, 21, 42, 85, 170, 341, 682, 1365, 2730, 5461, 10922, 21845, 43690, 87381
Wyjaśnienia są zachęcane, jak zawsze.
To jest OEIS A000975 .
[85,[42,[21,[10,[5,[2,[1,0]]]]]]]
?Odpowiedzi:
Python 2 , 36 bajtów
Wypróbuj online! Objaśnienie: Binarna reprezentacja polega na tym, że wystarczy pomnożyć ją przez odpowiednią potęgę 2 i wziąć część całkowitą.2)3)
0.101010101...
źródło
05AB1E , 4 bajty
2 bajty zapisane przy użyciu sztuczki Neila 2/3
Wypróbuj online!
Wyjaśnienie
05AB1E , 6 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Galaretka ,
...4 bajtyDzięki mile za -1 bajtów!
Wypróbuj online!
Wyjaśnienie:
Galaretka , 4 bajty
Wersja Jonathana Allana.
Wypróbuj online!
Wersja oparta na sztuczce Neila 2/3 daje 5 bajtów, zobacz historię zmian.
źródło
ḶḂḄƤ
Prefiks szybki został zrobiony w tym celuḶ€ḂḄ
działałoby.MATL , 5 bajtów
Na podstawie odpowiedzi Neila .
Wyjaśnienie
Wypróbuj online!
MATL , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 ,
453736 bajtów-3 bajty dzięki user202729
-1 bajtów dzięki matmandan
Wypróbuj online!
źródło
s
jest równoznaczne z dodawaniems
do siebie, więc uważam, że możesz zrobić,s+=s+~s%2
aby uratować bajt.Python 3,
6861544843 bajtówPodziękowania dla user202729 za pomoc w oszczędzaniu 19 bajtów i ovs za pomoc w oszczędzaniu 6 bajtów.
Wypróbuj online
źródło
x == 0
jest równoważnenot x
ifx
jest liczbą całkowitą, zamiana operandów (tj.x if c else y
=y if not c else x
) Pozwoli zaoszczędzić trochę więcej bajtów.i%2
i użyć1-r%2
zamiast tegoi
.Łuska , 7 bajtów
Wypróbuj online!
Na podstawie 1, więc wejście n daje pierwsze n wyników.
Wyjaśnienie
źródło
APL (Dyalog Unicode) , 11 bajtów SBCS
Przyjmuje się
⎕IO
( I ndex O rigin)0
, co jest domyślne w wielu systemach. Anonimowa ukryta funkcja prefiksu. 1-indeksowany.Wypróbuj online!
⍳
d ndices 0… n − 1(
…)¨
Zastosuj następującą funkcję ukrytą dla każdego⍴∘1 0
cyklicznie przekształcaj listę[1,0]
do tej długości2⊥
konwersja z bazy-2 (binarnej) na liczbę normalnąźródło
Perl
v5.10
-n
, 24 + 1 bajtów-3 bajty dzięki Nahuelowi Fouilleulowi !
Wypróbuj online!
Ta sama logika co moja wersja Ruby, ale krótsza, ponieważ perl jest bardziej zwięzły. Z jakiegoś dziwnego powodu,
print
nie zrobiłby SEPERATOR (psiakrew!), Więc musiałem skorzystaćsay
zv5.10;
celem tego uciekać, ja nie wiem, jak zdobyć to, więc wyjeżdżam go teraz ?. ..Wyjaśnienie
źródło
-n
) = 28 bajtów, ponieważ aby uruchomić jeden liniowy perl, należy użyć-e
i użyć 5.10, wystarczy użyć-E
, która jest tej samej długości$|--
zamiast($.^=1)
Haskell , 33 bajty
Wypróbuj online!
źródło
APL (Dyalog) , 7 bajtów
Wypróbuj online!
APL (Dyalog) , 11 bajtów
Wypróbuj online!
Zastosowania
⎕IO←0
.źródło
⎕IO←0
(ale twierdz, że jest indeksowany 1) i zmień0,
na1+
:(2⊥2|⍳)¨1+⍳
C ,
81 5559 bajtów1 indeksowany.
Pełny program, mniej golfa:
Wypróbuj online!
EDYCJA 2: Zakładałem, że funkcje nie muszą być wielokrotnego użytku teraz, kiedy o tym myślę, to jest całkowicie sensowne, że będą musiały być wielokrotnego użytku: P
EDYCJA: Miałem błędne przekonanie, że musiałem uwzględnić cały program w odpowiedzi, okazuje się, że potrzebowałem tylko funkcji, która to robi. To miłe.
Jestem całkiem pewien, że mogę zgolić kilka bajtów tu i tam. Użyłem już kilku sztuczek. Duża część programu jest poświęcona zdobyciu argumentu i przekształceniu go w int. To jest mój pierwszy golfowy kod. Jeśli coś robię źle, powiedz mi: P
źródło
i++
i zmieniająci&1
nai++&1
. Ponadto, mimo że jako zmienne globalnei
ij
początkowo są inicjowane do zera, muszą być inicjowane wewnątrz funkcji, ponieważ przesłanie funkcji musi być wielokrotnego użytku .i,j;f(c){for(i=j=0;i<c;)printf("%d ",j+=j+i++%2);}
Wypróbuj online!Haskell ,
47405349444034 bajtów-4 bajty dzięki użytkownikowi202729
-6 bajtów dzięki Laikoni
Wypróbuj online!
źródło
otherwise
np.1>0
(otherwise == True
)Rubinowy , 26 bajtów
Wypróbuj online!
Pokonuje wszystkie starsze rubinowe odpowiedzi.
Wyjaśnienie
1/3
wygląda na dwójkowy0.01010101...
, więc jeśli pomnożymy to przez potęgę dwóch, otrzymamy:Ale Ruby podaje liczby przy podziale wewnętrznym, podając mi potrzebną sekwencję.
źródło
J , 9 bajtów
Jak to działa?
i.
- lista 0..n-12|
- elementy listy mod 2\
- wszystkie prefiksy#.
- po przecinku[:
- ogranicza widelec (ponieważ mam parzystą liczbę (4) czasowników)Wypróbuj online!
źródło
Siatkówka , 28 bajtów
Wypróbuj online!
Oparte na 0, więc wejście n daje pierwsze n + 1 wyników.
Wyjaśnienie
Wykorzystuje rekurencję z OEIS:
Przejdźmy przez program:
Jest to stały etap: odrzuca dane wejściowe i ustawia ciąg roboczy
0
na wartość początkową sekwencji.)
Otacza ten etap w grupie. Ta grupa sama nie robi nic, ale prawie każdy etap (w tym etapy grupy) zapisuje swój wynik w dzienniku, a0
do działania programu potrzebujemy dwóch kopii tego dziennika.Jest tu kilka konfiguracji:
"$+"+
owija scenę w pętlę."$+"
Są traktowane jako zmiany i$+
oznacza wejście programu, to znaczy n . Oznacza to, że pętla jest uruchamiana n razy.Następnie
¶<
owija każdą iterację w stopień wyjściowy, który drukuje dane wejściowe stopnia z końcowym przesuwem linii (więc pierwsza iteracja drukuje zero, druga iteracja drukuje wynik pierwszej iteracji itd.).Sam etap zastępuje cały ciąg roboczy podstawieniem w ostatnim wierszu. Ten korzysta z niejawnego nawiasu zamykającego i niejawnych argumentów dla operatora powtarzania
*
, więc w rzeczywistości jest to skrót od:Elementy w nawiasach można podzielić na trzy części:
$&*_
: daje ciąg (n-1)_
s._
: daje singiel_
.2*$-1*_
: daje ciąg 2 * a (n-1)_
.$-1
Odnosi się do wyniku przedostatniego w dzienniku wynikowego, czyli iteracji pętli przed ostatnim. Dlatego musieliśmy na początku skopiować zero w logu, w przeciwnym razie odnosi się to do danych wejściowych programu przy pierwszej iteracji.Następnie
$.(…)
mierzy długość wynikowego ciągu. Innymi słowy, obliczyliśmya(n) = a(n-1) + 1 + 2*a(n-2)
przechodząc przez jednoargumentowy (ale nie bardzo:$.(…)
jest leniwy i tak naprawdę nie ocenia jego zawartości, jeśli może określić wynikową długość bezpośrednio za pomocą arytmetyki, więc jest to nawet całkiem wydajne).Wynik końcowej iteracji pętli ( n + 1- ty element sekwencji) jest drukowany z powodu niejawnego wyjścia Retiny na końcu programu.
źródło
Brain-Flak , 36 bajtów
Wypróbuj online!
Wyjaśnienie:
Kolejną liczbę w sekwencji uzyskuje się za pomocą
n*2+1
lubn*2+0
.źródło
Rubin
42 41 43 41 37 35 31 3330 bajtów-2 bajty dzięki Unihedron
-3 bajty dzięki GB
Wypróbuj online!
źródło
->x{a=0;x.times{a-=~a+p(a)%2}}
> <> , 22 + 3 (flaga -v) bajtów
Wypróbuj online!
Wyjaśnienie
Stos zostanie zainicjowany za pomocą licznika pętli.
źródło
Java 8,
115818052 bajtówPort odpowiedzi @Neil na Python 2 .
1 indeksowane i wyprowadzane bezpośrednio, każda wartość w oddzielnej linii.
Wyjaśnienie:
Wypróbuj online.
Odpowiedź na stare 80 bajtów:
1 indeksowane wejście i rozdzielane spacjami
String
wyjścieWyjaśnienie:
Wypróbuj online.
źródło
Perl 6 ,
35 30 27 2520 bajtówWypróbuj (35)
Wypróbuj (30)
Wypróbuj (30)
Wypróbuj (27)
Wypróbuj (25)
Wypróbuj (20)
Rozszerzony:
źródło
Python 2 , 33 bajty
Wypróbuj online!
Python 2 , 34 bajty
Wypróbuj online!
Zwraca w odwrotnej kolejności.
źródło
C,
4746 bajtówAkumulator
a
zaczyna się od zera. Na każdym kroku podwajamy go (a+=a
) i dodajemy jeden, jeśli poprzedni najmniej znaczący bit wynosił zero (!(a%2)
lub równoważnie,-(~a)%2
).Program testowy
Wyniki
źródło
Japt ,
10976 bajtówWszystkie pochodzą niezależnie od innych rozwiązań.
1-indeksowany.
Spróbuj
Wyjaśnienie
Spróbuj
Wersja 7-bajtowa
Spróbuj
Wersja 9-bajtowa
Spróbuj
źródło
Haskell , 52 bajty
Wypróbuj online!
źródło
MATL , 7 bajtów
Wypróbuj online!
Wyjaśnienie:
Dane wyjściowe byłyby,
0, 1, 2, 5 ...
gdybyP
zostały dodane na końcu (flip
), co daje 8 bajtów.źródło
&+
Rubin
-n
,3230 + 1 bajtówPonieważ mamy dokładnie 1 linię wprowadzania,
$.
jest bosko wygodne!EDYCJA: Dziwię się, że sam zdołałem wygrać z golfem, ale wydaje się, że użycie,
-n
które liczy się jako 1 (zgodnie z regułą 2 w domyślnych specjalnych warunkach , ponieważ Ruby można uruchomić zruby -e 'full program'
(a więc-n
1), których wszystkie wystąpieniagets
są używane tylko raz zostań golfem w dół 1 char w ten sposób; Wierzę, że jest to kamień milowy dla ruby, proszę głośno, jeśli nie zgadzasz się z tym tokiem myślenia, zanim będę go ponownie używać w przyszłości)Wypróbuj online!
Wyjaśnienie
źródło
AWK
a=0
, 31 bajtówWypróbuj online!
Używa formuły bezwstydnie skradzionej z tej drugiej odpowiedzi Ruby.
Chociaż nie
a=0
działałby (awk traktuje „pusty” jako 0), pierwszy element 0 nie zostanie wydrukowany i zamiast tego będzieempty
wierszem, który, jak twierdzę, jest prawidłowym wyjściem, prawdopodobnie nie przejdzie, więc jest to,a=0
co może wstawić jako argument wiersza poleceń.źródło
C, 52 bajty
1-indeksowany
Wypróbuj online!
źródło
pieprzenie mózgu , 40 bajtów
Wypróbuj online!
0-indeksowane. Wprowadź jako kod char, wyślij jako unarny z bajtami zerowymi oddzielającymi serię kodu char 1s. Zakłada komórki 8-bitowe, chyba że chcesz wprowadzić więcej niż 255. Zakłada komórki ujemne, chociaż można to naprawić kosztem kilku bajtów.
Poprzednio 50 bajtów
Wypróbuj online!
Wejścia jako kod char, wyjścia jako kod char. 1-indeksowany. Prawdopodobnie można trochę zagrać w golfa.
@Unihedron wskazuje, że zapomniałem podać, że wymaga to komórek o nieskończonych rozmiarach, w przeciwnym razie osiągnie ósmą liczbę.
źródło