Calcule a probabilidade de obter metade do número de cabeças que os lançamentos de moedas.

10

Escreva um programa que, dado um pequeno número positivo positivo da entrada padrão, calcule a probabilidade de que o lançamento de muitas moedas resulte na metade do número de cabeças.

Por exemplo, dadas 2 moedas, os possíveis resultados são:

HH HT TH TT

onde H e T são cara e coroa. Existem 2 resultados ( HTe TH) com metade da quantidade de cabeças que o número de moedas. Há um total de 4 resultados, então a probabilidade é 2/4 = 0,5.

Isso é mais simples do que parece.

Casos de teste:

2 -> 0.5
4 -> 0.375
6 -> 0.3125
8 -> 0.2734375
david4dev
fonte
11
Podemos assumir que as moedas são perfeitas e há uma chance uniforme de conseguir cara ou coroa?
Juan Juan
Precisamos imprimir a saída para stdout?
Dogbert 27/02
@ Juan sim. @Dogbert yes.
David4dev 27/02
Poderíamos obter mais casos de teste para verificar nossas soluções?
Dogbert
@Dogbert - done
david4dev 27/02

Respostas:

3

J, 22 19 (abordagem matadora)

Aprendi isso enquanto jogava minha resposta Haskell.

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

(mesma E / S da minha outra resposta J )

JB
fonte
Isso dá um erro para mim:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev
@ david4dev Ouch. Meu arquivo de script restante também não funcionou. Não me lembro onde errei, mas a versão que você testou está com defeito. Agora está consertado.
JB
3

Pari / GP - 32 30 34 caracteres

print(binomial(n=input(),n\2)/2^n)
Dogbert
fonte
Uau, não considerei uma linguagem de programação com uma função binomial integrada.
david4dev 27/02
32: caracteres print(binomial(n=input,n\2)/2^n).
Charles
3

Python 53 caracteres

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

Excel, 25

Não exatamente de acordo com as especificações, no entanto :)

Nomeie uma célula ne digite o seguinte em outra célula:

=COMBIN(n,n/2)/POWER(2,n)
Joey
fonte
2
O Excel realmente implementa o ^ corretamente, para que você possa cortar alguns caracteres dessa maneira.
precisa saber é o seguinte
3

Haskell, 39 43 46

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

Demonstração:

$ 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
fonte
Recebo um erro:Undefined variable "readln"
david4dev 28/02
@ david4dev o 'L' in readLné maiúsculo.
JB
Eu acho que main=do x<-readLn;print$foldr1(/)[1..x]faz a mesma coisa e economiza 3 bytes?
Lynn
De fato. Mesclando, obrigado!
JB
2

J, 25 (abordagem natural)

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

Uso da amostra:

$ 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

É tudo auto-explicativo, mas para uma divisão aproximada de responsabilidades:

  • !~ -:pode ser considerado binomial (x, x / 2)
  • % 2&^é "dividido por 2 ^ x "
  • &. (". @ stdin) _ para E / S
JB
fonte
2

Oitava GNU - 36 caracteres

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

Ruby, 39 caracteres

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

Golfscript - 30 caracteres

Limitação - funciona apenas para entradas menores que 63

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

casos de teste

$ 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

Análise

'0.'O GS não faz ponto flutuante; portanto, fingimos escrevendo um número inteiro depois disso.
\~Puxe a entrada para o topo da pilha e converta-a em um número inteiro.
..Faça 2 cópias da entrada.
),1>Crie uma lista de 1..n
\2//Divida o liste em 1..n / 2 e n / 2 + 1..n
{{*}*}%Multiplique os elementos das duas sublistas dando (n / 2)! e n! / (n / 2)!
~Extraia esses dois números na pilha
\Troque os dois números em
/Divide
5@?*Multiply por 5 ** n. Esta é a causa da limitação dada acima

mordedor
fonte
Estou curioso para saber por que a limitação. Você está usando o hack de Gosper para gerar todas as combinações? A ideia me ocorreu (e as especificações não dizem nada sobre o tempo de execução).
Peter Taylor
Golfscript não tem uma classe de variável de ponto flutuante, então o que ele faz é calcular um número inteiro que é escrito após a sequência de caracteres 0.é a parte decimal da resposta, mas esse método deixa de fora o 0 necessário quando a chance aumenta menos de 10%.
Aaaaaaaaaaaa
@ Pedro, o eBusiness disse :)
gnibbler
2

TI-BASIC, 10

Isso levará mais de dez bytes de memória da calculadora porque existe um cabeçalho de programa, mas existem apenas dez bytes de código.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Isso requer entrada no formulário [number]:[program name]; adicionar um comando de entrada usa mais três bytes. ~é o símbolo menos unário.

lirtosiast
fonte
1

Ruby - 50 57 54 caracteres

p (1..(n=gets.to_i)/2).reduce(1.0){|r,i|r*(n+1-i)/i/4}
Dogbert
fonte
Isso calcula nCr, não a probabilidade.
David4dev 27/02
@ david4dev, corrigido.
Dogbert
1

J, 20

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

exemplos:

f 2
0.5
f 4
0.375
f 6
0.3125
f 8
0.273438
Eelvex
fonte
A pergunta pede entrada do STDIN, não uma função.
Dogbert
@Dogbert: eu sei; Eu esqueci de mencionar isso. Eu pretendia atualizá-lo ...
Eelvex 28/02
1

APL 21 15 caracteres

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

Para onde ele não dá certo

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

Onde tudo em {} são símbolos específicos da APL, como aqui .

jpjacobs
fonte
O último caractere deveria ser um quadrado?
JB
Sim, deve ser o símbolo quad.
Jpjacobs
Eu recebo�[token]: � undefined
david4dev
Eu acho que isso é um problema de codificação. No NARS2000, você pode copiar e colar como está.
Jspjacobs # 03
1

Windows PowerShell, 45

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

Meh.

Joey
fonte
1

MATLAB, 29

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

PostScript, 77

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

Mathematica, 19

f=2^-# #!/(#/2)!^2&
Tally
fonte
0

Javascript, 86 bytes

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
fonte
0

Python 3, 99

Essa é uma abordagem ingênua, suponho, e a solução da fR0DDY é muito mais interessante, mas pelo menos eu sou capaz de resolvê-la.

Experimente aqui

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
fonte
0

Objetivo-C:

152 148 bytes apenas para a função.

Métodos de classe, cabeçalhos e interface do usuário não estão incluídos no código.

Entrada: um intvalor que determina o número de moedas.

Saída: um floatvalor que determina a probabilidade.

-(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));}

Ungolfed:

-(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. */
}

Isso se baseia na resposta do Microsoft Excel . Em C e Objective-C, o desafio está em codificar os algoritmos.

DDPWNAGE
fonte