Rekurencyjny opis binarny
Niedawno włożyłem swój pierwszy wkład w OEIS, rozszerzając i dodając plik b do sekwencji A049064 . Sekwencja zaczyna się od 0
, a następnie uzyskiwane są kolejne wartości z „binarnego opisu” ostatniego elementu.
Na przykład drugi termin byłby 10
, ponieważ był jeden 0
w pierwszym elemencie. Trzeci termin byłby 1110
, ponieważ był jeden 1
i jeden 0
. Czwarty byłby 11110
. ponieważ są trzy ( 11
binarnie!) 1
i jeden 0
. Poniżej znajduje się podział piątego terminu, aby wyjaśnić ten proces:
> 11110
> 1111 0 (split into groups of each number)
> 4*1 1*0 (get count of each number in each group)
> 100*1 1*0 (convert counts to binary)
> 100110 (join each group back together)
Oto przykład przejścia od szóstej do siódmej kadencji:
> 1110010110
> 111 00 1 0 11 0
> 3*1 2*0 1*1 1*0 2*1 1*0
> 11*1 10*0 1*1 1*0 10*1 1*0
> 111100111010110
Możesz sprawdzić program referencyjny φ zrobiłem do obliczania terminów.
Twoja praca
Musisz utworzyć program lub funkcję, która przyjmuje liczbę n
za pomocą standardowych argumentów wejściowych lub funkcyjnych i wypisuje sekwencję od 1st
terminu do (n+1)th
terminu, oddzielone znakiem nowej linii. Jeśli chcesz rzucić okiem na niższe liczby, możesz odnieść się do pliku b ze strony OEIS. Jednak Twój program / funkcja powinna obsługiwać 0 <= n <= 30
, tj. Do 31 kadencji. To niemały wyczyn, bo A049064(30)
ma ponad 140 000 cyfr δ . Jeśli chcesz zobaczyć, jaki powinien być 31 termin, umieściłem go na Pastebin .
Przykład I / O
func(10)
0
10
1110
11110
100110
1110010110
111100111010110
100110011110111010110
1110010110010011011110111010110
1111001110101100111001011010011011110111010110
1001100111101110101100111100111010110111001011010011011110111010110
func(0)
0
func(3)
0
10
1110
11110
Jest tylko jedna zasada: brak standardowych luk!
To jest golf golfowy , więc wygrywa najmniejsza liczba bajtów.
φ - Gist można znaleźć tutaj , a tutaj jest demo ideone .
δ - Na wypadek, gdybyś się zastanawiał, moje szacunki dotyczące długości 100 wyrażenia określają go na około 3,28 x 10 250 znaków, co byłoby całkiem sporo do obliczenia.
[0]\n[1, 0]\n[1, 1, 1, 0]\n...
Odpowiedzi:
CJam,
1817 bajtówDzięki @ MartinBüttner za grę w golfa jednym bajtem!
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Pyth,
1817 bajtówWypróbuj online: demonstracja
Dzięki @isaacg za zapisanie jednego bajtu.
Wyjaśnienie:
Wykorzystuje to fakt, że 0 i 1 w systemie binarnym to także 0 i 1.
źródło
V
zamiast.u
:J]0VQjk~JsjR2srJ8
Python 2,
125116110 bajtówZaoszczędzono 1 bajt dzięki @ Sp3000 i 5 bajtów, usuwając zbędne
int
wywołanie.Starsza wersja:
Zaoszczędź wiele, wiele bajtów dzięki @ Vioz-!
Orginalna wersja:
źródło
Rubinowy,
807269 bajtówJako funkcja:
Nazwij to na przykład za pomocą:
f[6]
źródło
->m{l=?0;0.upto(m){puts l;l.gsub!(/1+|0+/){$&.size.to_s(2)+$&[0]}}}
upto
i!
- Dzięki :)Python 2, 102 bajty
Jakoś połączenie
itertools
bycia dłuższym niżre
igroupby
zwracaniegrouper
obiektów oznacza, że użycie wyrażenia regularnego jest nieco krótsze ...źródło
Kobra - 128
źródło
Haskell,
136130 bajtówźródło