Hintergrund
Betrachten Sie eine Sequenz, die wie folgt definiert ist:
- Das erste Element ist 0;
- Das zweite Element ist 4;
- Ab dem dritten Element kann sein Wert berechnet werden durch:
- Nehmen Sie den Satz von Ganzzahlen von 0 bis zum vorherigen Element der Sequenz (einschließlich oder ausschließlich, es spielt keine Rolle);
- Entfernen aller Ganzzahlen, die bereits früher in der Sequenz aufgetreten sind, aus der Menge;
- Addiere die verbleibenden Elemente der Menge; Das ist der Wert, den Sie wollen.
Interessanterweise scheint diese Sequenz noch nicht auf OEIS zu sein .
Die Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die eine ganze Zahl n als Eingabe verwendet und das n- te Element der Sequenz ausgibt .
Testfälle
Die ersten Elemente der Sequenz sind:
- 0
- 4
- 6 (1 + 2 + 3)
- 11 (1 + 2 + 3 + 5)
- 45 (1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
- 969 (1 + 2 + 3 + 5 + 7… 10 + 12… 44)
- 468930 (1 + 2 + 3 + 5 + 7… 10 + 12… 44 + 46… 968)
Klarstellungen
- Ihr Programm sollte theoretisch in der Lage sein, beliebiges n zu verarbeiten, wenn es mit einer Variante Ihrer Sprache ausgeführt wird, die unbegrenzt große ganze Zahlen und unbegrenzten Speicherplatz hat. (Sprachen ohne Bignums werden wahrscheinlich nicht viel über 468930 hinaus kommen, aber das ist keine Entschuldigung, um die Antworten hart zu kodieren.)
- Sie können entweder 0-basierte oder 1-basierte Indizierung für die Sequenz wählen (z. B. liegt es an Ihnen, ob n = 1 das erste Element, n = 2 das zweite Element usw. zurückgibt oder ob n = 0 das erste Element zurückgibt , n = 1 das zweite Element und so weiter).
- Es gibt keine Anforderungen an den von Ihnen verwendeten Algorithmus oder dessen Effizienz. Sie können die Definition der Sequenz direkt implementieren (obwohl sie wirklich ineffizient ist), und Sie können auch einen anderen Algorithmus implementieren, der zu den gleichen Ergebnissen führt.
Siegbedingung
Das ist Code-Golf , also gewinnt das kürzeste richtige Programm, gemessen in Bytes.
Antworten:
Jelly ,
13129 BytesVerwendet eine 0-basierte Indizierung.
Probieren Sie es online!
Wie es funktioniert
quelle
Python,
6660 BytesVielen Dank an @Dennis für das Abschneiden von 6 Bytes!
Es ist nicht der geilste Code aller Zeiten, aber er verwendet eine Formel, die ich erstellt habe:
Wo
x
auf der rechten Seite istf(n - 1)
undy
istf(n - 2)
.Erläuterung:
Die Summe der kontinuierlichen ganzen Zahlen von
a
bisb
(einschließlich) kann durch diese Formel beschrieben werden:Wobei
amount
(Anzahl der Zahlen) wie folgt beschrieben wird:Und
average
(der Durchschnitt aller Zahlen) wird wie folgt beschrieben:Die vollständige Formel lautet also jetzt:
Die Art , wie wir diese Formel in die endgültige Formel implementieren ist als Ersatz
a
fürf(n - 1)
,b
fürf(n - 2)
, die im Grunde die Summe aller von den neuen Bedingungen berechnet, und fügen Sie eine anderef(n - 1)
(was jetzt ista
) auf, die die Summe aller vorherigen Bedingungen ist.Wenn wir das zusammen kombinieren, erhalten wir:
Ersetzen Sie
a
mitx
undb
mity
, und hey presto, müssen Sie oben formeln.quelle
Python 2 ,
585450 BytesProbieren Sie es online!
quelle
Mathematica,
4948 BytesVerwendet die CP-1252-Codierung. Definiert die Funktion
PlusMinus (±)
. 1-indiziert.Erläuterung
quelle
Oase , 11 Bytes
Code:
Erläuterung:
Um die Beziehung von f n zu visualisieren , nehmen wir das Beispiel f 5 . Schauen wir uns zur Berechnung von f 5 die folgende Summe an:
1 + 2 + 3 + 5 + 7 + 8 + 9 + 10
Der fettgedruckte Teil entspricht f 4 . Der 7 + 8 + 9 + 10- Teil ist der Bereich [fn -2 + 1, fn -1 - 1] . Das ergibt die Formel f n-1 + Σ [f n-2 + 1 ... f n-1 - 1] ( Wolfram-Verknüpfung ):
f n = 0,5 × (f n - 1 2 - f n - 2 2 + f n - 1 - f n - 2 )
Welches kann umgeschrieben werden:
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 ) + (f n-1 - f n-2 ))
f n = 0,5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 + 1))
Welches ist die Formel, die wir im Code verwenden werden:
Code Erklärung
Das
640
Teil gibt uns die Basisfälle:Der auszuführende Code (der ein (n) definiert ):
Probieren Sie es online!
quelle
Julia,
393332 Bytes0-basiert.
Dank @Dennis, 6 Bytes gespart.
Dank @GlenO ein Byte gespeichert.
Probieren Sie es online!
Vorherige Antwort 1 basierend:
Probieren Sie es online!
Vorherige ungolfed Antwort 1-basiert:
Probieren Sie es online!
quelle
n<3?5n-n^2:
anstelle vonn<4?2(n>1)n:
-. Beachten Sie jedoch, dass die Verwendung der 0-basierten Indizierung verwendet wird.JavaScript (ES6), 47 Byte
Verwendet die Wiederholungsrelation, die
f(n) = sum(range(f(n-2) + 1, f(n-1) + 1))
für n> 2 gilt.quelle
PowerShell ,
84898887 ByteProbieren Sie es online!
Erläuterung
0-basierte Indizierung. Funktioniert nur durch
n = 6
(auf meinem Windows-Rechner stürzt es mit einem Stapelüberlauf abn = 7
).Verwenden der gleichen Methode wie die Antwort von JungHwan Min (Summe des Bereichs abzüglich der Summe der vorherigen Begriffe).
Das Aufsummieren eines Bereichs / Arrays in PowerShell ist lang, daher benutze ich einen Trick, um mit einem Array
+
einen langen Ausdruck (wie1+2+3+4...etc
) zu erstellen und ihn dann durchiex
(Invoke-Expression
) zu senden .Da ich es zweimal machen muss,
-join
setze ich stattdessen die spezielle Variable$OFS
, die für Ausgabefeldtrennzeichen steht. Wenn Sie ein Array stringifizieren, ist dies das Zeichen, das zum Verknüpfen der Elemente verwendet wird. Es wird standardmäßig ein Leerzeichen verwendet. Wenn+
ich es also auf (einmal) setze, kann ich so etwas wie$a-join'+'|iex
durch ersetzen"$a"|iex
.Eine einfache
for
Schleife läuft so lange, bis die Sequenzzahl kleiner oder gleich der Eingangszahl ist. Dann gebe ich das$n
th-Element zurück.quelle
;
nach derfor
Schleife benötigt . Nie zuvor bemerkt.MATL ,
1716 Bytes1
-basierte Indizierung wird verwendet. Der Code ist sehr ineffizient. Dennn = 6
es überschreitet bereits die Speichergrenze des Online-Compilers.Probieren Sie es online!
Wie es funktioniert
Bei 20 Byte vermeidet die folgende Version die Speicherbeschränkung. Es gibt jedoch immer noch die Einschränkung des Datentyps (
double
Typ kann nur garantieren, dass Ganzzahlen bis zu genau dargestellt werden2^53
), sodass Ergebnisse nur bis zu gültig sindn = 8
.Probieren Sie es auch online aus !
quelle
Haskell , 42 Bytes
Probieren Sie es online!
Dies führt direkt das erneute Auftreten der für
n>2
,f(n)
gleichf(n-1)
plus die Summe des offenen Intervalls vonf(n-2)
bisf(n-1)
wieder die aus der Summe aus dem halboffenen Intervall gleich istf(n-2)
zuf(n-1)
einschließlich.quelle
Haskell, 31 Bytes
Anwendungsbeispiel:
((0:4#6)!!) 6
->468930
. Probieren Sie es online! .Einfache Rekursion, die das
m
bisherige maximale Element und den nächsten Wert festhälts
.quelle
JavaScript,
123119 BytesProbieren Sie es online! Diese Lösung basiert auf 1
f(1) => 0
.quelle
Perl 6 ,
52 49 4435 BytesVersuch es
Versuch es
Versuch es
Versuch es
Erweitert:
quelle
PowerShell ,
77 -73 ByteProbieren Sie es online!
Implementiert den Algorithmus wie definiert und ist 0-indiziert. Die Eingabe von
6
ist zu viel für TIO.Legt fest
$a
, dass es sich um ein Array handelt[0,4]
. Schleifen von1
bis zu Eingabe$n
. In der Schleife nehmen wir den Zahlenbereich von0
bis zu der größten Zahl, die wir haben$a[-1]
, und verwenden eineWhere-Object
Klausel|?{...}
, um nur die Zahlen herauszuholen, die noch nicht vorhanden sind. Dieses Array von Zahlen wird-join
zusammen mit+
s gebildet und dann zuiex
(kurz fürInvoke-Expression
und ähnlich zueval
) geführt. Dieser Wert wird dann auf das Ende von Array-verkettet$a
. Schließlich verlassen wir unsere Schleife und nehmen die$n
th-Zahl in unser Array. Diese Nummer bleibt in der Pipeline und die Ausgabe ist implizit.quelle
Python 2 , 85 Bytes
Probieren Sie es online!
quelle
Batch, 108 Bytes
Port meiner JavaScript-Antwort.
quelle
Gleichstrom , 47 Bytes
Funktioniert mit Ganzzahlen, die bis zur Speicherkapazität des Computers beliebig groß sind.
Probieren Sie es online!
0-basierte Indizierung, Eingabe über stdin, Ausgabe über stdout. (Es gibt auch eine Ausgabe auf stderr, die ignoriert werden soll.)
Probeläufe:
Dies verwendet den gleichen Algorithmus wie die folgende Lösung in bash, die (etwas) besser lesbar ist:
Pure Bash, 60 Bytes
Das Bash-Programm funktioniert jedoch nur für Eingaben bis zu 7, da es darüber hinaus auf einen Ganzzahlüberlauf trifft.
quelle
Pyth - 15 Bytes
Test Suite .
quelle
C # - 74 Bytes
Ungolfed:
Es gibt wahrscheinlich eine Möglichkeit, dies in ein Lambda zu konvertieren, um noch mehr zu sparen, oder etwas, das die .Aggregate-Funktion verwendet. Obwohl ich momentan keine Importe habe, gleicht es vielleicht aus?
quelle
> <> , 43 + 3 = 46 Bytes
Verwendet die Formel aus den Antworten von Adnan und Qwerp-Derp .
Erwartet, dass die Eingabe auf dem Stapel vorhanden ist, also +3 Byte für das
-v
Flag.Probieren Sie es online!
quelle