Das folgende Bild zeigt das Problem:
Schreiben Sie eine Funktion, die mit einer Ganzzahl als Kreisradius die Anzahl der Gitterpunkte innerhalb des zentrierten Kreises (einschließlich der Grenze) berechnet .
Das Bild zeigt:
f[1] = 5 (blue points)
f[2] = 13 (blue + red points)
andere Werte für das Prüfen / Debuggen:
f[3] = 29
f[10] = 317
f[1000] = 3,141,549
f[2000] = 12,566,345
Sollte eine angemessene Leistung haben. Sagen wir weniger als eine Minute für f [1000].
Kürzester Code gewinnt. Es gelten die üblichen Code-Golf-Regeln.
Bitte geben Sie die Berechnung und das Timing von f [1001] als Beispiel an.
Antworten:
J,
21,19,18Bildet Komplexe von -x-xj bis x + xj und nimmt die Größe an.
Edit: Mit
>:
Edit 2: Mit Hook und Monadic
~
. Läuft aus irgendeinem Grund ein paar Mal langsamer, aber immer noch 10 Sekunden für f (1000).quelle
i:
ich bin so , dass Diebstahl, danke!>:
. derp>:
. Aber hey, das ist eine coole Antwort!:)
J
27,21Sehr brutal: Berechnet sqrt (x² + y²) über den Bereich [-n, n] und zählt Elemente ≤n . Immer noch sehr akzeptable Zeiten für 1000.
Bearbeiten :
i:y
ist ziemlich viel kürzer alsy-i.>:+:y
. Danke Jesse Millikan !quelle
Ruby 1.9,
62 5854 ZeichenBeispiel:
quelle
Python 55 Zeichen
quelle
f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))
ist 17 Zeichen kürzer.Haskell, 41 Bytes
Zählt Punkte im Quadranten
x>=0, y>0
, multipliziert mit 4 und addiert 1 für den Mittelpunkt.quelle
Haskell, 44 Bytes
quelle
w<-[-n..n]
wo (normalerweise) ein boolescher Wert ist?JavaScript (ES6), 80 Byte (nicht konkurrierend, da ES6 zu neu ist)
Alternative Version, auch 80 Bytes:
ES7-Version, auch 80 Bytes:
quelle
Python 2, 48 Bytes
Wie die Lösung von fR0DDY , aber rekursiv, und gibt einen Float zurück. Die Rückgabe eines Int ist 51 Bytes:
quelle
C (gcc) , 60 Bytes
Probieren Sie es online!
Durchläuft den ersten Quadranten, multipliziert das Ergebnis mit 4 und addiert eins. Etwas weniger golfen
quelle
APL (Dyalog Extended) , 14 Byte
Probieren Sie es online!
Obwohl
i:
der in J integrierte (inklusive Bereich von -n bis n) fehlt, hat APL Extended in anderen Bereichen eine kürzere Syntax.quelle
Japt
-x
, 12 BytesProbieren Sie es online!
Erläuterung:
quelle
PHP,
8583 BytesDer Code:
Das Ergebnis (siehe https://3v4l.org/bC0cY für mehrere PHP-Versionen):
Der ungolfed Code:
Eine naive Implementierung, die
$n*($n+1)
Punkte überprüft (und 1000f(1001)
Sekunden langsamer ausgeführt wird, aber dennoch in weniger als 0,5 Sekunden berechnet wird ), und die Testsuite (unter Verwendung der in der Frage angegebenen Beispieldaten) finden Sie auf github .quelle
Clojure / ClojureScript, 85 Zeichen
Brute erzwingt den ersten Quadranten einschließlich der y-Achse, aber nicht der x-Achse. Erzeugt eine 4 für jeden Punkt und addiert sie dann mit 1 für den Ursprung. Läuft in weniger als 2 Sekunden für die Eingabe von 1000.
Missbraucht die Hölle,
for
um eine Variable zu definieren und ein paar Zeichen zu speichern. Wenn Sie dasselbe tun, um einen Alias für zu erstellenrange
, werden keine Zeichen gespeichert (und die Ausführung wird erheblich verlangsamt), und es ist unwahrscheinlich, dass Sie durch die Erstellung einer quadratischen Funktion etwas speichern werden.quelle
Pyke, 14 Bytes, nicht konkurrierend
Probieren Sie es hier aus!
quelle
Mathematica, 35 Zeichen
Aufgehoben von https://oeis.org/A000328
https://reference.wolfram.com/language/ref/SquaresR.html
SquaresR[2,k]
ist die Anzahl der Möglichkeiten, k als Summe von zwei Quadraten darzustellen, was der Anzahl der Gitterpunkte auf einem Kreis mit dem Radius k ^ 2 entspricht. Summiere von k = 0 bis k = n ^ 2, um alle Punkte auf oder innerhalb eines Kreises mit dem Radius n zu finden.quelle
2~SquaresR~k~Sum~{k,0,#^2}&
um es kürzer zu machenTcl, 111 Bytes
Einfache diskrete x- Schleife über Quadrant I, wobei bei jedem Schritt das größte y nach dem Satz von Pythagoras gezählt wird. Das Ergebnis ist das 4-fache der Summe plus eins (für den Mittelpunkt).
Die Größe des Programms hängt vom Wert von r ab . Ersetzen Sie
{1001 0 -1}
durch"$argv 0 -1"
und Sie können es mit jedem Befehlszeilenargumentwert für r ausführen .Berechnet f (1001) →
3147833.0
in ungefähr 1030 Mikrosekunden, AMD Sempron 130 2,6-GHz-64-Bit-Prozessor, Windows 7.Je größer der Radius ist, desto näher läuft die Annäherung an PI: f (10000001) in ungefähr 30 Sekunden und ergibt einen 15-stelligen Wert, der ungefähr der Genauigkeit eines IEEE-Double entspricht.
quelle
Stax , 11 Bytes
Führen Sie es aus und debuggen Sie es
quelle