Liczby podzielone na segmenty

15

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
Post Rock Garf Hunter
źródło

Odpowiedzi:

12

Haskell, 62 58 bajtów

-4 bajty dzięki @xnor!

(x:y)#z=x:filter(`notElem`scanl(+)x z)y#(x:z)
([1..]#[]!!)

Sekwencja ma indeks 0.

ThreeFx
źródło
1
Myślę, że potrzebujesz jeszcze dwóch bajtów i otaczasz ostatnią linię, ()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.
nimi
1
Piękna metoda! Import wydaje się jednak przesadą; filter(`notElem`scanl(+)x z)ypowinieneś zrobić.
xnor
7

Perl, 50 49 bajtów

Obejmuje +1 dla -p

Uruchom z wejściem na STDIN:

segmented.pl <<< 7

segmented.pl:

#!/usr/bin/perl -p
${$_-=$\}++for@F;1while${-++$\};++$#F<$_&&redo}{

Wyjaśnienie

@Fzawiera 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, 1automatycznie stanie się pierwszą liczbą.

Ponieważ rozmiar @Fjest liczbą wygenerowanych liczb, można go użyć jako warunku zatrzymania

Ton Hospel
źródło
4

05AB1E , 17 16 bajtów

Xˆ$µ>D¯ŒOså_i¼Dˆ

Wyjaśnienie

Xˆ                # initialize global array to [1]
  $               # push 1 and input to stack
   µ              # while counter != input
    >             # increase variable on stack
      ¯ŒO         # list of all sums of consecutive number in global array
     D   så_i     # if current stack value is not in the list
             ¼    # increase counter
              Dˆ  # add current stack value to global array

Wypróbuj online!

Zaoszczędzono 1 bajt dzięki Adnan

Emigna
źródło
Czy $zamiast Xspracy?
Adnan
@Adnan: Tak, oczywiście. Głupie z mojej strony. Dzięki!
Emigna
4

Galaretka , 14 13 11 bajtów

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

Wypróbuj online!

Jak to działa

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n - 1].
 ߀          Recursively map the main link over the range.
   Ẇ         Window; yield all subarrays of consecutive elements of the result.
    ;        Append n to the array of subarrays.
     ḅ1      Convert all subarrays from base 1 to integer.
             This is equivalent to S€ (sum each), but it allows ; to hook.
         $   Combine the previous two links into a monadic chain.
       ‘       Increment all sums.
        ḟ      Filter; remove the original sums from the incremented ones.
          Ṃ  Compute the minimum.
Dennis
źródło
2

Pyth - 19 17 bajtów

Cholera, jeden rujnuje wszystkie moje domniemania. (Liczba tych samych bajtów, przyrostowo dosłownie Q:=hQesmaYf!}TsM.:Y )

esmaYf!}TsM.:Y)1h

Pakiet testowy .

Maltysen
źródło
Używanie zmniejszania zapisuje (tylko) jeden bajt. Oczekiwano więcej ...eu+Gf!}TsM.:G))hQY
Jakube,
1
@Jakube mapa jest zwykle krótsza dla takich
samych
2

JavaScript, 125 112 110 bajtów

Zaoszczędź 2 bajty dzięki @Neil

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)a.some(b=>b.includes(i))||(a[z+1]=[0,...a[z++]||[]].map(v=>i+v));alert(i-1)}

Poprzednie odpowiedzi

112 bajtów dzięki @Neil:

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)if(!a.some(b=>b.includes(i))){a[z+1]=[0,...a[z++]||[]].map(v=>i+v)}alert(i-1)}

125 bajtów:

f=n=>{a=[[]];for(i=1,k=z=0;z<=n;i++)if(a.every(b=>b.every(c=>c-i))){a[i]=[i].concat((a[k]||[]).map(v=>i+v));k=i,z++}alert(k)}
Hedi
źródło
1
Bo 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ę potrzebujesz k?
Neil
1
Teraz, gdy masz if(!...){...}tylko jedno zdanie, prawdopodobnie możesz je zastąpić znakiem ...||(...)lub ...?0:....
Neil
1

Python, 113 105 92 80 bajtów

s=F={1}
x=1
exec"while{x}<=s:x+=1\nF={x+j for j in{0}|F};s|=F\n"*input()
print x

Ostatnie bajty, które uratowałem, zostały zainspirowane odpowiedzią Tona Perla: mój Frobi to samo, co jego @F; mój srobi zasadniczo to samo co jego %::.

Lynn
źródło
1

JavaScript (ES6), 77 bajtów

(n,a=[],s=a,i=1)=>s[i]?f(n,a,s,i+1):--n?f(n,[0,...a].map(j=>s[j+=i]=j),s,i):i

Zasadniczo port rekurencyjny algorytmu odpowiedzi Perla @ TonHospel.

Neil
źródło