Zerlegen Sie eine ganze Zahl n in eine Summe maximaler Dreieckszahlen (wobei T m die m- te Dreieckszahl oder die Summe der ganzen Zahlen von 1 bis m darstellt ) wie folgt:
während n> 0 ist ,
finde die größtmögliche Dreieckszahl T m, so dass T m ≤ n ist .
hänge m an die Dreieckszerlegungsdarstellung von n an .
subtrahiere T m von n .
Zum Beispiel würde eine Eingabe von 44 eine Ausgabe von 8311 ergeben , weil:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 <44, aber 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45> 44.
- die erste Ziffer ist 8 ; Subtrahiere 36 von 44, um 8 übrig zu haben.
1 + 2 + 3 = 6 <8, aber 1 + 2 + 3 + 4 = 10> 8.
- die zweite Ziffer ist 3 ; subtrahiere 6 von 8, um 2 übrig zu haben.
1 <2, aber 1 + 2 = 3> 2.
- Die dritte und vierte Ziffer müssen 1 und 1 sein .
Verwenden Sie die Ziffern 1 bis 9, um die ersten 9 Dreieckszahlen darzustellen, und verwenden Sie dann die Buchstaben a bis z (in Groß- oder Kleinbuchstaben), um die 10. bis 35. Dreieckszahl darzustellen. Sie werden niemals eine Eingabe erhalten, die die Verwendung einer größeren "Ziffer" erfordert.
Die Grenzen für die Eingabe sind 1 ≤ n <666 und es wird immer eine ganze Zahl sein.
Alle möglichen Ein- und Ausgaben sowie einige ausgewählte Testfälle (als Eingabe, dann Ausgabe aufgelistet):
1 1
2 11
3 2
4 21
5 211
6 3
100 d32
230 k5211
435 t
665 z731
Eine Ausgabe von ∞ für eine Eingabe von -1/12 ist nicht erforderlich. :)
Antworten:
JavaScript (ES6), 52 Byte
Wie?
Anstatt explizit T i = 1 + 2 + 3 +… + i zu berechnen , beginnen wir mit t = 0 und subtrahieren iterativ t + 1 von n, während t <n ist , wobei wir t bei jeder Iteration inkrementieren . Wenn die Bedingung nicht mehr erfüllt ist, wurde insgesamt T t von n subtrahiert und die Ausgabe entsprechend aktualisiert. Wir wiederholen den Vorgang bis n = 0 ist .
Nachfolgend finden Sie eine Zusammenfassung aller Operationen für n = 100 .
Testfälle
Code-Snippet anzeigen
quelle
Jelly ,
1817 BytesDies ist eine monadische Verknüpfung, die auf STDOUT gedruckt wird. Der Rückgabewert ist 0 und sollte ignoriert werden.
Probieren Sie es online!
quelle
Gleichstrom, 74 Bytes
Das ist schrecklich.
quelle
JavaScript (ES6),
61-57Byte4 Bytes dank @Arnauld eingespart
quelle
f=(n,t=0)=>n?t+1>n?t.toString(36)+f(n):f(n-++t,t):1
f=(n,p=q=0)
undf(n,++q+p)
?Java 7, 81 Bytes
Port von @Arnauld 's erstaunlicher JavaScript (ES6) Antwort .
Mein eigener Ansatz war fast 2x so lang ..
Probieren Sie es hier aus.
Erläuterung:
quelle
Retina ,
1151083834 Bytes[Online testen!] (Einschließlich Testsuite) Verwendet Großbuchstaben. Edit:
70 bis74 Bytes durch schamloses Anpassen von @ MartinEnders Antwort auf Is this number triangular? Erläuterung: Die Zahl wird in eine unäre Zahl umgewandelt. Anschließend wird die größtmögliche dreieckige Zahl wiederholt abgeglichen, bis die Zahl erschöpft ist. Jede Übereinstimmung wird dann in die Basis 36 umgewandelt.quelle
PHP, 74 Bytes
Online Version
quelle
R 87 Bytes
Ursprünglich habe ich versucht, die möglichen Dreieckszahlen voreinzustellen. Dies führte zu diesem Code mit 105 Bytes:
Dies erforderte mehr Indizierung, daher habe ich die Methode von @Arnauld ausprobiert, um die Bytes auf 87 zu reduzieren.
Beide Codes verwendeten die voreingestellten Buchstaben, da ich keinen kurzen Weg fand, sie in die Basis 36 zu konvertieren.
quelle