Calculez la probabilité d'obtenir deux fois moins de têtes que de lancers de pièces.


10

Écrivez un programme qui, étant donné un petit entier pair positif à partir de l'entrée standard, calcule la probabilité que retourner autant de pièces se traduira par deux fois plus de têtes.

Par exemple, pour 2 pièces, les résultats possibles sont:

HH HT TH TT

où H et T sont têtes et queues. Il y a 2 résultats ( HTet TH) deux fois moins de têtes que le nombre de pièces. Il y a un total de 4 résultats, donc la probabilité est de 2/4 = 0,5.

C'est plus simple qu'il n'y paraît.

Cas de test:

2 -> 0.5
4 -> 0.375
6 -> 0.3125
8 -> 0.2734375

1
Nous pouvons supposer que les pièces sont parfaites et qu'il y a une chance égale d'avoir des têtes ou des queues?
Juan

Avons-nous besoin d'imprimer la sortie sur stdout?
Dogbert

@Juan oui. @Dogbert oui.
david4dev

Pourrions-nous obtenir d'autres cas de test pour vérifier nos solutions?
Dogbert

@Dogbert - fait
david4dev

Réponses:


3

J, 22 19 (approche du tueur)

J'y suis allé en jouant à ma réponse Haskell.

%/@:>:@i.&.(".@stdin)_

(même E / S que mon autre réponse J )


Cela donne une erreur pour moi:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev Ouch. Mon fichier de script restant n'a pas fonctionné non plus. Je ne me souviens pas où j'ai gâché, mais la version que vous avez testée est en effet défectueuse. C'est maintenant corrigé.
JB

3

Pari / GP - 32 30 34 caractères

print(binomial(n=input(),n\2)/2^n)

Wow, je n'ai pas considéré un langage de programmation ayant une fonction binomiale intégrée.
david4dev

32 caractères: print(binomial(n=input,n\2)/2^n).
Charles

3

Python 53 caractères

i=r=1.;exec"r*=(2*i-1)/i/2;i+=1;"*(input()/2);print r

3

Excel, 25

Pas tout à fait selon les spécifications, cependant :)

Nommez une cellule n, puis tapez ce qui suit dans une autre cellule:

=COMBIN(n,n/2)/POWER(2,n)

2
Excel implémente réellement le ^ correctement, vous pouvez donc découper quelques caractères de cette façon.
SuperJedi224

3

Haskell, 39 43 46

main=do x<-readLn;print$foldr1(/)[1..x]

Manifestation:

$ runhaskell coins.hs <<<2
0.5
$ runhaskell coins.hs <<<4
0.375
$ runhaskell coins.hs <<<6
0.3125
$ runhaskell coins.hs <<<8
0.2734375

Je reçois une erreur:Undefined variable "readln"
david4dev

@ david4dev le 'L' en readLnest un majuscule.
JB

Je pense que main=do x<-readLn;print$foldr1(/)[1..x]fait la même chose et enregistre 3 octets?
Lynn

En effet. Fusion, merci!
JB

2

J, 25 (approche naturelle)

((!~-:)%2&^)&.(".@stdin)_

Exemple d'utilisation:

$ echo -n 2 | jconsole coins.ijs 
0.5
$ echo -n 4 | jconsole coins.ijs
0.375
$ echo -n 6 | jconsole coins.ijs
0.3125
$ echo -n 8 | jconsole coins.ijs 
0.273438

Tout va de soi, mais pour une répartition approximative des responsabilités:

  • !~ -:pourrait être considéré comme binomial (x, x / 2)
  • % 2&^est "divisé par 2 ^ x "
  • &. (". @ stdin) _ pour les E / S

2

GNU Octave - 36 caractères

disp(binopdf((n=input(""))/2,n,.5));

2

Ruby, 39 caractères

p 1/(1..gets.to_i).inject{|a,b|1.0*b/a}

2

Golfscript - 30 caractères

Limitation - ne fonctionne que pour les entrées inférieures à 63

'0.'\~..),1>\2//{{*}*}%~\/5@?*

cas de test

$ echo 2 | ruby golfscript.rb binom.gs 
0.50
$ echo 4 | ruby golfscript.rb binom.gs 
0.3750
$ echo 6 | ruby golfscript.rb binom.gs 
0.312500
$ echo 8 | ruby golfscript.rb binom.gs 
0.27343750

Une analyse

'0.'GS ne fait pas de virgule flottante, nous allons donc le simuler en écrivant un entier après cela
\~Tirez l'entrée vers le haut de la pile et convertissez-la en un entier
..Faites 2 copies de l'entrée
),1>Créez une liste de 1..n
\2//Fractionnez le liste en 1..n / 2 et n / 2 + 1..n
{{*}*}%Multipliez les éléments des deux sous-listes donnant (n / 2)! et n! / (n / 2)!
~Extraire ces deux nombres sur la pile
\Échangez les deux nombres autour de
/Diviser
5@?*Multiplier par 5 ** n. C'est la cause de la limitation donnée ci-dessus


