Sekwencje
Otrzymasz cztery sekwencje liczb, ponumerowane 1
przez 4
.
OEIS Lokalizacja
0
, kiedy liczby naturalne są wymienione w postaci binarnej. Oto przykład obliczania sekwencji:0,1,10,11,100,101,110,111 ^ ^ ^^ ^ ^ 0 3 78 10 14
Początek sekwencji wygląda następująco:
0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...
OEIS Sekwencja ta obejmuje pierwszą liczbę naturalną, pomija następne dwie, następnie obejmuje kolejne trzy, następnie pomija następne cztery i trwa dalej.
0, 3, 4, 5, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 26, 27, 36, ...
Liczby całkowite dodatnie OEIS, w których zarówno liczba
0
, jak i liczba1
w binarnej reprezentacji liczby są potęgami2
.2, 4, 5, 6, 9, 10, 12, 16, 23, 27, 29, 30, 33, 34, 36, 39,
-
a (1) = a (2) = 1;
a (n) = a (na (n-1)) + a (na (n-2)) dla n> 2.1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 8, 8, 8, 10, 9, 10, 11, 11, 12, 12, 12, 12, 16, 14, ...
Niewiele udowodniono rygorystycznie na temat tej sekwencji, ale istnieje wiele wyników empirycznych. Jedna jest szczególnie ważna i możesz założyć, że jest ważna dla całej serii:
W artykule zaobserwowano, że elementy serii można pogrupować w pokolenia. Jeśli policzymy je od 1, wówczas k- ta generacja zawiera dokładnie 2 k elementów. Właściwą właściwością jest to, że wszystkie liczby w generacji k są uzyskiwane przez zsumowanie dwóch liczb z generacji k-1 i / lub k-2 , ale nigdy z poprzednich generacji. Możesz użyć tej (i tylko tej) obserwacji, aby wyznaczyć dolną granicę pozostałych elementów w sekwencji.
Wyzwanie
Twoim wyzwaniem jest wydrukowanie pierwszych x
liczb na przecięciu podanych sekwencji wejściowych.
Wejście: dwie liczby oddzielone spacją na STDIN
. Pierwsza liczba jest liczbą całkowitą od 1
do 15
włącznie, gdzie każdy bit odpowiada sekwencji. Najniższy bit odpowiada sekwencji 1
, a najwyższy odpowiada sekwencji 4
. Drugi to ilość liczb x
, na których ma zostać wyprowadzone STDIN
.
Wyjście: pierwsze x
liczby, które przecinają dane sekwencje wejściowe. Wydrukuj liczby STDOUT
z dowolną wyraźną białą spacją lub interpunkcją jako separatorem (spacje, tabulatory, znaki nowej linii, przecinki, dwukropki, kropki itp.).
Przykłady
1. Wydrukuj pierwsze 3
liczby w każdej sekwencji.
Wejście: 15 3
Wynik: 10,23,40
2. Wydrukuj pierwsze 12
liczby w numerze sekwencji 1
i 4
.
Wejście: 9 12
Wynik: 3,8,10,14,19,20,21,23,24,31,37,40
3. Wydrukuj pierwsze 10
cyfry po kolei 2
.
Wejście: 2 10
Wynik: 0,3,4,5,10,11,12,13,14,21
4. Wydrukuj pierwsze 6
liczby w sekwencjach 3
i 4
.
Wejście: 12 6
Wynik: 2,4,5,6,9,10
Detale
- Możesz wydrukować dane wyjściowe na bieżąco lub na raz na końcu.
Ogromne podziękowania dla wszystkich, którzy pomogli z tym na czacie! To pytanie bardzo skorzystało z przebywania w piaskownicy .
źródło
12 5
przykładzie do tego samego indeksu, to10
rzeczywiście pojawia się wcześniej9
na skrzyżowaniu ... na przykład, w jaki sposób, przechodząc przez sekwencje, decydując, czy pominąć9
# 3 jako możliwe skrzyżowanie? Jakby gdyby było7
w nim # 3 , musiałbyś go pominąć, ponieważ nie pojawia się w # 4x
?Odpowiedzi:
Haskell,
495442402Działa dość dobrze. Oto kilka przykładów OP:
źródło
Python 3,
590639 znakówJest to proste rozwiązanie: użyj generatorów, aby zdefiniować każdą nieskończoną sekwencję, i dopóki przecięcie nie jest wystarczająco duże, dodaj krok do każdej sekwencji.
Aby uwzględnić nie monotonicznie rosnącą sekwencję Hofstadtera: na każdym kroku generuję dwa razy więcej dla tej sekwencji, np. 1, a następnie 2, 4, 8, 16, 32 itd. Myślę, że spełnia ona granicę podaną w pytaniu i nadal jest wystarczająco szybki dla wszystkich prezentowanych tam przypadków testowych.
źródło
from itertools import count as C
->from itertools import*
C=count
,def s(i):return D(i)==1
->s=lambda i:D(i)==1
(nawet nie sądzę, że ta funkcja jest krótsza ...),"{0:04b}".format(int(L)))if U>'0'
->"{0:04b}".format(int(L)))if'0'<U
C #, 1923
Prawdopodobnie nie będzie to najkrótszy program, ale wyzwanie było dla mnie interesujące, więc oto moje rozwiązanie.
Uruchamianie wszystkich 4 z 35 liczbami (15 35) zajmuje około 5 sekund.
Możesz to przetestować tutaj , ale pamiętaj, że jeśli chcesz OEIS4, liczba cyfr, które chcesz, musi być mała lub w netfiddle zabraknie pamięci.
Grał w golfa
Czytelny
Wyjaśnienie
Wykorzystuje to leniwą ocenę bigtime, która sprawia, że jest ona bardzo szybka. Byłem też leniwy, robiąc jakąkolwiek „bitlogikę”, używając metody Convert.ToString (liczba, 2). To zamienia dowolną liczbę w jej reprezentację binray jako ciąg.
Musiałem napisać własną metodę przecięcia sekwencji, ponieważ metoda Linq oblicza przecięcie pełnej sekwencji, co było dosłownie niemożliwe.
źródło