Objectif
Créez un programme / une fonction qui prend une entrée N
, vérifiez si N
les paires aléatoires d’entiers sont relativement premiers et retourne sqrt(6 * N / #coprime)
.
TL; DR
Ces défis sont des simulations d’algorithmes qui ne nécessitent que la nature et votre cerveau (et peut-être quelques ressources réutilisables) pour approcher Pi. Si vous avez vraiment besoin de Pi lors de l'apocalypse des zombies, ces méthodes ne gaspillent pas les munitions ! Huit autres défis sont à venir. Consultez le message du bac à sable pour faire des recommandations.
Simulation
Que simulons-nous? Eh bien, la probabilité que deux entiers aléatoires soient relativement premiers (c.-à-d. Coprime ou gcd == 1) est 6/Pi/Pi
, donc un moyen naturel de calculer Pi serait d'extraire deux seaux (ou poignées) de roches; compte les; voir si leur gcd est 1; répéter. Après avoir fait cela plusieurs fois, vous sqrt(6.0 * total / num_coprimes)
aurez tendance à Pi
. Si calculer la racine carrée dans un monde post-apocalyptique vous rend nerveux, ne vous inquiétez pas! Il y a la méthode de Newton pour cela.
Comment simulons-nous cela?
- Prendre une entrée
N
- Faites les
N
temps suivants :- Générer uniformément des entiers positifs aléatoires,
i
etj
- Avec
1 <= i , j <= 10^6
- Si
gcd(i , j) == 1
:result = 1
- Autre:
result = 0
- Générer uniformément des entiers positifs aléatoires,
- Prenez la somme des
N
résultats,S
- Revenir
sqrt(6 * N / S)
spécification
- Contribution
- Flexible, prenez les entrées de n'importe quelle manière standard (par exemple, paramètre de fonction, STDIN) et dans n'importe quel format standard (par exemple, chaîne, binaire)
- Sortie
- Flexible, donnez la sortie de n'importe quelle manière standard (retour, impression, etc.)
- Les espaces blancs, les espaces de fuite et les espaces de début sont acceptables
- Précision, veuillez fournir au moins 4 décimales de précision (c.-à-d.
3.1416
)
- Notation
- Le code le plus court gagne!
Cas de test
Votre sortie peut ne pas s'aligner sur celles-ci, à cause du hasard. Mais en moyenne, vous devriez obtenir autant de précision pour la valeur donnée de N
.
Input -> Output
----- ------
100 -> 3.????
10000 -> 3.1???
1000000 -> 3.14??
la source
N = 1000000
ou est-il acceptable si le programme renvoie par exemple un débordement de pile s'ilN
est trop volumineux?N=10^6
.Réponses:
APL, 23 octets
Explication:
?⍵2⍴1e6
: générer une matrice 2-sur-⍵ de nombres aléatoires dans l'intervalle [1..10 6 ]1+.=∨/
: obtenez le GCD de chaque paire et voyez combien sont égaux à 1. Ceci calcule S..5*⍨6×⍵÷
: (6 × ÷ S) 0,5la source
Jelly ,
20 1816 octets-2 octets grâce à @ Pietu1998 (chain & use count 1s,
ċ1
au lieu de moins de deux cumed<2S
)-2 octets grâce à @Dennis (répétez 1e6 fois avant l'échantillonnage pour éviter l'enchaînement)
(Extrêmement lent en raison de la fonction aléatoire)
Comment?
TryItOnline
la source
ḤRµȷ6Xµ€g2/ċ1÷³6÷½
enregistre 2 octets. (ȷ6
est 10 ^ 6 dans un seul nilad,ċ1
compte les uns)ȷ²
c'est un tout petit peu plus rapide queȷ6
)ȷ²
être deux liens ne fait pas mal ici, mais nécessite un lien supplémentaire ou¤
pour certains cas d'utilisationḤȷ6xX€
devrait fonctionner pour l'échantillonnage aléatoire.Python 2,
143140132124122124122 octetsCela fait longtemps que je n’ai pas essayé le golf, j’ai peut-être manqué quelque chose ici! Sera mise à jour que je raccourcis cela.
Testez moi ici!
merci à Jonathan Allan pour la sauvegarde de deux octets :)
la source
1 <= i , j <= 10^6
vous devez donc utiliserrandrange(1,1e6+1)
.k=lambda:r.randrange(1e6)+1
économise deux octetsMathematica,
494851 octetsSauvegardé d'un octet et correction d'un bug grâce à @ LegionMammal978 .
la source
(6#/Count[GCD@@1*^6~RandomInteger~{2,#},1])^.5&
1*^6
devrait être remplacé par{1,1*^6}
pour s'assurer que je , j 0.R,
1039995999894 octetsPeut probablement être joué au golf un peu. Réduisez 4 octets à cause de @ antoine-sac et 4 autres octets en définissant un alias pour
sample
, à la^.5
place desqrt
et à la1e6
place de10^6
. Ajout de 4 octets pour s'assurer que l'échantillonnage dei
etj
est vraiment uniforme. Suppression d’un octet après avoir réalisé que6*N/sum(x)
c’était la même chose que6/mean(x)
. Utilisépryr::f
au lieu defunction(x,y)
sauvegarder 4 octets.Exemple de sortie:
la source
sample(10^6,N)
. Non seulement c'est plus court, mais c'est aussi beaucoup plus efficace.sample(10,10)
est garanti de renvoyer tous les nombres en 1:10, alors quesample(10,10,T)
produira une sélection aléatoire où les nombres peuvent être répétés.En fait, 19 octets
Essayez-le en ligne!
Explication:
la source
MATL , 22 octets
Essayez-le en ligne!
la source
Pyth, 21 octets
Essayez-le en ligne.
Explication
la source
Scala,
149126 octetsExplication:
la source
6f
,Seq.fill
etmath.random
.Raquette 92 octets
Ungolfed:
Essai:
Sortie:
la source
JavaScript (ES7),
1079594 octetsLa version ES6 est exactement de 99 octets, mais l'opérateur d'exponentiation ES7
**
enregistre 5 octetsMath.sqrt
.Ungolfed
la source
gcd
appelle la fonctiong
r=_=>
est ce code ou un dessin?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 plus courtn=>(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 octetsCourez comme ça:
Explication
Fait ce qu'il dit sur l'étain. Requiert PHP_GMP pour
gcd
.Tweaks
$argn
la source
Perl, 64 octets
Nécessite l'option de ligne de commande
-pMntheory=gcd
, comptabilisée comme 13. L'entrée est prise à partir de stdin.Exemple d'utilisation
la source
R, 94 octets
Relativement lent mais fonctionne toujours. Répliquer N fois une fonction qui prend 2 nombres aléatoires (de 1 à 1e6) et vérifie si leur gcd est inférieur à 2 (en utilisant une ancienne fonction de gcd ).
la source
1:x
cela fonctionnera.PowerShell v2 +,
118114 octetsPrend entrée
$n
, commence unefor
boucle jusqu'à être$k
égal à$n
(implicite$k=0
lors de la première entrée dans la boucle). À chaque itération, obtenez de nouveauxRandom
numéros$i
et$j
(l' indicateur-mi
nimum1
garantit que nous sommes>=1
et qu'aucun indicateur maximal ne permet jusqu'à[int]::MaxValue
, ce qui est autorisé par l'OP puisqu'il est supérieur à10e6
).Nous passons ensuite dans une boucle GCD
while
. Alors, tant que le GCD est1
,$o
est incrémenté. À la fin defor
boucle, nous effectuons un[math]::Sqrt()
appel simple , qui reste sur le pipeline et la sortie est implicite.Prend environ 15 minutes pour fonctionner avec l'entrée
10000
sur mon ordinateur portable Core i5 âgé d'environ 1 an.Exemples
la source
Java 8,
164151 octetsExplication
Harnais de test
Mise à jour
la source
n
, voust+=1
pouvez devenirt++
, vous pouvez condenser vosint
déclarations sur une seule ligne, c’estint c=n,t=0,x,y;
-à- dire , et!=0
(je pense) pouvoir le devenir>0
. Cela devrait économiser 12 octets au total. C’est pourtant une excellente façon de trouver le DPC de x et y.Perl 6 ,
5653 octetsEssayez-le en ligne!
la source
Frink,
8489J'ai eu de la chance: g = n = ... enregistre un octet sur g = 0 n = ... ; et 1% gcd () donne (0,1) vs (1,0) pour que je puisse soustraire. Et malchanceux: n est prédéfini et un utilisé parce que les variables de boucle et leurs limites sont en dehors de la boucle locale et non défini.
Verbeux
la source
AWK , 109 octets
Essayez-le en ligne!
Je suis surpris que cela fonctionne dans un laps de temps raisonnable pour 1000000.
la source
Pyt ,
3735 octetsExplication:
la source
J, 27 octets
Explication:
J'ai eu beaucoup de chance avec
3.14157
pourN = 10000000
, ce qui a pris2.44
quelques secondes.la source
Japt , 23 octets
L'essayer
la source