Je suis curieux de savoir pourquoi la limitation. Utilisez-vous le hack de Gosper pour générer toutes les combinaisons? L'idée m'est venue à l'esprit (et la spécification ne dit rien sur le temps d'exécution).
Peter Taylor

Golfscript n'a pas de classe de variable à virgule flottante, donc ce qu'il fait est de calculer un entier qui écrit après la chaîne 0.est la partie décimale de la réponse, mais cette méthode laisse de côté le 0 requis lorsque la chance augmente moins de 10%.
aaaaaaaaaaaa

@Peter, ce que eBusiness a dit :)
gnibbler

2

TI-BASIC, 10

Cela prendra plus de dix octets de mémoire de la calculatrice car il y a un en-tête de programme, mais il n'y a que dix octets de code.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Cela prend une entrée dans le formulaire [number]:[program name]; l'ajout d'une commande d'entrée utilise trois octets supplémentaires. ~est le jeton unaire moins.


1

Rubis - 50 57 54 caractères

p (1..(n=gets.to_i)/2).reduce(1.0){|r,i|r*(n+1-i)/i/4}

Cela calcule nCr et non la probabilité.
david4dev

@ david4dev, corrigé.
Dogbert

1

J, 20

f=:(]!~[:<.2%~])%2^]

exemples:

f 2
0.5
f 4
0.375
f 6
0.3125
f 8
0.273438

La question demande l'entrée de STDIN, pas une fonction.
Dogbert

@Dogbert: Je sais; J'ai oublié de mentionner ceci. J'avais l'intention de le mettre à jour ...
Eelvex

1

APL 21 15 caractères

((N÷2)!N)÷2*N←⎕

Pour où ça ne rend pas bien

((N{ColonBar}2)!N){ColonBar}2*N{LeftArrow}{Quad}

Où tout dans {} sont des symboles spécifiques APL comme ici .


Le dernier caractère est-il censé être un carré?
JB

Oui, ce devrait être le symbole du quad.
jpjacobs

Je reçois�[token]: � undefined
david4dev

Je suppose que c'est un problème de codage. Dans NARS2000, vous pouvez copier-coller tel quel.
jpjacobs

1

Windows PowerShell, 45

($p=1)..($n="$input"/2)|%{$p*=(1+$n/$_)/4}
$p

Meh.



0

PostScript, 77

([)(%stdin)(r)file token{2 idiv}if def
1
1 1[{[exch div 1 add 4 div mul}for
=


0

Javascript, 86 octets

a=prompt(f=function(n){return n?n*f(n-1):1});alert(f(a)/(f(a/2)*f(a/2)*Math.pow(2,a)))

0

Python 3, 99

C'est une approche naïve, je suppose, et la solution de fR0DDY est beaucoup plus cool, mais au moins je suis capable de la résoudre.

Essayez-le ici

from itertools import*
n=int(input())
print(sum(n/2==i.count("H")for i in product(*["HT"]*n))/2**n)

Python 2, 103

from itertools import*
n=int(raw_input())
print sum(n/2==i.count("H")for i in product(*["HT"]*n))/2.**n

0

Objectif c:

152 148 octets uniquement pour la fonction.

Les méthodes de classe, les en-têtes et l'interface utilisateur ne sont pas inclus dans le code.

Entrée: une intvaleur déterminant le nombre de pièces.

Sortie: une floatvaleur déterminant la probabilité.

-(float)calcPWithCoins:(int)x {int i=0;int j=0;for (int c=x;c<1;c+-){i=i*c;} for(int d=x/2;d<1;d+-){j=j*d;} return (((float)i/(float)j)/powf(2,x));}

Non golfé:

-(float)calcPWithCoints:(int)x
{
    int i = 0;
    int j = 0;
    for (int c = x; c < 1; c+-) {
         i = i * c;
    }
    // Calculate the value of x! (Factorial of x)

    for (int d = x / 2; d < 1; d+-)
         j = j * d;
    }
    // Calculate (x/2)! (Factorial of x divided by 2)

    return (((float)i / (float)j) / powf(2, x));
    /* Divides i! by (i/2)!, then divides that result (known as the nCr) by 2^x.
    This is all floating-point and precise. If I didn't have casts in there,
    It would be Integer division and, therefore, wouldn't have any decimal
    precision. */
}

Ceci est basé sur la réponse Microsoft Excel . En C et Objective-C, le défi consiste à coder en dur les algorithmes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.