Sekwencja liczb segmentowanych lub liczb pierwszych pomiarów ( OEIS A002048 ) jest sekwencją liczb, dzięki czemu każdy element jest najmniejszą liczbą dodatnią (większą niż zero), której nie można utworzyć z sumy wcześniejszych kolejnych liczb a(0) = 1
.
Przykład
Aby obliczyć a(7)
, najpierw obliczyć a(0->6) = [1, 2, 4, 5, 8, 10, 14]
. następnie zaczynamy od zera i przechodzimy przez liczby, aż znajdziemy taką, która nie jest sumą jednej lub więcej kolejnych liczb w sekwencji.
1 = 1
2 = 2
3 = 1 + 2
4 = 4
5 = 5
6 = 2 + 4
7 = 1 + 2 + 4
8 = 8
9 = 4 + 5
10 = 10
11 = 2 + 4 + 5
12 = 1 + 2 + 4 + 5
13 = 5 + 8
14 = 14
15 = ????
Ponieważ piętnaście nie może być sumowane przez kolejne kolejne podsekwencje, a każda mniejsza liczba może wynosić piętnaście, to kolejna liczba w sekwencji. a(7) = 15
Zadanie
Twoim zadaniem jest pobranie liczby (standardowymi metodami) i wysłanie n-tego terminu w tej sekwencji (standardowymi metodami wyjściowymi). To jest golf golfowy i jako taki zostaniesz oceniony.
Przypadki testowe
0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21
()
aby była to właściwa funkcja. Częściowo zastosowana!!
jest sekcja operatora i musi być zamknięta,()
aby działała. Bez tego jest tylko fragmentem, który staje się funkcją (lub „wartością” w celu użycia ścisłych terminów Haskell) z brakującym argumentem.filter(`notElem`scanl(+)x z)y
powinieneś zrobić.Perl,
5049 bajtówObejmuje +1 dla
-p
Uruchom z wejściem na STDIN:
segmented.pl
:Wyjaśnienie
@F
zawiera listę (ujemnych) sum kolejnych liczb, które kończą się bieżącą ostatnią liczbą. Po wykryciu nowego numeru lista jest rozszerzana o 0, a następnie wszystkie wartości są pomniejszane o nowy numer zachowujący niezmiennik.Globalny
%::
jest używany jako hash odwzorowujący wszystkie (ujemne) liczby, które były widziane (do@F
) na niezerową wartość.$\
jest bieżącą liczbą i rośnie, aż osiągnie wartość, która nie jest jeszcze w%::
.Uważając nieco na kolejność, w jakiej wszystko się dzieje, inicjalizacja nie jest wymagana,
1
automatycznie stanie się pierwszą liczbą.Ponieważ rozmiar
@F
jest liczbą wygenerowanych liczb, można go użyć jako warunku zatrzymaniaźródło
05AB1E ,
1716 bajtówWyjaśnienie
Wypróbuj online!
Zaoszczędzono 1 bajt dzięki Adnan
źródło
$
zamiastXs
pracy?Galaretka ,
141311 bajtówWypróbuj online!
Jak to działa
źródło
Pyth -
1917 bajtówCholera, jeden rujnuje wszystkie moje domniemania. (Liczba tych samych bajtów, przyrostowo dosłownie
Q
:=hQesmaYf!}TsM.:Y
)Pakiet testowy .
źródło
eu+Gf!}TsM.:G))hQY
JavaScript,
125112110 bajtówZaoszczędź 2 bajty dzięki @Neil
Poprzednie odpowiedzi
112 bajtów dzięki @Neil:
125 bajtów:
źródło
b.every(c=>c-i)
spróbowałbym,!b.includes(i)
a może!a.some(b=>b.includes(i))
działa, a[0,...a[k]||[]].map(v=>i+v)
może zastąpić[i].concat((a[k]||[]).map(v=>i+v))
. Czy naprawdę potrzebujeszk
?if(!...){...}
tylko jedno zdanie, prawdopodobnie możesz je zastąpić znakiem...||(...)
lub...?0:...
.Python,
1131059280 bajtówOstatnie bajty, które uratowałem, zostały zainspirowane odpowiedzią Tona Perla: mój
F
robi to samo, co jego@F
; mójs
robi zasadniczo to samo co jego%::
.źródło
JavaScript (ES6), 77 bajtów
Zasadniczo port rekurencyjny algorytmu odpowiedzi Perla @ TonHospel.
źródło