(Herausforderung aus einem Multiplayer-Spiel (Clash of Code) bei codingame.com )
Die Herausforderung
Suchen Sie den n- ten Term der folgenden Sequenz: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4...
oder, um es offensichtlicher zu machen,{1}, {1,2}, {1,2,3}, {1,2,3,4}...
Die Sequenz besteht aus verketteten Bereichen von 1 bis x , beginnend von 1 bis unendlich.
Regeln / IO
Eingabe und Ausgabe können in einem beliebigen Format erfolgen, sofern dies unterscheidbar ist. Die Eingabe kann aus jeder geeigneten Quelle erfolgen: STDIN, Datei usw.
Die Eingabe kann 0- oder 1-indiziert sein, und die ausgewählte Indizierung muss im Beitrag erwähnt werden.
Sie müssen mindestens bis zu einem Ergebnis von 255 einschließlich verarbeiten (dh die 0-indizierte maximale Eingabe beträgt 32640). Alles, was darüber hinausgeht, muss behandelt werden, wenn Ihre Sprache dies unterstützt.
Dies ist code-golf
so, dass die kürzeste Anzahl von Bytes gewinnt!
Testfälle (0-basierte Indizierung)
0 -> 1
1 -> 1
5 -> 3
10 -> 1
59 -> 5
100 -> 10
1001 -> 12
59
,100
usw.)Antworten:
05AB1E , 5 Bytes
Das Programm ist 0-indiziert, Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
GNG¹¾¼QiN
ist ein iterativer Ansatz, aber das war klüger.Haskell ,
2726 BytesProbieren Sie es online!
Danke @DanD. für -1 Byte!
Dies ist eine anonyme Funktion, die unendliche Folge der Schaffung eines nur das zurückkehr
n
-te Element davon[[1..k]| k<-[1..]]
erzeugt eine unendliche Liste der Liste:[[1],[1,2],[1,2,3],[1,2,3,4],...]
. Um diese zu verketten, können wir schreiben,[z|k<-[1..],z<-[1..k]]
was zur Eingabe führt, diese[1,1,2,1,2,3,1,2,3,4,...]
schließlich(...!!)
akzeptiertn
(sinnlose Notation) und denn
-ten Term zurückgibt (0-basiert).quelle
concat
mit mehr Verständnis speichert nur 1 Byte:([z|k<-[1..],z<-[1..k]]!!)
.JavaScript,
2928 Bytes-1 Byte Danke an Arnauld!
Verwendet die in OEIS gefundene 0-indizierte rekursive Formel.
Wenn wie erwartet mit 1 Argument aufgerufen wird, ist der Standardwert der Sekunde
m
,,undefined
. Es wird jedoch-~undefined
1 zurückgegeben, wodurch wir die Rekursion ohne ein explizitesm = 1
Argument in der Argumentliste ins Rollen bringen können (danke @Arnauld!)Testschnipsel:
Alternativ können wir für die gleiche Anzahl von Bytes eine Curry-Funktion haben:
Sie können dies mit aufrufen
f(5)()
- es gibt eine Funktion zurück, die, wenn sie aufgerufen wird, das Ergebnis zurückgibt, wie in diesem Meta-Beitrag beschrieben .quelle
Jelly , 5 Bytes, 1-indiziert
Probieren Sie es online!
Erläuterung:
quelle
Oktave, 39 Bytes
1-basierter Index
Erläuterung:
Betrachten Sie diese Reihenfolge:
Wenn wir die Anzahl der Elemente der Subsequenzen zählen, haben wir
Mit der Gauß-Formel für die Dreieckszahl können wir also eine Formel für z bilden:
das ist eine quadratische Gleichung, wenn wir sie für n lösen, das wir haben
Probieren Sie es online!
quelle
Haskell,
2524 BytesAnwendungsbeispiel:
((!!)$[1..]>>= \x->[1..x]) 10
->1
. Probieren Sie es online! .Ordnet die anonyme Funktion zum Erstellen einer Liste von 1 bis x
\x->[1..x]
(die integrierte FunktionenumFromTo 1
ist ein Byte länger) der unendlichen Liste zu[1..]
und verknüpft die resultierenden Listen zu einer einzigen Liste.!!
wählt das n-te Element aus.Danke an @flawr für ein Byte.
quelle
(!!)$[1..]>>= \x->[1..x]
. Manchmal wünschte ich mir wirklich, es gäbe eine kürzere sinnlose Schreibweise\x->[1..x]
:)<$>
die nicht im Umfang enthalten sind. Kennen Sie einen Online-Haskell-Compiler / -Interpreter, der die neueste Version verwendet? haskell.org lässt nur Ausdrücke zu und Sie können keine Links zu Code erstellen, den Sie eingegeben haben.Oktave , 39 Bytes
Probieren Sie es online!
Dies verwendet einen alternativen Ansatz.
Für zB
n=1
diesA=triu(v'+0*v)
schafft die MatrixWenn Sie alle Nullelemente entfernen und die Spalten anhängen,
A(A>0)
erhalten Sie die folgende Reihenfolge:Dann geht es nur darum, den
n
-ten Term dieser Sequenz zu extrahieren .quelle
Python ,
3936 Bytes-3 Bytes dank Dennis!
Ein rekursives Lambda, das eine auf 1 basierende Indizierung verwendet.
Probieren Sie es online!
Wir verfolgen die aktuelle "Anstieg" Größe mit
m
. Wennn
kleiner oder gleich istm
, passt es in den aktuellen "Anstieg" und wir geben ihn zurück. Wenn es jedoch größer als istm
, nehmen wir esm
weg, addieren 1 zum
und rufen die Funktion rekursiv auf (wobei wir zum nächsten Anstieg übergehen).quelle
R, 25 Bytes
Der Index basiert auf 1.
quelle
sequence
Antwort eingereicht hat , und war froh, dies zu sehen.Pyth ,
65 Bytes1 Byte gespart dank @TheBikingviking!
Dies verwendet eine 0-basierte Indizierung.
Probieren Sie es online!
Erläuterung
quelle
.n
mits
.Mathematica,
2724 BytesDanke @MartinEnder für 3 Bytes!
1-indiziert. Dies löst Fehler aus, die ignoriert werden können.
Erläuterung
quelle
Join@@
ist viel zu teuer;)((r=Range)@r@#<>1)[[#]]&
StringJoin
nicht ausgewertet wird ... Ich mag esBrainf * ck, 78 Bytes
Nimmt Eingaben (0-basiert) und Ausgaben als Bytewerte.
Sie können es hier testen .
Die Eingabe erfordert eine
\
Vor-Dezimalzahl (zB\10
für 10). Wenn die Ausgabe ein druckbares ASCII-Zeichen ist, sollte es angezeigt werden. Andernfalls drücken Sie Ansichtsspeicher -> endgültiger Speicherauszug. Der Wert, der gedruckt wurde, befindet sich in der 3. Zelle (Zellennummer 2).Erläuterung:
Zelle 0 (EINGABE): ist der Eingang und wird jedes Mal um meine 1 durch die Schleife dekrementiert.
Zelle 1 (RESET): Inkrementiert sich jedes Mal um 1, wenn sie gleich TERM ist. Dazu addieren wir jedes Mal 1, und wenn sie nicht gleich sind, subtrahieren wir 1.
Zelle 2 (TERM): Inkrementiert jede Schleife um 1 und wird auf 0 gesetzt, wenn sie mit RESET übereinstimmt. Dazu kopiere ich den Wert nur dann von HOLD zurück, wenn diese Zelle nicht gleich RESET war.
Zelle 3 (EQUAL): wird verwendet, um zu überprüfen, ob RESET und TERM gleich sind.
Zelle 4 (HOLD): Dient zum Zurückkopieren der Werte von RESET und TERM nach der Gleichheitsprüfung.
quelle
Pyke, 6 Bytes
Probieren Sie es hier aus!
0-indiziert.
quelle
R
4341 BytesBearbeiten: Einen kürzeren rekursiven Ansatz mithilfe von A002262 + 1 (0 indiziert) gefunden:
Alte Version:
1-indizierte Formel von OEIS.
quelle
Perl 6 , 21 Bytes
0-indiziert. Probieren Sie es online!
Wie es funktioniert:
Perl 6 , 21 Bytes
0-indiziert. Probieren Sie es online!
Wie es funktioniert:
quelle
Keine dieser Lösungen ist so kurz wie die von JungHawn Min , aber es handelt sich um alternative Ansätze, was ich denke. Beide sind unbenannte Funktionen, die eine (1-indizierte) positive Ganzzahleingabe annehmen und eine positive Ganzzahl zurückgeben.
Mathematica, 30 Bytes
Eine tatsächliche mathematische Formel für diese Funktion! Hergestellt lesbar (teilweise durch Verschieben der 3-Byte - Zeichen
⌈
,√
und⌉
):Ceiling[Sqrt[2 * #] - 1/2]
teilt uns mit, auf welche Unterliste sich die Eingabe bezieht, von welcher wir eine subtrahieren, um uns mitzuteilen, welche Unterliste endet, bevor wir zur Eingabe gelangen;((#^2 + #) / 2 &)
berechnet dann, wie viele Elemente in allen Unterlisten vor dem uns interessierenden Element vorkommen, das wir von der Eingabe subtrahieren#
, um unsere Antwort zu erhalten. (Einige werden die bekannte Formel(#^2 + #) / 2
für die#
dritte Dreieckszahl bemerken ; sieCeiling[Sqrt[2 * #] - 1/2]
ist im Wesentlichen die Umkehrfunktion.)Mathematica, 32 Bytes
Rekursive Lösung, im Grunde die gleiche wie in Billywobs und anderen Antworten .
quelle
Brain-Flak , 46 Bytes
Null indiziert
Probieren Sie es online!
Stack Clean, 48 Bytes
Probieren Sie es online!
Erläuterung
Dies ist eine modifizierte Version der Modulo-Funktion . Anstatt eine konstante Zahl als Divisor zu verwenden, wird der Divisor jedes Mal erhöht, wenn der Divisor davon subtrahiert wird (einmal pro Iteration außerhalb der Schleife).
Kommentierter Code
quelle
Java 8,
857355 Bytes0-indizierter rekursiver Ansatz mit der im OEIS angegebenen Formel :
Probieren Sie es hier aus.
Alte Antwort (
8556 Bytes):Verwendete die andere 0-indizierte Formel, die im OEIS bereitgestellt wird :
Probieren Sie es hier aus.
quelle
Perl , 30 Bytes
29 Byte Code +
-p
Flag.Probieren Sie es online!
quelle
MATL, 8 Bytes
Diese Lösung verwendet eine 1-basierte Indizierung
Probieren Sie es bei MATL Online aus
Erläuterung
quelle
v
nachher bewegen]
QBIC , 21 Bytes, 1-indiziert
Erläuterung:
Etwas interessanter Ansatz, aber 10 Bytes länger:
Dieses Programm berechnet fortlaufend die Gesamtzahl der Zahlen in dieser Klammer und aller vorherigen (
1 at loop 1, 3 at loop 2, 6 at loop 3 ...
). Wenn dieser Zähler den gesuchten Index N überschreitet, geben Sie X aus der aktuellen Klammer zurück, wobei X N minus der vorherigen Menge des Zählers ist.quelle
Ruby, 30 Bytes
1-basierte Indizierung
quelle
R, 37 Bytes
Nimmt Eingaben von
n
und erstellt die Sequenz für die erstenn
Sequenzen. Dies macht es bei höheren Eingängen etwas ineffizient, sollte aber in Ordnung sein. Es gibt dann denn
-ten Eintrag mit 1 Index zurück.Verwendet einen netten kleinen Trick, indem Sie die Sequenz mit
T
(TRUE
oder1
standardmäßig) beginnen.quelle
C11, 48 Bytes
Probieren Sie es online!
Funktioniert auch in C ++ und Java.
Eine Alternative für die gleiche Byteanzahl:
quelle
Brainfuck, 141 Bytes
Ich weiß, ich bin zu spät für das Kopfgeld, aber ich wollte nur sehen, wie viele Bytes der Algorithmus, von dem ich dachte, am Ende sein würde.
Dieses Programm ist nullindexiert.
Probieren Sie es online aus
255
Ändern Sie zum Testen der Eingabewerte> die Zellengröße (Bits) auf 16 oder 32 .\5
für die Eingabe von5
.\999
Erläuterung:
Dies zeigt das schrittweise aufgebrochene Programm und zeigt, was bei der Eingabe von passiert
5
.#
werden an den idealen Speicherorten für den Interpreter abgelegt.Sie werden wahrscheinlich das Kontrollkästchen Dump Memory at char: verwenden wollen,
#
wenn Sie diese Version ausführen . Dadurch wird der Speicher beim#
Anschlagen entleert, sodass Sie den Wert auf dem Band sehen können, falls es sich um ein nicht druckbares Zeichen handelt, oder sehen können, was bei einem beliebigen Schritt geschieht. Die Zelle, auf der sich der Zeiger befindet, ist fett gedruckt.Probieren Sie es online aus
#
Anmerkungen:
>
am Anfang eine Reihe von ein. Die erforderliche Anzahl kann je nach Eingabewert variieren, beträgt jedoch O (1).quelle
tinylisp (repl), 90 Bytes (0-indiziert)
Oder nicht konkurrierend (mit einer Funktion, die nach dem Posten dieser Herausforderung festgeschrieben wurde), 80 Byte :
Die erste Zeile definiert eine Hilfsfunktion
r
und die zweite Zeile ist eine unbenannte Funktion, dien
den n-ten Term der Sequenz übernimmt und zurückgibt. Ich habe dies als Antwortübermittlung angegeben, da die Klammern für die automatische Vervollständigung am Ende jeder Zeile und nicht nur am Ende des Programms stehen. Mit diesen Vorbehalten ist hier eine Version, die für Try it online modifiziert wurde , und hier ist eine unbenutzte Version, die für die Eingaben 0 bis 54 ausgeführt wird.Erläuterung
Ich werde hier die nicht konkurrierende Version verwenden. Der einzige Unterschied ist, dass die offizielle Version Addition als zwei Subtraktionen implementieren muss.
quelle
C 54 Bytes
Nicht die kürzeste C-Lösung, aber es hat den Vorteil, in konstanter Zeit zu laufen (keine Schleifen, nur Mathematik). Es verwendet eine nullbasierte Indizierung:
Ungolfed:
Testen Sie mit:
quelle
C 103 Bytes
Für einen Anfänger ist es okay, denke ich :).
oder die formatierte Art und Weise
quelle
n,c,i,j
als global deklarieren , wird garantiert, dass sie auf 0 initialisiert werden, was für lokale Benutzer nicht zutrifft.n
ist die Eingabe oder die n-te Zahl in der Sequenz,c
ist ein Zähleri
undj
sind Schleifenelemente;j
wird 1, dann 2, dann 3 sein, währendi
wird 1, dann 1,2, dann 1,2,3 und so weiter sein. @ Qwerp-DerpGleichstrom , 21 Bytes, 0-basierte Indizierung
Probieren Sie das DC-Programm online!
Erläuterung:
Die Oberseite des Stapels enthält nun den Index k der größten Dreieckszahl, die <= n ist.
Dieses DC-Programm kann in ein Bash-Skript mit wettbewerbsfähiger Größe konvertiert werden:
Bash + Unix-Dienstprogramme, 28 Byte, 0-basierte Indizierung
Probieren Sie das Bash-Programm online aus!
quelle
C
8144 Bytesdirekte iterative Methode, 0 indiziert und leicht massiert;
Probieren Sie es online!
quelle