La siguiente imagen muestra el problema:
Escriba una función que, dado un número entero como el radio del círculo, calcule el número de puntos de la red dentro del círculo centrado (incluido el límite).
La imagen muestra:
f[1] = 5 (blue points)
f[2] = 13 (blue + red points)
Otros valores para su comprobación / depuración:
f[3] = 29
f[10] = 317
f[1000] = 3,141,549
f[2000] = 12,566,345
Debe tener un rendimiento razonable. Digamos menos de un minuto para f [1000].
El código más corto gana. Se aplican las reglas habituales de Code-Golf.
Publique el cálculo y el momento de f [1001] como ejemplo.
Respuestas:
J,
211918Construye complejos de -x-xj a x + xj y toma magnitud.
Editar: con
>:
Edición 2: Con gancho y monádico
~
. Corre algunas veces más lento por alguna razón, pero aún así 10 segundos para f (1000).fuente
i:
, estoy tan robando que, gracias!>:
. derp>:
. Pero bueno, ¡esa es una respuesta genial!:)
J,
2721Muy brutal: calcula sqrt (x² + y²) sobre el rango [-n, n] y cuenta los elementos ≤n . Todavía tiempos muy aceptables para 1000.
Editar :
i:y
es bastante más corto quey-i.>:+:y
. Gracias Jesse Millikan !fuente
Ruby 1.9,
62 5854 caracteresEjemplo:
fuente
Python 55 Chars
fuente
f=lambda n:1+4*sum(int((n*n-i*i)**.5)for i in range(n))
es 17 caracteres más corto.Haskell, 41 bytes
Cuenta puntos en el cuadrante
x>=0, y>0
, multiplica por 4, suma 1 para el punto central.fuente
Haskell, 44 bytes
fuente
w<-[-n..n]
donde (generalmente) hay un valor booleano?JavaScript (ES6), 80 bytes (no compite porque ES6 es demasiado nuevo)
Versión alternativa, también 80 bytes:
Versión ES7, también 80 bytes:
fuente
Python 2, 48 bytes
Como la solución de fR0DDY , pero recursiva, y devuelve un flotante. Devolver un int es de 51 bytes:
fuente
C (gcc) , 60 bytes
Pruébalo en línea!
Recorre el primer cuadrante, multiplica el resultado por 4 y agrega uno. Ligeramente menos golfizado
fuente
APL (Dyalog Extended) , 14 bytes
Pruébalo en línea!
A pesar de carecer del
i:
(incluido rango de -n a n) incorporado de J, APL Extended tiene una sintaxis más corta en otras áreas.fuente
Japt
-x
, 12 bytesPruébalo en línea!
Explicación:
fuente
PHP,
8583 bytesEl código:
Su resultado (ver https://3v4l.org/bC0cY para varias versiones de PHP):
El código no golfista:
Una implementación ingenua que verifica los
$n*($n+1)
puntos (y funciona 1000 más lento, pero aún calculaf(1001)
en menos de 0.5 segundos) y el conjunto de pruebas (usando los datos de muestra proporcionados en la pregunta) se puede encontrar en github .fuente
Clojure / ClojureScript, 85 caracteres
Bruto fuerza el primer cuadrante, incluido el eje y pero no el eje x. Genera un 4 para cada punto, luego los agrega junto con 1 para el origen. Se ejecuta en menos de 2 segundos para una entrada de 1000.
Abusa muchísimo de
for
definir una variable y guardar algunos caracteres. Hacer lo mismo para crear un aliasrange
no guarda ningún carácter (y lo hace correr significativamente más lento), y parece poco probable que vaya a guardar algo haciendo una función cuadrada.fuente
Pyke, 14 bytes, no competidor
Pruébalo aquí!
fuente
Mathematica, 35 caracteres
Levantado de https://oeis.org/A000328
https://reference.wolfram.com/language/ref/SquaresR.html
SquaresR[2,k]
es el número de formas de representar k como la suma de dos cuadrados, que es igual al número de puntos de la red en un círculo de radio k ^ 2. Suma de k = 0 a k = n ^ 2 para encontrar todos los puntos en o dentro de un círculo de radio n.fuente
2~SquaresR~k~Sum~{k,0,#^2}&
para hacerlo más cortoTcl, 111 bytes
Bucle x discreto simple sobre el cuadrante I, contando el mayor y utilizando el teorema de Pitágoras en cada paso. El resultado es 4 veces la suma más uno (para el punto central).
El tamaño del programa depende del valor de r . Reemplace
{1001 0 -1}
con"$argv 0 -1"
y puede ejecutarlo con cualquier valor de argumento de línea de comando para r .Calcula f (1001) →
3147833.0
en aproximadamente 1030 microsegundos, procesador AMD Sempron 130 2.6GHz de 64 bits, Windows 7.Obviamente, cuanto mayor es el radio, más cercana es la aproximación a PI: f (10000001) se ejecuta en aproximadamente 30 segundos produciendo un valor de 15 dígitos, que es aproximadamente la precisión de un doble IEEE.
fuente
Stax , 11 bytes
Ejecutar y depurarlo
fuente