Gol
Cree un programa / función que tome una entrada N
, verifique si N
los pares aleatorios de enteros son relativamente primos y retorna sqrt(6 * N / #coprime)
.
TL; DR
Estos desafíos son simulaciones de algoritmos que solo requieren la naturaleza y su cerebro (y tal vez algunos recursos reutilizables) para aproximarse a Pi. Si realmente necesitas Pi durante el apocalipsis zombie, ¡estos métodos no desperdician munición ! Hay ocho desafíos más por venir. Revisa la publicación de sandbox para hacer recomendaciones.
Simulación
¿Qué estamos simulando? Bueno, la probabilidad de que dos enteros aleatorios sean relativamente primos (es decir, coprime o mcd == 1) es 6/Pi/Pi
, por lo que una forma natural de calcular Pi sería recoger dos cubos (o puñados) de rocas; cuéntalos; ver si su mcd es 1; repetir. Después de hacer esto un par de veces, sqrt(6.0 * total / num_coprimes)
tenderá a hacerlo Pi
. Si calcular la raíz cuadrada en el mundo post-apocalíptico te pone nervioso, ¡no te preocupes! Hay un método de Newton para eso.
¿Cómo estamos simulando esto?
- Tomar entrada
N
- Haz los siguientes
N
horarios:- Generar uniformemente enteros positivos al azar,
i
yj
- Con
1 <= i , j <= 10^6
- Si
gcd(i , j) == 1
:result = 1
- Más:
result = 0
- Generar uniformemente enteros positivos al azar,
- Toma la suma de los
N
resultados,S
- Regreso
sqrt(6 * N / S)
Especificación
- Entrada
- Flexible, tome la entrada en cualquiera de las formas estándar (por ejemplo, parámetro de función, STDIN) y en cualquier formato estándar (por ejemplo, cadena, binario)
- Salida
- Flexible, dé salida en cualquiera de las formas estándar (por ejemplo, devolución, impresión)
- El espacio en blanco, el espacio en blanco al final y al final es aceptable
- Precisión, proporcione al menos 4 decimales de precisión (es decir
3.1416
)
- Tanteo
- ¡El código más corto gana!
Casos de prueba
Es posible que su salida no se alinee con estos, debido a la posibilidad aleatoria. Pero en promedio, debe obtener esta precisión para el valor dado de N
.
Input -> Output
----- ------
100 -> 3.????
10000 -> 3.1???
1000000 -> 3.14??
fuente
N = 1000000
o está bien si el programa regresa, por ejemplo, un desbordamiento de pila siN
es demasiado grande?N=10^6
.Respuestas:
APL, 23 bytes
Explicación:
?⍵2⍴1e6
: genera una matriz de 2 por ⍵ de números aleatorios en el rango [1..10 6 ]1+.=∨/
: obtenga el MCD de cada par y vea cuántos son iguales a 1. Esto calcula S..5*⍨6×⍵÷
: (6 × ⍵ ÷ S) 0.5fuente
Jalea ,
20 1816 bytes-2 bytes gracias a @ Pietu1998 (cadena y uso cuenta 1s,
ċ1
en lugar de menos de dos sumados<2S
)-2 bytes gracias a @Dennis (repita 1e6 varias veces antes del muestreo para evitar el encadenamiento)
(Extremadamente lento debido a la función aleatoria)
¿Cómo?
TryItOnline
fuente
ḤRµȷ6Xµ€g2/ċ1÷³6÷½
ahorra 2 bytes. (ȷ6
es 10 ^ 6 en un solo nilad,ċ1
cuenta unos)ȷ²
es un poquito más rápido queȷ6
)ȷ²
ser dos enlaces no hace daño aquí, pero requeriría un enlace adicional o¤
para algunos casos de usoḤȷ6xX€
debería funcionar para el muestreo aleatorio.Python 2,
143140132124122124122 bytesHa pasado bastante tiempo desde que probé el golf, ¡así que puede que me haya perdido algo aquí! Se actualizará a medida que acorte esto.
Ponme a prueba aquí!
gracias a Jonathan Allan por el ahorro de dos bytes :)
fuente
1 <= i , j <= 10^6
por lo que debe usarrandrange(1,1e6+1)
.k=lambda:r.randrange(1e6)+1
ahorra dos bytesMathematica,
494851 bytesSe guardó un byte y se corrigió un error gracias a @ LegionMammal978 .
fuente
(6#/Count[GCD@@1*^6~RandomInteger~{2,#},1])^.5&
1*^6
debe reemplazarse{1,1*^6}
para garantizar que i , j ≠ 0.R,
1039995999894 bytesEs probable que pueda jugar un poco de golf. Reduzca 4 bytes debido a @ antoine-sac, y otros 4 bytes definiendo un alias para
sample
, usando en^.5
lugar desqrt
y en1e6
lugar de10^6
. Se agregaron 4 bytes para garantizar que el muestreo dei
yj
sea realmente uniforme. Se eliminó un byte después de darme cuenta de que6*N/sum(x)
es lo mismo que6/mean(x)
. Se usa enpryr::f
lugar defunction(x,y)
guardar 4 bytes.Salida de muestra:
fuente
sample(10^6,N)
. No solo es más corto, también es mucho más eficiente.sample(10,10)
se garantiza que devolverá todos los números en 1:10, mientrassample(10,10,T)
que producirá una selección aleatoria donde los números se pueden repetir.En realidad, 19 bytes
Pruébalo en línea!
Explicación:
fuente
MATL , 22 bytes
Pruébalo en línea!
fuente
Pyth, 21 bytes
Pruébalo en línea.
Explicación
fuente
Scala,
149126bytesExplicación:
fuente
6f
,Seq.fill
ymath.random
.Raqueta 92 bytes
Sin golf:
Pruebas:
Salida:
fuente
JavaScript (ES7),
1079594 bytesLa versión ES6 tiene exactamente 99 bytes, pero el operador de exponenciación ES7
**
ahorra 5 bytesMath.sqrt
.Sin golf
fuente
gcd
llama a la funcióng
r=_=>
es ese código o un dibujo?n=>(n*6/(r=_=>Math.random()*1e6,g=(a,b)=>b?g(b,a%b):a>-2,q=n=>n&&g(~r(),~r())+q(n-1))(n))**.5
1B más corton=>(n*6/(q=_=>n--&&q(r=_=>Math.random()*1e6)+g(~r(),~r()))(g=(a,b)=>b?g(b,a%b):a>-2))**.5
PHP,
827774 bytesCorre así:
Explicación
Hace lo que dice en la lata. Requiere PHP_GMP para
gcd
.Ajustes
$argn
fuente
Perl, 64 bytes
Requiere la opción de línea de comando
-pMntheory=gcd
, contada como 13. La entrada se toma de stdin.Uso de muestra
fuente
R, 94 bytes
Relativamente lento pero aún funciona. Replica N veces una función que toma 2 números aleatorios (de 1 a 1e6) y comprueba si su mcd es menor que 2 (utilizando una función mcd antigua mía ).
fuente
1:x
funcionará.PowerShell v2 +,
118114bytesToma entrada
$n
, inicia unfor
ciclo hasta que sea$k
igual$n
(implícito$k=0
al entrar por primera vez al ciclo). En cada iteración, obtenga nuevosRandom
números$i
y$j
(el indicador de-mi
nimum1
asegura que estamos>=1
y no permite ningún indicador de máximo[int]::MaxValue
, lo cual está permitido por el OP ya que es mayor que10e6
).Luego entramos en un bucle GCD
while
. Entonces, siempre que el GCD sea1
,$o
se incrementa. Al final delfor
ciclo, hacemos una[math]::Sqrt()
llamada simple , que se deja en la tubería y la salida es implícita.Tarda unos 15 minutos en ejecutarse con la entrada
10000
en mi portátil Core i5 de ~ 1 año.Ejemplos
fuente
Java 8,
164151bytesExplicación
Arnés de prueba
Actualizar
fuente
n
,t+=1
puede convertirset++
, puede condensar susint
declaraciones en una línea, es decirint c=n,t=0,x,y;
, y!=0
(creo) puede convertirse>0
. Eso debería ahorrar 12 bytes en general. Sin embargo, esa es una buena manera de encontrar el MCD de x e y.Perl 6 ,
5653 bytesPruébalo en línea!
fuente
Frink,
8489Tuve suerte: g = n = ... guarda un byte sobre g = 0 n = ... ; y 1% gcd () da (0,1) vs (1,0) para que pueda restar. Y la mala suerte: n preasignado y un utilizaron porque las variables de bucle y sus límites son locales y no definido fuera del bucle.
Verboso
fuente
AWK , 109 bytes
Pruébalo en línea!
Me sorprende que se ejecute en un tiempo razonable para 1000000.
fuente
Pyt ,
3735 bytesExplicación:
fuente
J, 27 bytes
Explicación:
Tuve mucha suerte con un
3.14157
forN = 10000000
, que tardó2.44
segundos.fuente
Japt , 23 bytes
Intentalo
fuente