Eine Dreieckszahl ist eine Zahl, die die Summe der n
natürlichen Zahlen von 1 bis ist n
. Zum Beispiel , 1 + 2 + 3 + 4 = 10
so 10
ist eine Dreieckszahl.
Bei einer positiven Ganzzahl ( 0 < n <= 10000
) als Eingabe (kann als Ganzzahl oder als Zeichenfolge verwendet werden) wird die kleinstmögliche Dreieckszahl zurückgegeben, die zur Eingabe hinzugefügt werden kann, um eine weitere Dreieckszahl zu erstellen.
Wenn Sie beispielsweise eine Eingabe machen 26
, 10
ergibt 36
das Addieren eine Dreieckszahl. Es gibt keine kleineren Dreieckszahlen 10
, die hinzugefügt werden können, 26
um eine andere Dreieckszahl zu erstellen. 10
In diesem Fall ist das richtige Ergebnis.
0
ist eine Dreieckszahl. Wenn die Eingabe selbst eine Dreieckszahl ist, sollte die Ausgabe eine Dreieckszahl sein 0
Testfälle
Fälle werden im Format angegeben input -> output (resulting triangular number)
0 -> 0 (0)
4 -> 6 (10)
5 -> 1 (6)
7 -> 3 (10)
8 -> 28 (36)
10 -> 0 (10)
24 -> 21 (45)
25 -> 3 (28)
26 -> 10 (36)
34 -> 21 (55)
10000 -> 153 (10153)
Wertung
Dies ist Codegolf, so dass die wenigsten Bytes in jeder Sprache gewinnen!
26 -> 2
?Antworten:
Java 8,
5857 BytesOnline-Testsuite
Vielen Dank an Dennis für die 1-Byte-Speicherung.
quelle
return-~i*i/2;
Speichert ein Byte.int[]
statt einesint
as-Arguments zu übergeben. Das bedeutet aber, sich später mit Arrays zu befassen. Das könnte funktionierenx->{int i=0,m=0,n=x[0];while(n!=0)n+=n<0?++i:--m;x[0]=-~i*i/2;}
, aber es sind 63 Bytes.MATL ,
13 -12 Bytes1 Byte entfernt mit einer Idee (Schnittmenge setzen) aus Emignas 05AB1E-Antwort
Probieren Sie es online!
Erläuterung
Lassen Sie
t(n) = 1 + 2 + ··· + n
die bezeichnenn
-te Dreieckszahl.Der Code macht sich die Tatsache zunutze, dass
n
die Lösung nach oben begrenzt istt(n-1)
. Um dies zu sehen, beobachten Sie, dasst(n-1) + n
gleich istt(n)
und es sich somit um eine dreieckige Zahl handelt.Betrachten Sie die Eingabe
8
als Beispiel.quelle
Q
durch Ihre Argumentation über die Begrenztheit beseitigen ?8
. Wenn die Ausgabe der Grenze entsprichtt(n-1)
, erhält der Code sie alst(n)-n
. Istt(n)
also notwendig. Trotzdem danke für die Idee!Java (OpenJDK 8) , 83 Byte
Probieren Sie es online!
Credits
quelle
m
. Also gehe icha
runter zu0
. "aber Sie weisen im -loop vielleicht 100-mal den gleichen Werta*a+a
zu ", ja, ich muss es nicht 100-mal tun, aber ich gewinne Bytes, indem ich den -loop nicht früher unterbreche.m
b
b
Mathematica, 46 Bytes
quelle
Neim ,
129 BytesDie Berechnung dauert zu lange (funktioniert aber bei unendlicher Zeit und unendlichem Speicher), sodass ich im Link nur die ersten 143 Dreieckszahlen generiere - mit
£𝕖
, was für eine Eingabe von 10.000 ausreicht, für eine Zeitüberschreitung jedoch nicht ausreicht.Warnung: Dies funktioniert möglicherweise in zukünftigen Versionen nicht mehr. Wenn ja, ersetzen Sie 143 durch £
Erläuterung:
Versuch es!
quelle
9998
ist das erwartete Ergebnis3118753
weit über der 143. Dreieckszahl (dh 10296).This takes too long to compute (but works given infinite time and memory)
£
zu einer höheren Nummer zu wechseln , wie zum Beispiel 200.PHP , 45 Bytes
Probieren Sie es online!
Ist die kürzere Variante von
for(;!$r[$t];$t+=++$i)$r[$argn+$t]=~+$t;echo~$r[$t];
Erweitert
PHP , 53 Bytes
Probieren Sie es online!
Verwenden Sie den neuen Raumschiff-Operator in PHP 7
Erweitert
PHP , 55 Bytes
Probieren Sie es online!
quelle
Java 8,
1101021009392 Bytes-2 Bytes dank @PeterTaylor .
-7 Bytes dank @JollyJoker .
-1 Byte dank @ceilingcat .
Erläuterung:
Probieren Sie es online aus.
quelle
Brachylog ,
1715 BytesProbieren Sie es online!
Erläuterung
quelle
Python 2 , 59 Bytes
Probieren Sie es online!
Hierbei wird die folgende Charakterisierung der Dreieckszahlen
t
verwendet, die hinzugefügt werden kannn
, um eine Dreieckszahl zu erhalten:Der Code nimmt das Minimum aller solcher Dreieckszahlen.
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Japt ,
24231615 BytesProbier es aus
Dank ETH 1 Byte gespart
Erläuterung
quelle
æ!øV
.Oktave ,
3836 Bytes2 Bytes weniger dank @Giuseppe!
Anonyme Funktion, die fast den gleichen Ansatz wie meine MATL-Antwort verwendet .
Probieren Sie es online!
quelle
05AB1E , 12 Bytes
Verwendet die 05AB1E- Codierung. Probieren Sie es online!
quelle
Mathematica, 62 Bytes
quelle
Solve[2*#==m(m+1)-n(n+1)
aber kürzer (wenn es funktioniert)?Python 2 ,
787170 BytesSieben Bytes gespart, Danke an Ovs und Theespinosa
Ein weiteres Byte, das aufgrund der Bemerkung von neil gespeichert wurde ,
x+9
ist ausreichend und wird auf alle natürlichen Zahlen überprüft0 <= n <= 10000
. Es wurde auch überprüft fürx+1
stattx+9
, funktioniert es auch.Probieren Sie es online!
quelle
n*-~n/2
anstelle vonn*(n+1)/2
{n*(n+1)/2for n in range(999)}
anstelle von explizitset
und auch{}
anstelle vonset
in der dritten Zeile verwendenJavaScript (ES6),
4342 ByteBearbeiten: 1 Byte dank @PeterTaylor gespeichert.
quelle
-++s
mit--s
, wie ich in meiner unabhängig abgeleitet hätte aber recht ähnlich Java - Version. (Nachtrag: Sie müssen auch den Test auf ändernn>0
).n>s
Scheck war die ganze Zeit ein roter Hering!node --stack_size=
erhöhen.Python 3 ,
6044 BytesVielen Dank an @xnor für einen Vorschlag, mit dem 16 Bytes eingespart wurden!
Probieren Sie es online!
Hintergrund
Sei n eine nicht negative ganze Zahl. Wenn n die k- te Dreieckszahl ist, haben wir
Das heißt, es wird eine natürliche Lösung geben, wenn 1 + 8n ein ungerades, perfektes Quadrat ist. Es ist offensichtlich nicht erforderlich , die Parität von 1 + 8n zu überprüfen .
Wie es funktioniert
Die rekursive Funktion n akzeptiert eine einzelne, nicht negative Ganzzahl als Argument. Wenn k mit einem einzelnen Argument aufgerufen wird, ist es standardmäßig 1 .
Zunächst wird
(8*n+1)**.5%1
geprüft, ob n eine Dreieckszahl ist: Wenn (und nur wenn),(8*n+1)**.5
wird eine ganze Zahl erhalten, sodass der Rest der Division durch 1 0 ergibt .Wenn die Modul ist 0 , der
and
wird Zustand versagen, was f auf Rückkehr 0 . Wenn dies beim ersten Aufruf von f der Fall ist, beachten Sie, dass dies die richtige Ausgabe ist, da n bereits dreieckig ist.Wenn der Modul positiv ist, gilt die
and
Bedingung undf(n+k,k+1)+k
wird ausgeführt. Dies ruft f erneut auf, inkrementiert n um k und k um 1 und addiert dann k zum Ergebnis.Wenn f (n 0 , k 0 ) schließlich 0 ergibt, verlassen wir die Rekursion. Das erste Argument im ersten Aufruf war n , das zweite n + 1 , das dritte n + 1 + 2 , bis schließlich n 0 = n + 1 +… k 0 -1 . Beachten Sie, dass n 0 - n eine dreieckige Zahl ist.
Ebenso werden alle diese Zahlen auf den innerste Rückgabewert (hinzugefügt 0 ), so ist das Ergebnis der anfänglichen Aufruf f (n) ist , n 0 - n , wie gewünscht.
quelle
n
in der Rekursion aufsteigen, können Sien
eher schreiben als(n+k)
.C # (.NET Core) ,
291281 ByteProbieren Sie es online! Programm, das einen String als Eingabe und Ausgabe über den Exit-Code akzeptiert.
Dank Kevin Cruijssen 10 Bytes gespart
quelle
class p{static int Main(string[]I){string d="0",s=I[0];int c=1,j,k;for(;;){j=k=0;string[]D=d.Split(' '),S=s.Split(' ');for(;j<D.Length;j++)for(;k<S.Length;k++)if(D[j]==S[k])return int.Parse(D[k]);j=int.Parse(D[0])+c++;d=d.Insert(0,$"{j} ");s=s.Insert(0,$"{j+int.Parse(I[0])} ");}}}
(281 bytes)for(;;)
to make an infinite loop is a nice bump, and I'll make sure to think more carefully about whether using var is actually more efficient than using an explicit type but combining the declarations, and I guess be more diligent in removing unnecessary brackets. As for the program vs. function, I started with a lambda but couldn't get it to run in TIO. I know a TIO link isn't actually necessary, but it's something I like to see in others' answers so I wanted at least something similar in my own.JavaScript (ES7),
4644 bytesTry it
quelle
r=x=0
work?05AB1E, 8 bytes
Try it online! or as a Test suite
Explanation
quelle
Dyalog APL, 19 bytes
6 bytes saved thanks to @KritixiLithos
Try it online!
How?
o←0,+\⍳⍵
- assigno
the first⍵
triangular numberso/⍨
- filtero
byo∊⍨⍵+o
- triangular numbers that summed with⍵
produce triangulars⊃
- and take the firstquelle
+\⍳⍵
should work instead of what you are using to generate the triangular numbers.⊃
works instead of⌊/
Pari/GP, 54 bytes
Try it online!
quelle
Haskell, 56 bytes
Try it online!
quelle
Add++, 68 bytes
Try it online!, or see the test suite!
Even Java is beating me. I really need to add some set commands to Add++
How it works
quelle
R,
46444341 bytesTry it online!
An anonymous function with one mandatory argument,
x
; computes firstx+1
triangular numbers as an optional argument to golf out a few curly braces. I usedchoose
before I saw Luis Mendo's Octave answer.I shaved off a few bytes of Luis Mendo's answer but forgot to use the same idea in my answer.
quelle
Jelly, 18 bytes
Try it online!
quelle
Python 2,
8381 bytesTry it online!
quelle
APL (Dyalog Classic),
1614 bytesTry it online!
quelle
Clojure, 74 bytes
Pick your favourite :) Loops might be shorter...
quelle
Python 2, 82 bytes
Try it online
This was created by modifying this answer from the related question.
quelle