Calcule la probabilidad de obtener la mitad de caras que arrojar monedas.


10

Escriba un programa que, dado un pequeño número entero positivo a partir de la entrada estándar, calcule la probabilidad de que lanzar tantas monedas resulte en la mitad de caras.

Por ejemplo, con 2 monedas, los posibles resultados son:

HH HT TH TT

donde H y T son caras y colas. Hay 2 resultados ( HTy TH) que son la mitad de caras que el número de monedas. Hay un total de 4 resultados, por lo que la probabilidad es 2/4 = 0.5.

Esto es más simple de lo que parece.

Casos de prueba:

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

1
¿Podemos suponer que las monedas son perfectas y hay incluso una posibilidad de obtener cara o cruz?
Juan

¿Necesitamos imprimir la salida en stdout?
Dogbert

@Juan sí. @Dogbert sí.
david4dev

¿Podríamos obtener más casos de prueba para verificar nuestras soluciones?
Dogbert

@Dogbert - hecho
david4dev

Respuestas:


3

J, 22 19 (enfoque asesino)

Llegué a esto mientras jugaba mi respuesta de Haskell.

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

(la misma E / S que mi otra respuesta J )


Esto me da un error:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev Ouch. Mi archivo de script sobrante tampoco funcionó. No recuerdo dónde me equivoqué, pero la versión que probaste es realmente defectuosa. Ahora está arreglado.
JB

3

Pari / GP - 32 30 34 caracteres

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

Wow, no consideré un lenguaje de programación que tuviera una función binomial incorporada.
david4dev

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

3

Python 53 Personajes

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

3

Excel, 25

Aunque no según las especificaciones :)

Nombre una celda ny luego escriba lo siguiente en otra celda:

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

2
Excel realmente implementa el ^ correctamente, por lo que puede recortar algunos caracteres de esa manera.
SuperJedi224

3

Haskell, 39 43 46

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

Demostración:

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

Me sale un error:Undefined variable "readln"
david4dev

@ david4dev la 'L' readLnes mayúscula.
JB

Creo que main=do x<-readLn;print$foldr1(/)[1..x]hace lo mismo y ahorra 3 bytes?
Lynn

En efecto. Fusionándose, gracias!
JB

2

J, 25 (enfoque natural)

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

Uso de la muestra:

$ 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

Todo se explica por sí mismo, pero para una división aproximada de responsabilidades:

  • !~ -:podría considerarse como binomial (x, x / 2)
  • % 2&^está "dividido por 2 ^ x "
  • &. (". @ stdin) _ para E / S

2

GNU Octave - 36 caracteres

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

2

Ruby, 39 caracteres

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

2

Golfscript - 30 caracteres

Limitación: solo funciona para entradas de menos de 63

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

Casos de prueba

$ 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álisis

'0.'GS no hace coma flotante, así que lo falsificaremos escribiendo un número entero después de esto
\~Tire de la entrada a la parte superior de la pila y convierta a un número entero
..Haga 2 copias de la entrada
),1>Cree una lista de 1..n
\2//Divida el lista en 1..n / 2 yn / 2 + 1..n ¡
{{*}*}%Multiplica los elementos de las dos sublistas dando (n / 2)! y n! / (n / 2)!
~Extrae esos dos números en la pila
\Cambia los dos números alrededor
/Divide
5@?*Multiplica por 5 ** n. Esta es la causa de la limitación dada anteriormente


Tengo curiosidad por saber por qué la limitación. ¿Estás usando el truco de Gosper para generar todas las combinaciones? Se me ocurrió la idea (y la especificación no dice nada sobre el tiempo de ejecución).
Peter Taylor

Golfscript no tiene una clase variable de punto flotante, por lo que lo que hace es calcular un número entero que se escribe después de la cadena 0.es la parte decimal de la respuesta, pero ese método omite el 0 requerido cuando la probabilidad crece menos del 10%.
aaaaaaaaaaaa

@ Peter, lo que dijo eBusiness :)
gnibbler

2

TI-BASIC, 10

Esto tomará más de diez bytes de memoria de la calculadora porque hay un encabezado de programa, pero solo hay diez bytes de código.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Esto toma entrada en el formulario [number]:[program name]; Agregar un comando de entrada utiliza tres bytes más. ~es el toario menos unario.


1

Ruby - 50 57 54 caracteres

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

Esto calcula nCr no la probabilidad.
david4dev

@ david4dev, corregido.
Dogbert

1

J, 20

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

ejemplos:

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

La pregunta pide información de STDIN, no una función.
Dogbert

@Dogbert: lo sé; Olvidé mencionar esto. Tenía la intención de actualizarlo ...
Eelvex

1

APL 21 15 caracteres

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

Porque donde no se hace bien

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

Donde todo en {} son símbolos específicos de APL como aquí .


¿Se supone que el último personaje es un cuadrado?
JB

Sí, debería ser el símbolo cuádruple.
jpjacobs

Obtengo�[token]: � undefined
david4dev 01 de

Supongo que este es un problema de codificación. En NARS2000 puedes copiar y pegarlo tal cual.
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 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)))

0

Pitón 3, 99

Este es un enfoque ingenuo, supongo, y la solución de fR0DDY es mucho más genial, pero al menos soy capaz de resolverlo.

Pruébalo aquí

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

Pitón 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

C objetivo:

152 148 bytes solo para la función.

Los métodos de clase, los encabezados y la interfaz de usuario no están incluidos en el código.

Entrada: un intvalor que determina el número de monedas.

Salida: un floatvalor que determina la probabilidad.

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

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

Esto se basa en la respuesta de Microsoft Excel . En C y Objective-C, el desafío está en codificar los algoritmos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.