Meine Aufgabe ist es, Kieselsteine in dreieckige Stapel zu stapeln. Ich mache das erst seit einem Jahrhundert und es ist schon ziemlich langweilig. Das Schlimmste ist, dass ich jeden Stapel beschrifte. Ich weiß, wie man Kieselsteine in Stapel maximaler Größe zerlegt , aber ich möchte die Anzahl der Stapel minimieren. Kannst du helfen?
Aufgabe
Zerlegen Sie eine gegebene Ganzzahl in die minimale Anzahl dreieckiger Zahlen und geben Sie diese minimale Anzahl aus.
Dreieckszahlen
Eine dreieckige Zahl ist eine Zahl, die n
für einen bestimmten Wert als Summe der ersten natürlichen Zahlen ausgedrückt werden kann n
. Somit sind die ersten paar Dreieckszahlen
1 3 6 10 15 21 28 36 45 55 66 78 91 105
Beispiel
Nehmen wir als Beispiel an, die Eingabe ist 9
. Es ist keine Dreieckszahl, daher kann es nicht als Summe der 1
Dreieckszahlen ausgedrückt werden . Somit ist die minimale Anzahl von Dreieckszahlen 2
, die mit erhalten werden kann [6,3]
, was die korrekte Ausgabe von ergibt 2
.
Nehmen wir als weiteres Beispiel an, die Eingabe ist 12
. Die naheliegendste Lösung besteht darin, einen gierigen Algorithmus zu verwenden und jeweils die größte Dreieckszahl zu entfernen, wobei sich [10,1,1]
eine Ausgabe von ergibt 3
. Es gibt jedoch eine bessere Lösung: [6,6]
die korrekte Ausgabe von 2
.
Testfälle
in out
1 1
2 2
3 1
4 2
5 3
6 1
7 2
8 3
9 2
10 1
11 2
12 2
13 2
14 3
15 1
16 2
17 3
18 2
19 3
20 2
100 2
101 2
5050 1
Regeln
- Die Eingabe-Ganzzahl liegt zwischen 1 und der maximalen Ganzzahl Ihrer Sprache.
- Ich kann mit meinen Kieselsteinen jede Sprache emulieren , und ich möchte, dass Ihr Code so klein wie möglich ist, da ich nur Kieselsteine habe, um den Überblick zu behalten. Das ist also Code-Golf , also gewinnt der kürzeste Code in jeder Sprache .
quelle
n = 12
).Antworten:
Netzhaut ,
5749 BytesProbieren Sie es online aus! Basierend auf meiner Antwort auf drei Dreieckszahlen . Ändern Sie die dritte Zeile in
^(^1|1\1)*$
, um die Null-Eingabe zu unterstützen. Bearbeiten: Dank @MartinEnder wurden 8 Bytes gespeichert (sollten aber wahrscheinlich mehr sein).quelle
1
in der zweiten Stufe und weder Gruppe1
noch3
in der dritten Stufe.((?(2)1\2|1))
kann auf gekürzt werden(1(?(2)\2))
.^((?<2>)(1\2)+){2}$
. Oder^(()(?<2>1\2)+){2}$
wenn Sie es vorziehen.Mathematica, 53 Bytes
Dieser Code ist sehr langsam. Wenn Sie diese Funktion testen möchten, verwenden Sie stattdessen die folgende Version:
Probieren Sie es auf Wolfram Sandbox
Erläuterung
quelle
Gelee ( Gabel ), 9 Bytes
Dies beruht auf einer Gabelung, bei der ich ein ineffizientes Frobenius-Lösungsatom implementiert habe. Ich kann nicht glauben, dass es schon ein Jahr her ist, seit ich es das letzte Mal berührt habe.
Erläuterung
quelle
R ,
6958 BytesProbieren Sie es online aus!
Erläuterung:
quelle
Gelee , 15 Bytes
Probieren Sie es online aus!
quelle
JavaScript (ES6),
756361 ByteWie?
Wir verwenden die folgenden Eigenschaften:
Bei einer positiven ganzen Zahl n reicht es zu testen, ob wir Folgendes finden können:
Wenn beide Tests fehlschlagen, muss n die Summe von 3 Dreieckszahlen sein.
Testfälle
Code-Snippet anzeigen
quelle
MATL , 15 Bytes
Probieren Sie es online aus!
Erläuterung
quelle
Kotlin ,
176154 BytesEinreichung
Verschönert
Prüfung
TryItOnline
quelle