Verwandte OEIS-Sequenz: A008867
Abgeschnittene Dreieckszahl
Eine gemeinsame Eigenschaft von Dreieckszahlen ist, dass sie in einem Dreieck angeordnet werden können. Nehmen Sie zum Beispiel 21 und ordnen Sie sie in einem Dreieck aus o
s an:
O oo ooo oooo ooooo oooooo
Definieren wir eine "Kürzung", die aus jeder Ecke gleich große Dreiecke schneidet. Eine Möglichkeit, 21 abzuschneiden, ist wie folgt:
. . . ooo oooo . ooo. . . oo. .
(Die Dreiecke von .
sind aus dem Original geschnitten).
Es o
verbleiben 12 Sekunden, sodass 12 eine abgeschnittene Dreieckszahl ist.
Aufgabe
Ihre Aufgabe ist es, ein Programm oder eine Funktion (oder eine Entsprechung) zu schreiben, die eine Ganzzahl annimmt und zurückgibt (oder eine der Standardausgabemethoden verwendet), ob eine Zahl eine abgeschnittene Dreieckszahl ist.
Regeln
- Keine Standardlücken.
- Die Eingabe ist eine nicht negative Ganzzahl.
- Ein Schnitt darf nicht länger als die Hälfte des ursprünglichen Dreiecks sein (dh Schnitte dürfen sich nicht überlappen).
- Ein Schnitt kann eine Seitenlänge von Null haben.
Testfälle
Wahrheit:
0
1
3
6
7
10
12
15
18
19
Falsch:
2
4
5
8
9
11
13
14
16
17
20
Testfälle für alle ganzen Zahlen bis 50: TIO Link
Dies ist Code-Golf , also gewinnen Einsendungen mit kürzesten Bytezahlen in jeder Sprache!
quelle
Antworten:
Haskell,
4645 BytesProbieren Sie es online!
quelle
Haskell , 46 Bytes
Probieren Sie es online!
Nachdem ich eine Menge Zahlentheorie auf das Problem geworfen hatte (danke @flawr), fand ich diese Charakterisierung:
Dies bedeutet zum Beispiel, dass 4n-1 möglicherweise nicht durch 5 teilbar ist, es sei denn, es ist weiter durch 5 2 = 25 teilbar und die Gesamtzahl der 5 Faktoren ist gerade.
Haskell hat keine eingebaute Faktorisierung, aber wir können improvisieren. Wenn wir mit Faktorisierungen in Primzahlen wie 12 = 3 * 4 arbeiten , können wir die äquivalente Aussage verwenden:
Wir können die Potenz eines Prims p extrahieren, der in k as vorkommt
gcd(p^k)k
. Wir überprüfen dann, dass das Ergebnis r nicht 5 oder 7 modulo 12 as istmod(r-5)12>2
. Beachten Sie, dass r ungerade ist. Wir überprüfen auch Composites als p , da es keine Möglichkeit gibt, sie von Primzahlen zu unterscheiden, aber die Überprüfung wird so lange bestehen, wie es die Faktoren tun.Schließlich negiert
>2
zu<3
und SchaltTrue
/False
spart in der Ausgabe ein Byte , indem Sie uns verwendenor
stattand
.Eine verwandte Charakterisierung ist, dass die Teiler von 4n-1 Modulo 12 mehr Einsen und Elfen als Fünfsen und Siebenen haben.
53 Bytes
Probieren Sie es online!
quelle
Python 2 , 52 Bytes
Probieren Sie es online!
Ausgänge
True
/False
umgedreht. Verwendet diese Charakterisierung:Wir prüfen, ob eines
8*n-2+3*b*b
ein perfektes Quadrat für einesb
von1
bis istn+1
. Wir vermeiden es,b=0
weil es einen Fehler für eine Quadratwurzel eines Negativs gibtn==0
, aber das kann nicht schaden, weil nur ungeradeb
funktionieren können.Nicht rekursiv erledigt:
Python 2 , 53 Bytes
Probieren Sie es online!
quelle
range
. Hier ist es nah, weilb>n+1
es ein langer Basisfall ist und0in
kurz ist.R ,
4543 Bytes-2 Bytes dank Vlo
Probieren Sie es online!
Ich bin mir ziemlich sicher, dass wir dafür nur die ersten
n
Dreieckszahlen überprüfen müssen . Brute Force prüft, obn
es sich bei den paarweisen Differenzen um die Dreieckszahlen und deren Tripel handelt.quelle
scan()
n<-scan();n%in%outer(T<-cumsum(0:n),3*T,"-")
Gelee , 10 Bytes
Eine monadische Verknüpfung, die eine Ganzzahl akzeptiert und einen Wahrheitswert (eine nicht leere Liste) oder einen Falsey-Wert (eine leere Liste) zurückgibt.
Probieren Sie es online! (footer führt eine Python-Darstellung durch, um die
[0]
Ergebnisse so anzuzeigen, wie sie sind)... oder zeigt eine Testsuite (läuft von 0 bis einschließlich 20)
Wie?
Gegeben N, bildet die ersten N Dreieckszahlen, subtrahiert N von jeder Zahl, dividiert jedes Ergebnis durch 3 und behält alle Ergebnisse bei, die eine der ersten N Dreieckszahlen sind.
quelle
Pyt , 10 Bytes
Probieren Sie es online!
Erläuterung:
quelle
ɐ-
tutHaskell , 48 Bytes
Probieren Sie es online!
quelle
a==1
.J , 22 Bytes
Probieren Sie es online!
Unkomplizierter und etwas mangelhafter Ansatz.
Erläuterung
quelle
e.2,@(!-/3*!)[:i.2+]
e.2,@(!-/3*!)1+i.,]
VielleichtMATL , 12 Bytes
Ausgänge
1
für Wahres,0
für Falsches.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Wie es funktioniert, mit Beispiel
Betrachten Sie die Eingabe
6
quelle
Ruby ,
65 57 5248 BytesProbieren Sie es online!
Inspiriert von der Python-Antwort von xnor
quelle
Python 3 , 84 Bytes
Probieren Sie es online!
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
Erläuterung
Dies beruht auf der Tatsache, dass eine Zahl T dreieckig ist, wenn
8T+1
es sich um ein ungerades perfektes Quadrat handelt.Wir beginnen mit der Liste der Dreiecke, die wir abschneiden könnten, berechnen die möglichen größeren Dreiecke basierend auf diesen und prüfen, ob sie tatsächlich dreieckig sind.
quelle
Japt , 16 Bytes
Versuchen Sie es | Überprüfen Sie alle Testfälle
Erläuterung
Alternative
Versuch es
quelle
Add ++ , 36 Bytes
Probieren Sie es online!
quelle