Objetivo
Crie um programa / função que receba uma entrada N
, verifique se N
pares aleatórios de números inteiros são relativamente primos e retorne sqrt(6 * N / #coprime)
.
TL; DR
Esses desafios são simulações de algoritmos que exigem apenas a natureza e seu cérebro (e talvez alguns recursos reutilizáveis) para aproximar o Pi. Se você realmente precisa de Pi durante o apocalipse zumbi, esses métodos não desperdiçam munição ! Existem mais oito desafios por vir. Faça o checkout da caixa de areia para fazer recomendações.
Simulação
O que estamos simulando? Bem, a probabilidade de que dois inteiros aleatórios sejam relativamente primos (por exemplo, coprime ou gcd == 1) é 6/Pi/Pi
, portanto, uma maneira natural de calcular Pi seria colher dois baldes (ou punhados) de rochas; conta-os; veja se o seu gcd é 1; repetir. Depois de fazer isso um par muitas vezes, sqrt(6.0 * total / num_coprimes)
tenderá para Pi
. Se calcular a raiz quadrada no mundo pós-apocalíptico o deixa nervoso, não se preocupe! Existe o método de Newton para isso.
Como estamos simulando isso?
- Aceitar entrada
N
- Faça os seguintes
N
horários:- Gere uniformemente números inteiros positivos aleatórios
i
ej
- Com
1 <= i , j <= 10^6
- Se
gcd(i , j) == 1
:result = 1
- Outro:
result = 0
- Gere uniformemente números inteiros positivos aleatórios
- Pegue a soma dos
N
resultados,S
- Retorna
sqrt(6 * N / S)
Especificação
- Entrada
- Flexível, receba informações de qualquer uma das formas padrão (por exemplo, parâmetro de função, STDIN) e em qualquer formato padrão (por exemplo, String, Binário)
- Saída
- Flexível, produza de qualquer forma padrão (por exemplo, devolução, impressão)
- Espaço em branco, espaço em branco à direita e à esquerda é aceitável
- Precisão, forneça pelo menos 4 casas decimais de precisão (ou seja
3.1416
)
- Pontuação
- O código mais curto vence!
Casos de teste
Sua saída pode não estar alinhada com isso, por causa do acaso. Mas, em média, você deve obter tanta precisão para o valor especificado de N
.
Input -> Output
----- ------
100 -> 3.????
10000 -> 3.1???
1000000 -> 3.14??
fonte
N = 1000000
ou tudo bem se o programa retornar, por exemplo, um estouro de pilha seN
for muito grande?N=10^6
.Respostas:
APL, 23 bytes
Explicação:
?⍵2⍴1e6
: gerar uma matriz de 2 por of de números aleatórios no intervalo [1..10 6 ]1+.=∨/
: obtenha o MDC de cada par e veja quantos são iguais a 1. Isso calcula S..5*⍨6×⍵÷
: (6 × ÷ ÷ S) 0,5fonte
Geléia ,
20 1816 bytes-2 bytes graças a @ Pietu1998 (contagem de cadeia e uso 1s,
ċ1
no lugar de menos de dois somados<2S
)-2 bytes graças a @Dennis (repita 1e6 várias vezes antes da amostragem para evitar encadeamento)
(Extremamente lento devido à função aleatória)
Quão?
TryItOnline
fonte
ḤRµȷ6Xµ€g2/ċ1÷³6÷½
economiza 2 bytes. (ȷ6
É de 10 ^ 6, em uma única nilad,ċ1
contagens aqueles)ȷ²
é uma pequena pouquinho mais rápido do queȷ6
)ȷ²
sendo dois links não faz mal aqui, mas exigiria uma ligação extra ou¤
para alguns casos de usoḤȷ6xX€
deve funcionar para a amostragem aleatória.Python 2,
143140132124122124122 122 bytesJá faz algum tempo desde que tentei jogar golfe, por isso posso ter perdido algo aqui! Será atualizado à medida que reduzi isso.
Teste-me aqui!
graças a Jonathan Allan pelo salvamento de dois bytes :)
fonte
1 <= i , j <= 10^6
então você precisa usarrandrange(1,1e6+1)
.k=lambda:r.randrange(1e6)+1
salva dois bytesMathematica,
494851 bytesSalvo um byte e corrigido um erro, graças a @ LegionMammal978 .
fonte
(6#/Count[GCD@@1*^6~RandomInteger~{2,#},1])^.5&
1*^6
deve ser substituído por{1,1*^6}
para garantir que i , j ≠ 0.R,
1039995999894 bytesProvavelmente pode ser jogado um pouco abaixo. Corte 4 bytes devido a @ antoine-sac e outros 4 bytes definindo um alias para
sample
, usando em^.5
vez desqrt
e em1e6
vez de10^6
. Adicionado 4 bytes para garantir que a amostragemi
ej
seja verdadeiramente uniforme. Removido um byte depois que percebi que6*N/sum(x)
é o mesmo que6/mean(x)
. Usado empryr::f
vez defunction(x,y)
salvar 4 bytes.Saída de amostra:
fonte
sample(10^6,N)
. Além de ser mais curto, também é muito mais eficiente.sample(10,10)
é garantido o retorno de todos os números em 1:10, ao passosample(10,10,T)
que produzirá uma seleção aleatória na qual os números podem ser repetidos.Na verdade, 19 bytes
Experimente online!
Explicação:
fonte
MATL , 22 bytes
Experimente online!
fonte
Pitão, 21 bytes
Experimente online.
Explicação
fonte
Scala,
149126 bytesExplicação:
fonte
6f
,Seq.fill
emath.random
.Raquete 92 bytes
Ungolfed:
Teste:
Saída:
fonte
JavaScript (ES7),
1079594 bytesA versão do ES6 tem exatamente 99 bytes, mas o operador de exponenciação do ES7
**
economiza 5 bytesMath.sqrt
.Ungolfed
fonte
gcd
chama a funçãog
r=_=>
esse código ou um desenho?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 mais curton=>(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 bytesExecute assim:
Explicação
Faz o que diz na lata. Requer PHP_GMP para
gcd
.Tweaks
$argn
fonte
Perl, 64 bytes
Requer a opção de linha de comando
-pMntheory=gcd
, contada como 13. A entrada é obtida do stdin.Uso da amostra
fonte
R, 94 bytes
Relativamente lento, mas ainda funciona. Replicar N vezes uma função que recebe 2 números aleatórios (de 1 a 1e6) e verifica se o seu MDC é menor que 2 (usando uma função antiga do meu MDC ).
fonte
1:x
funcionará.PowerShell v2 +,
118114 bytesRecebe entrada
$n
, inicia umfor
loop até ser$k
igual$n
(implícito$k=0
na primeira entrada no loop). A cada iteração, obtenha novosRandom
números$i
e$j
(o sinalizador-mi
mínimo1
garante que>=1
não existam e nenhum sinalizador máximo permite[int]::MaxValue
, o que é permitido pelo OP, pois é maior que10e6
).Em seguida, entramos em um loop GCD
while
. Então, enquanto o GCD estiver1
,$o
será incrementado. No final dofor
loop, fazemos uma simples[math]::Sqrt()
chamada , que é deixada no pipeline e a saída está implícita.Demora cerca de 15 minutos para executar a entrada
10000
no meu laptop Core i5 com ~ 1 ano de idade.Exemplos
fonte
Java 8,
164151 bytesExplicação
Equipamento de teste
Atualizar
fonte
n
,t+=1
pode se tornart++
, pode condensar suasint
declarações em uma linha, ou sejaint c=n,t=0,x,y;
, e!=0
(acho) pode se tornar>0
. Isso deve economizar 12 bytes no geral. Essa é uma maneira elegante de encontrar o MDC de x e y, no entanto.Perl 6 ,
5653 bytesExperimente online!
fonte
Frink,
8489Eu tive sorte: g = n = ... salva um byte sobre g = 0 n = ... ; e 1% gcd () dá (0,1) vs (1,0) para que eu possa subtrair. E azarado: n é pré-atribuído e um usado porque variáveis de laço e seus limites são locais e indefinido fora do loop.
Verbose
fonte
AWK , 109 bytes
Experimente online!
Estou surpreso que ele seja executado em um período de tempo razoável para 1000000.
fonte
Pyt ,
3735 bytesExplicação:
fonte
J, 27 bytes
Explicação:
Tive muita sorte com um
3.14157
forN = 10000000
, que levou2.44
segundos.fonte
Japonês , 23 bytes
Tente
fonte