Segmentierte Zahlen

15

Die Folge von segmentierten Zahlen oder Primzahlen ( OEIS A002048 ) ist die Folge von Zahlen, bei der jedes Mitglied die kleinste positive Zahl (größer als Null) ist, die nicht aus einer Summe früherer aufeinanderfolgender Zahlen mit gebildet werden kann a(0) = 1.

Beispiel

Um zu berechnen, berechnen a(7)wir zuerst a(0->6) = [1, 2, 4, 5, 8, 10, 14]. Wir beginnen dann bei Null und gehen die Zahlen durch, bis wir eine finden, die nicht die Summe einer oder mehrerer aufeinanderfolgender Zahlen in der Folge ist.

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 = ????

Da fünfzehn nicht durch Summieren einer aufeinanderfolgenden Teilsequenz gebildet werden können und jede kleinere Zahl fünfzehn sein kann, ist die nächste Zahl in der Sequenz. a(7) = 15

Aufgabe

Ihre Aufgabe ist es, eine Zahl (über Standardmethoden) zu nehmen und den n-ten Term in dieser Reihenfolge (über Standardausgabemethoden) auszugeben. Dies ist Code-Golf und Sie werden als solche gewertet.

Testfälle

0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21
Weizen-Assistent
quelle

Antworten:

12

Haskell, 62-58 Bytes

-4 Bytes dank @xnor!

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

Die Sequenz ist 0-indiziert.

ThreeFx
quelle
1
Ich denke, Sie brauchen zwei weitere Bytes und umgeben die letzte Zeile mit (), um es eine ordnungsgemäße Funktion zu machen. Der angewendete Teil !!ist ein Operatorabschnitt und muss eingeschlossen werden (), damit er eine Funktion ist. Ohne es ist nur ein Ausschnitt, der nur eine Funktion (oder "Wert", um strenge Haskell-Begriffe zu verwenden) mit dem fehlenden Argument wird.
nimi
1
Schöne Methode! Der Import scheint jedoch übertrieben zu sein. filter(`notElem`scanl(+)x z)ysollte tun.
Xnor
7

Perl, 50 49 Bytes

Beinhaltet +1 für -p

Mit Eingabe auf STDIN ausführen:

segmented.pl <<< 7

segmented.pl:

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

Erläuterung

@Fenthält die Liste der (negativen) Summen von fortlaufenden Nummern, die mit der aktuellen letzten Nummer enden. Wenn eine neue Zahl entdeckt wird, wird die Liste mit 0 erweitert und dann werden alle Werte um die neue Zahl verringert, wobei die Invariante beibehalten wird.

Global %::wird als Hash verwendet, der alle (negativen) Zahlen, die durchgesehen wurden, @Fauf einen Wert ungleich Null abbildet.

$\ist die aktuelle Zahl und wird erhöht, bis sie einen Wert erreicht, der noch nicht in ist %::.

Wenn Sie ein wenig auf die Reihenfolge achten, in der alles passiert, ist keine Initialisierung erforderlich. Dies 1wird automatisch zur ersten Zahl.

Da @Fes sich um die Anzahl der generierten Zahlen handelt, kann dies als Unterbrechungsbedingung verwendet werden

Tonne Hospel
quelle
4

05AB1E , 17 16 Bytes

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

Erläuterung

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

Probieren Sie es online!

Dank Adnan 1 Byte gespeichert

Emigna
quelle
Funktioniert $anstatt zu Xsarbeiten?
Adnan
@Adnan: Ja natürlich. Dumm von mir. Vielen Dank!
Emigna
4

Jelly , 14 13 11 Bytes

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

Probieren Sie es online!

Wie es funktioniert

Ḷ߀Ẇ;ḅ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
quelle
2

Pyth - 19 17 Bytes

Verdammt, einer, der alle meine Implikationen ruiniert. (Gleiches Bytes zählt, literaly Inkrementieren Q: =hQesmaYf!}TsM.:Y)

esmaYf!}TsM.:Y)1h

Test Suite .

Maltysen
quelle
Mit "Reduzieren" wird (nur) ein Byte gespeichert. Erwartet mehr ...eu+Gf!}TsM.:G))hQY
Jakube
1
@ Jakube Karte ist in der Regel kürzer für selbstreferenzielle Sequenzen wie diese
Maltysen
2

Javascript, 125 112 110 Bytes

2 Bytes dank @Neil gespeichert

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)}

Vorherige Antworten

112 Bytes dank @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 Bytes:

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
quelle
1
Denn b.every(c=>c-i)ich würde versuchen, !b.includes(i)oder möglicherweise !a.some(b=>b.includes(i))funktioniert, während [0,...a[k]||[]].map(v=>i+v)möglicherweise ersetzen [i].concat((a[k]||[]).map(v=>i+v)). Auch brauchst du wirklich k?
Neil
1
Jetzt, da if(!...){...}es sich nur noch um eine Aussage handelt, könnten Sie sie wahrscheinlich durch ...||(...)oder ersetzen ...?0:....
Neil
1

Python, 113 105 92 80 Bytes

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

Die letzten Bytes, die ich gespeichert habe, wurden von Ton's Perl-Antwort inspiriert: my Fmacht dasselbe wie his @F; Mein smacht im Wesentlichen das gleiche wie sein %::.

Lynn
quelle
1

JavaScript (ES6), 77 Byte

(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

Grundsätzlich eine rekursive Portierung des Algorithmus von @ TonHospels Perl-Antwort.

Neil
quelle