Hier ist die Sequenz, über die ich spreche:
{1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27...}
Ausgehend von 1 behalten Sie 1, lassen Sie die nächsten 2 fallen, behalten Sie die nächsten 2, lassen Sie 3 fallen, behalten Sie 3 und so weiter. Ja, es ist auch auf OEIS (A064801) !
Die Herausforderung
n>0
Suchen Sie bei einer Ganzzahl den n-ten Term der obigen Sequenz
Testfälle
Input -> Output
1->1
22->49
333->683
4444->8908
12345->24747
Dies ist Codegolf, also gewinnt die kürzeste Antwort in Bytes! Viel Glück!
Antworten:
Java (OpenJDK 8) ,
4544 BytesProbieren Sie es online!
-1 Byte dank @Nevay
Nachdem ich eine Weile darauf gestarrt hatte, bemerkte ich ein Muster. Jedes Mal, wenn wir
n
Zahlen fallen lassen , ist die nächste Zahl in der Folge ein perfektes Quadrat. Als ich das sah, zerlegte ich die Sequenz mental in bequeme Teile:[[1],[4,5],[9,10,11],...]
Grundsätzlichi
beginnt der dritte Teil miti*i
und iteriert nach oben füri
Elemente.Um die
n
th-Zahl in dieser Sequenz zu finden, wollen wir zuerst herausfinden, in welchem Block sich die Zahl befindet und welche Position sie dann in dem Block einnimmt. Wir subtrahieren unsere Schrittzahli
vonn
bisn
weniger alsi
(was uns unsere Brocken gibt), und dann fügen Sie einfachn-1
aufi*i
die richtige zu bekommenposition
im Chunk.Beispiel:
quelle
return~-n+i*i;
1 Byte speichern.Haskell,
484341 Bytes4 zusätzliche Bytes für 1-basierte Indexierung anstelle von 0-basierten. Eine unnötige Einschränkung, IMHO.
Probieren Sie es online!
quelle
Python 3 ,
4746 Bytes1 Byte danke an Herrn Xcoder.
Probieren Sie es online!
Sehr schnell für höhere Zahlen
quelle
def f(n):a=round((2*n)**.5);return~-n+a*-~a//2
. Bin mir aber nicht sicher ... Cleverer Ansatz!a*(a+1)
ist gerade für jede ganze Zahl. Beschwert sich Python über die Float-Division bei ganzen Zahlen? Beschwert es sich über bitweise Operationen auf Floats? Falls nicht:(2*n)**.5+.5|0
.Gelee , 8 Bytes
Probieren Sie es online!
quelle
Haskell , 33 Bytes
Eine anonyme Funktion. Benutzen als
((!!)$0:do n<-[1..];[n^2..n^2+n-1]) 1
Probieren Sie es online!
!!
. Das0:
ist ein Blindelement von 0- bis 1 basierte Indizierung einzustellen.[n^2..n^2+n-1]
konstruiert eine lückenlose Folge, beginnend mit dem Quadrat mitn
und enthaltendn
Zahlen.do
Notation verkettet die konstruierten Bereiche für allen>=1
.quelle
Python 3 , 46 Bytes
Probieren Sie es online!
quelle
Perl 6 , 43 Bytes
Probier es aus
Erweitert:
(1..*).rotor({++$=>++$+1}...*)
produziert:quelle
TeX, 166 Bytes
Verwendung
quelle
Javascript,
4338 BytesProbieren Sie es online!
Ich benutze die Tatsache, dass für jede dreieckige Zahl plus eins das Ergebnis eine quadratische Zahl ist.
Als Beispiel: Dreieckszahlen sind 0, 1, 3, 6, 10 ... also beobachten wir für 1, 2, 4, 7, 11 ... 1, 4, 9, 16, 25 ... in unserer Sequenz .
Wenn der Index irgendwo zwischen diesen bekannten Zahlen liegt, rücken die Elemente unserer Sequenz nur um eins vor. Um beispielsweise das Ergebnis für 10 zu berechnen, nehmen wir 7 (als Dreieckszahl plus eins), nehmen das Ergebnis (16) und addieren 10-7 = 3. Somit ist 16 + 3 = 19.
quelle
05AB1E , 12 Bytes
Probieren Sie es online!
quelle
[0..a-1] + a**2
, das coole hier imo ist halt dasÝÁćn+
stattD<Ýsn+
.cQuents , 27 Bytes
Probieren Sie es online!
Momentan ist es eine Portierung von Leakys Python-Antwort , aber ich denke, es gibt einen besseren Weg.
quelle
Schnelle 3 , 72 Bytes
Port meiner Python-Lösung .
Test Suite.
quelle
C # (Mono) , 164 Bytes
Probieren Sie es online!
quelle
Mathematica, 37 Bytes
Erläuterung
Function
Dies nimmt eine positive ganze Zahl an#
und gibt die#
Folge von aufeinanderfolgenden Zahlen in der Sequenz zurück.Erzeugt die Liste aller solcher Läufe bis zur Eingabe
#
Flattens
die resultierende Liste und gibt das#
th-Element zurück.quelle
Perl 5 , 33 + 1 (-p) = 34 Bytes
Probieren Sie es online!
quelle
Tampio ,
310308 BytesVerwendung:
4:n uni
ergibt9
.Erläuterung:
Aus der Standardbibliothek:
quelle
JavaScript (ES6), 33 Byte
Rekursive Lösung, inspiriert von Xanderhalls Beobachtungen .
Versuch es
quelle
Python 3 , 50 Bytes
Probieren Sie es online!
quelle
Mathematica, 82 Bytes
quelle
Python , 40 Bytes
Probieren Sie es online!
Optimierung der Leaky Nonnen Ausdruck .
Python , 41 Bytes
Probieren Sie es online!
Rekursiver Ausdruck.
quelle
Javascript (ES6)
10098 BytesIch wette, es gibt viel Raum für Verbesserungen, nur einfache Schleifen und Zähler.
quelle
Retina , 27 Bytes
Probieren Sie es online! Port von @ LeakyNuns Python-Antwort. Die erste und letzte Stufe sind nur langweilige Dezimal-Unär-Konvertierungen. Die zweite Stufe funktioniert folgendermaßen:
((^1|1\2)+)
ist ein Dreieckszahlenvergleicher;$1
ist die übereinstimmende dreieckige Zahl, während$2
ihr Index ist. Der1
nachlaufMittel paßt es die größte Dreieckszahl streng kleiner ist als der Eingang, also in genau einer Iteration weniger als der Pythons Schleife ergibt, was bedeutet , dass$1
entsprechena-i
und$2
zui-1
und ihre Summe ista-1
oder~-a
nach Bedarf. ($&
Verhindert lediglich, dass die Übereinstimmung aus dem Ergebnis gelöscht wird.) Beachten Sie, dass bei einer Eingabe1
keine Übereinstimmung erfolgt und die Ausgabe einfach mit der Eingabe identisch ist. Wenn Sie pervers wären, könnten Sie verwenden^((^1|1\2)*)1
auch in diesem Fall zu entsprechen.quelle
MATL , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
C (gcc) , 38 Bytes
Verwenden Sie hier den @ Xanderhall-Algorithmus
Probieren Sie es online!
quelle
PHP,
48 4237 + 1 Bytesportiert aus Leaky Nuns Antwort
Laufen Sie als Pipe mit
-F
oder versuchen Sie es online .direkte Annäherung, 42 + 1 Bytes (portiert von der anderen Antwort von Leaky Nun )
Als Rohr mit
-nR
oder ohne Kommentar über TiO verlegen.ältere iterative Lösung, 48 + 1 Bytes
quelle