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
david4dev
la source
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 )

JB
la source
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)
Dogbert
la source
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
fR0DDY
la source
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)
Joey
la source
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
JB
la source
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
JB
la source
2

GNU Octave - 36 caractères

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

Ruby, 39 caractères

p 1/(1..gets.to_i).inject{|a,b|1.0*b/a}
Ventero
la source
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

grignoteur
la source
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.

lirtosiast
la source
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}
Dogbert
la source
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
Eelvex
la source
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 .

jpjacobs
la source
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.

Joey
la source
1

MATLAB, 29

n=input('');binopdf(n/2,n,.5)
Memming
la source
0

PostScript, 77

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

Mathematica, 19

f=2^-# #!/(#/2)!^2&
Pointage
la source
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)))
SuperJedi224
la source
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
mbomb007
la source
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.

DDPWNAGE
la source