Hintergrund
Ein Dreiecksgitter ist ein Gitter, bei dem die Ebene regelmäßig mit gleichseitigen Dreiecken der Seitenlänge 1 gekachelt wird. Das folgende Bild zeigt ein Beispiel für ein Dreiecksgitter.
Ein dreieckiger Gitterpunkt ist ein Eckpunkt eines Dreiecks, das das Dreiecksgitter bildet.
Der Ursprung ist ein fester Punkt in der Ebene, der einer der dreieckigen Gitterpunkte ist.
Herausforderung
Bestimmen Sie bei einer nicht negativen ganzen Zahl n
die Anzahl der dreieckigen Gitterpunkte, deren euklidischer Abstand vom Ursprung kleiner oder gleich ist n
.
Beispiel
Die folgende Abbildung ist ein Beispiel dafür n = 7
(sie zeigt der Einfachheit halber nur einen 60-Grad-Bereich, wobei Punkt A der Ursprung ist):
Testfälle
Input | Output
---------------
0 | 1
1 | 7
2 | 19
3 | 37
4 | 61
5 | 91
6 | 127
7 | 187
8 | 241
9 | 301
10 | 367
11 | 439
12 | 517
13 | 613
14 | 721
15 | 823
16 | 931
17 | 1045
18 | 1165
19 | 1303
20 | 1459
40 | 5815
60 | 13057
80 | 23233
100 | 36295
200 | 145051
500 | 906901
1000 | 3627559
Hinweis : Diese Sequenz ist nicht OEIS A003215 .
Regeln
Es gelten die Standardregeln für Code-Golf . Die kürzeste Einsendung gewinnt.
Bitte geben Sie an, wie Sie die Herausforderung gelöst haben.
n
sind. Sie enthält also doppelt so viele Begriffe wie Sie möchten.n^2+1
Begriffe von OEIS A004016 .Antworten:
Python 2 , 43 Bytes
Probieren Sie es online!
Das ist schwarze Magie.
Bietet 250 Wiederholungen für einen schriftlichen Nachweis.SieheLynns Antwortfür einen Beweis und eine Erklärung.quelle
Haskell , 48 Bytes
Probieren Sie es online!
Verwendet die "schwarze Magie" -Formel von xnor:
Ein Beweis für seine Richtigkeit und eine Erklärung, wie xnor es geschafft hat, es in 43 Bytes Python auszudrücken, finden Sie hier .
quelle
Wolfram Language (Mathematica) ,
535150 Bytes-1 Byte dank @miles
Probieren Sie es online!
Wie?
Anstatt daran zu denken:
Stellen Sie es sich so vor:
Wir wenden also die Transformationsmatrix
[[sqrt(3)/2, 0], [1/2, 1]]
an, um die zweite Figur in die erste zu transformieren.Dann müssen wir den Kreis im Dreiecksgitter in kartesischen Koordinaten finden.
Also finden wir Gitterpunkte
x, y
so, dassx^2 + x y + y^2 <= r^2
Zum Beispiel mit
r = 3
:quelle
x^2+x y+y^2
kann auch aus dem Kosinussatz mit 120 Grad abgeleitet werden.x^2+x y+y^2
->x(x+y)+y^2
spart ein Bytex^2 + xy + y^2
kann auch aus der Norm einer Eistenstein-Ganzzahl abgeleitet werdena^2 - ab + b^2
. Beachten Sie, dass das Vorzeichen vona
undb
außer im Begriff irrelevant ist,ab
sodass es die gleiche Anzahl von Lösungen gibt.Wolfram Language (Mathematica) , 48 Byte
Basierend auf OEIS A004016 .
Probieren Sie es online!
quelle
CJam (24 Bytes)
Dies ist ein anonymer Block (eine Funktion), der ein Argument auf dem Stapel nimmt und das Ergebnis auf dem Stapel belässt. Online-Testsuite . Beachten Sie, dass die beiden größten Fälle zu langsam sind.
Erläuterung
alephalpha stellte in einem Kommentar zur Frage fest, dass
Mein Beweis für die Richtigkeit dieser Formel basiert auf einigen Informationen, die ich über den OEIS-Link von alephalpha erhalten habe:
Code-Zerlegung
quelle
J , 27 Bytes
Probieren Sie es online!
Basierend auf der Methode von JungHwan Min .
Erläuterung
quelle
APL (Dyalog Classic) , 23 Byte
Probieren Sie es online!
Hommage an Xnors und Lynns Antworten
Der letzte Test wird kommentiert, weil er mehr Speicher benötigt, z. B.
MAXWS=200M
in der Umgebungquelle
Jelly , 14 Bytes
Verwendet die @ JungHwanMin-Methode .
Probieren Sie es online!
quelle
Jelly ,
15 bis13 Bytes-2 dank Dennis (erhöhe einfach das Quadrat, um die Verkettung einer Null zu vermeiden; vermeide den Kopf, indem du ein Post-Differenz-Modulo-Slice anstelle eines Pre-Differenz-Slice verwendest)
Verwendet die "schwarze Magie" -Methode, um die von xnor in ihrer Python-Antwort offen gelegte Antwort zu verfeinern , verwendet jedoch Iteration anstelle von Rekursion (und etwas weniger Berechnung).
Eine monadische Verknüpfung, die eine nicht negative Ganzzahl akzeptiert und eine positive Ganzzahl zurückgibt.
Probieren Sie es online! Oder schauen Sie sich die Testsuite an .
Wie?
quelle
JavaScript (ES6), 65 Byte
Dies ist ein Port der @ JungHwanMin-Lösung .
Probieren Sie es online!
Ursprüngliche Antwort (ES7), 70 Bytes
Geht einfach durch das Gitter und zählt die passenden Punkte.
Probieren Sie es online!
quelle
true
statt1
; 46, wenn wir es auch ganzzahlig teilen). Und ich kenne JavaScript nicht gut genug, um die Integer-Divisionen zu spielen~~(a/b)
, aber ich bin sicher, dass es auch für diese einen kürzeren Weg gibt.Java 8, 65 Bytes
Port von @xnors Python 2 Antwort .
Probieren Sie es online aus.
quelle
Pari / GP , 42 Bytes
Verwendung des eingebauten
qfrep
.Probieren Sie es online!
quelle
C # (Visual C # Interactive Compiler) , 68 Byte
Probieren Sie es online!
Wie alle anderen auch, leider. Ich weiß, dass es wahrscheinlich eine bessere Möglichkeit gibt, dies zu schreiben, aber das gleichzeitige Deklarieren und Aufrufen eines Lambda in c # ist nicht genau das, was ich tue, naja, jemals. Obwohl mir zu meiner Verteidigung kein guter Grund einfällt (natürlich außerhalb von Code Golf), dies zu tun. Wenn dennoch jemand weiß, wie Sie dies tun können, lassen Sie es mich wissen und / oder stehlen Sie das Guthaben, denke ich.
quelle
Wolfram Language (Mathematica) , 39 Byte
Probieren Sie es online!
Verwenden der Koordinatentransformation von JungHwan Min und einfaches Zählen der Lösungen über die ganzen Zahlen.
quelle
05AB1E , 15 Bytes
Port of @JonathanAllans Jelly-Antwort , die wiederum eine Ableitung von @ xnors 'black magic'-Formel ist .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle