Beschreibung
Es gab schon einige andere Herausforderungen in Bezug auf diese Zahlen, und ich hoffe, dass diese nicht darunter ist.
Die n- te Dreieckszahl entspricht der Summe aller natürlichen Zahlen bis zu n einfachen Sachen. Für diejenigen, die sich weiter informieren möchten, gibt es eine Wikipedia-Seite und einen Eintrag bei OEIS .
Nun fand Gauß heraus, dass jede natürliche Zahl als Summe von drei Dreieckszahlen (einschließlich 0
) ausgedrückt werden kann , und es ist in Ordnung, eine Zahl mehr als einmal zu haben, z 0 + 1 + 1 = 2
.
Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion mit einer natürlichen Zahl (einschließlich 0
) zu schreiben, die drei Dreieckszahlen ausgibt, die das Argument ergeben. Sie können die durch Leerzeichen getrennten Zahlen als Array oder nach einer anderen Methode ausdrucken. Es ist jedoch verboten , eingebaute Funktionen zu verwenden, um direkt ein Array, einen Bereich oder eine andere Form der Sammlung abzurufen, die eine Liste dreieckiger Zahlen enthält (zum Beispiel ein einzelnes Atom, das den Bereich ergibt).
Testfälle
9 -> 6 + 3 + 0 or 3 + 3 + 3
12 -> 6 + 6 + 0 or 6 + 3 + 3 or 10 + 1 + 1
13 -> 6 + 6 + 1
1 -> 1 + 0 + 0
0 -> 0 + 0 + 0
Hinweis: Wenn es mehr als eine mögliche Kombination gibt, können Sie eine oder alle drucken, aber Sie müssen jede Kombination nur einmal drucken, um alle Kombinationen zu entfernen, die das Ergebnis einer Neuanordnung anderer Kombinationen sind. Ich würde mich sehr über einen Try-It-Link und eine Erklärung freuen. Ich freue mich sehr zu sehen, wie Sie das Problem lösen.
Dies ist Code-Golf , daher gelten Standard-Regelungslücken. Möge die kürzeste Antwort in Bytes gewinnen!
quelle
a
wird nicht immer eine dreieckige Zahl seinn
und eine Liste der erstenn
Rückdreieckszahlen sind zulässig? Das fühlt sich eher gegen eine bestimmte Sprache gerichtet an, obwohl ich nicht weiß, welche.Antworten:
05AB1E , 10 Bytes
Code:
Erläuterung:
Verwendet die 05AB1E- Codierung. Probieren Sie es online!
quelle
Python 2 , 99 Bytes
Probieren Sie es online!
Ich bin ziemlich erstaunt, dass dies kürzer ist als
itertools
oder ein dreifaches Listenverständnis! Es spuckt (irgendwann) jedes Mal eine zufällige Antwort aus, wenn Sie es ausführen.Zwei 102er:
itertools sieht aus wie 106:
quelle
Gelee , 12 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Brachylog , 13 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
MATL , 18 Bytes
Dies gibt das erste Ergebnis in lexikografischer Reihenfolge aus.
Probieren Sie es bei MATL Online!
Erläuterung
quelle
Haskell,
6659 BytesVielen Dank, dass Sie alle Lösungen ausgeben konnten, das war eine faszinierende Ablenkung! Ich war so froh, nicht eine Lösung extrahieren zu müssen und in der Lage zu sein, ihnen alles zu geben, dass ich die Kosten, die durch die Vermeidung von permutierten Lösungen entstehen, nicht bemerkte. @Lynns Bemerkung erklärte mir das und ließ mich 7 Bytes sparen.
Dies bindet mehr als genug Dreieckszahlen an
l
und überprüft alle Kombinationen.quelle
a>=b,b>=c
Bedingungen und das Hinzufügen!!0
von Suffixen zu Ihrem Code nicht auch eine gültige Antwort? Die Ausgabe aller Lösungen hilft Ihnen hier nicht wirklich.Retina ,
6359 BytesProbieren Sie es online! Link enthält Testfälle.
(1(?(1)\1))*
ist ein verallgemeinerter Dreieckszahlenvergleicher, aber für die erste Dreieckszahl können wir ein paar Bytes einsparen, indem wir^
für die anfängliche Übereinstimmung verwenden.quelle
PHP , 351 Bytes
Probieren Sie es online!
quelle
Python 3 , 119 Bytes
Probieren Sie es online!
Vielen Dank an @WheatWizard für das Speichern von 12 Bytes!
quelle
map
(und vielleicht Ihr Filter) kann als Listenverständnis kürzer geschrieben werden.map
[*filter(...)]
(x,y,z) for x,y,z in...
welche länger ist als Ihre,l for l in...
die wahrscheinlich für diesen Unterschied verantwortlich ist.C / C ++ - 197 Bytes
Schlag für Schlag:
Benötigt für printf. Könnte für bestimmte Versionen von C entfallen
Platzsparend für Schleife.
Rekursiver Dreiecksauswerter.
Dieser Typ macht das schwere Heben. Drei verschachtelte for-Schleifen iterieren a, b, c von 0 bis n. Beachten Sie, dass b und c jeweils vom vorherigen Wert bis zu n iterieren. Es ist nicht unbedingt erforderlich, die Iteration auf diese Weise zu trimmen, da das
return
Problem des "Duplizierens" durch das Kommen in einer Minute behoben wird.Wenn die Summe der drei Dreiecke auf der inneren Ebene
==
den gewünschten Wert ergibt, drucken Sie die Dreiecke aus und kehren Sie zurück.Sie können das
return
Schlüsselwort legal entfernen und den Rückgabetyp von c in void konvertieren, um ein paar weitere Bytes zu sparen und alle möglichen Lösungen zu drucken. Aus diesem Grund sind die Iterationen begrenzt, wenn alle von ihr ausgeführten Schleifen0
zun
Duplikaten führen würden.quelle
Mathematica, 63 Bytes
quelle
First
das spart ein sattes 2 Bytes ,(t=#;#&@@Select[Table[i(i+1)/2,{i,0,t}]~Tuples~{3},Tr@#==t&])&
62 Bytes.CJam , 26 Bytes
Port meiner MATL-Antwort. Dies ist ein anonymer Block, der die Eingabe auf dem Stapel erwartet und durch das Ausgabearray ersetzt.
Probieren Sie es online!
quelle
R , 66 Bytes
Brute-Force-Algorithmus; liest
n
aus stdin und gibt einen Datenrahmen zurück, in dem jede Zeile eine Kombination von 3 Dreieckszahlen ist, die sich summierenn
. Bei Bedarf kann ich nur die erste Zeile für +4 Bytes zurückgeben.Probieren Sie es online!
quelle
Java 8, 164 Bytes
Erläuterung:
Probieren Sie es hier aus.
quelle
JavaScript, 108 Bytes
Erläuterung
x
repräsentiert die Eingabewhile(a<=x)r.push(a=i++*i/2)
Erstellt ein Array aller Dreieckszahlen bis zu xDie
for
Schleife druckt die höchste dreieckige Zahl kleiner alsx
und subtrahiert diese Zahl dannx
für drei Iterationen. (im Grunde ein gieriger Algorithmus)quelle
x = 103
:91 + 10 + 1 = 102
Pyth, 19 Bytes
Ich bin so aus der Übung mit Pyth, es ist falsch: /
Probieren Sie es hier aus .
quelle
J , 36 Bytes
Probieren Sie es online!
quelle
Rubin
615755 BytesInspiriert von Lynns Python- Antwort . Es werden zufällige Triplets erzeugt, bis die gewünschte Summe erreicht ist:
Es benötigt Ruby 2.4. In Ruby 2.3 und älteren Versionen handelt es sich um einen Syntaxfehler, der
Range#sum
nicht definiert ist. Diese längere Version (64 Bytes) wird für Ruby 2.3 benötigt:Hier ist ein kleiner Test:
Probieren Sie es online mit Ruby 2.3!
quelle
Javascript (ES6), 108 Bytes - behoben
Nimmt eine Ganzzahl als Eingabe, gibt ein Array
[a, b, c]
mit einer sortierten Liste von Dreiecksnummern ausa + b + c = x
, wobeia
die größte Dreiecksnummer kleiner oder gleich der Eingabe ist undb
die größte Dreiecksnummer kleiner oder gleich dem Eingabe-Minus ista
.Erläuterung
Code-Snippet anzeigen
quelle
x-m-n
eine Dreieckszahl, dh warum funktioniert das?