Oblicz prawdopodobieństwo uzyskania o połowę mniejszej liczby głów niż liczba rzutów monetą.

10

Napisz program, który przy niewielkiej dodatniej parzystej liczbie całkowitej ze standardowego wejścia oblicza prawdopodobieństwo, że przerzucenie tylu monet spowoduje połowę liczby głów.

Na przykład, biorąc pod uwagę 2 monety, możliwe wyniki to:

HH HT TH TT

gdzie H i T są głowami i ogonami. Istnieją 2 wyniki ( HTi TH), które są o połowę mniejsze niż liczba monet. Istnieją w sumie 4 wyniki, więc prawdopodobieństwo wynosi 2/4 = 0,5.

To jest prostsze niż się wydaje.

Przypadki testowe:

2 -> 0.5
4 -> 0.375
6 -> 0.3125
8 -> 0.2734375
david4dev
źródło
1
Możemy założyć, że monety są idealne i istnieje nawet szansa na zdobycie głów lub reszek?
Juan
Czy musimy wydrukować wyjście na standardowe wyjście?
Dogbert
@Juan tak. @Dogbert tak.
david4dev
Czy możemy uzyskać więcej przypadków testowych, aby zweryfikować nasze rozwiązania?
Dogbert
@Dogbert - gotowe
david4dev

Odpowiedzi:

3

J, 22 19 (podejście zabójcy)

Dotarłem do tego, grając w golfa na moją odpowiedź Haskella.

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

(taki sam I / O jak moja inna odpowiedź J )

JB
źródło
Daje mi to błąd:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev
@ david4dev Ouch. Mój resztkowy plik skryptu też nie działał. Nie pamiętam, gdzie popełniłem błąd, ale przetestowana wersja jest naprawdę wadliwa. Teraz jest naprawione.
JB
3

Pari / GP - 32 30 34 znaków

print(binomial(n=input(),n\2)/2^n)
Dogbert
źródło
Wow, nie rozważałem języka programowania z wbudowaną funkcją dwumianową.
david4dev
32 znaków: print(binomial(n=input,n\2)/2^n).
Charles
3

Python 53 znaków

i=r=1.;exec"r*=(2*i-1)/i/2;i+=1;"*(input()/2);print r
fR0DDY
źródło
3

Excel, 25

Jednak niezupełnie według specyfikacji :)

Nazwij komórkę, na następnie wpisz następujące polecenie w innej komórce:

=COMBIN(n,n/2)/POWER(2,n)
Joey
źródło
2
Excel faktycznie implementuje ^ poprawnie, więc możesz w ten sposób wyciąć kilka znaków.
SuperJedi224
3

Haskell, 39 43 46

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

Demonstracja:

$ 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
źródło
Undefined variable "readln"
Pojawia
@ david4dev „L” readLnjest kapitałem.
JB
Myślę, że main=do x<-readLn;print$foldr1(/)[1..x]robi to samo i oszczędza 3 bajty?
Lynn
W rzeczy samej. Scalanie, dzięki!
JB
2

J, 25 (podejście naturalne)

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

Przykładowe użycie:

$ 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

Wszystko to jest oczywiste, ale z grubsza podzielonym obowiązkiem:

  • !~ -:może być uważany za dwumianowy (x, x / 2)
  • % 2&^to „podzielone przez 2 ^ x
  • &. (". @ stdin) _ dla I / O
JB
źródło
2

GNU Octave - 36 znaków

disp(binopdf((n=input(""))/2,n,.5));
Juan
źródło
2

Ruby, 39 znaków

p 1/(1..gets.to_i).inject{|a,b|1.0*b/a}
Ventero
źródło
2

Golfscript - 30 znaków

Ograniczenie - działa tylko dla danych wejściowych mniejszych niż 63

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

przypadki testowe

$ 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

Analiza

'0.'GS nie robi liczb zmiennoprzecinkowych, więc sfałszujemy to, pisząc liczbę całkowitą.
\~Następnie przeciągnij dane wejściowe na górę stosu i przekonwertuj na liczbę całkowitą.
..Zrób 2 kopie danych wejściowych.
),1>Utwórz listę z 1
\2//. wypisz na 1..n / 2 i n / 2 + 1..n
{{*}*}%Pomnóż elementy dwóch podlist podając (n / 2)! i n! / (n / 2)!
~Wyodrębnij te dwie liczby na stos
\Zamień dwie liczby wokół
/Podziel
5@?*Mnożenie przez 5 ** n. Jest to przyczyną powyższego ograniczenia

gnibbler
źródło
Jestem ciekawy, dlaczego to ograniczenie. Czy używasz hacka Gospera do wygenerowania wszystkich kombinacji? Pomysł przyszedł mi do głowy (a specyfikacja nie mówi nic o czasie wykonania).
Peter Taylor
Golfscript nie ma klasy zmiennej zmiennoprzecinkowej, więc robi to, aby obliczyć liczbę całkowitą, która zapisana po ciągu 0.jest dziesiętną częścią odpowiedzi, ale ta metoda pomija wymagane 0, gdy szansa rośnie mniej niż 10%.
aaaaaaaaaaaa
@Peter, co powiedział
eBiznes
2

TI-BASIC, 10

Zajmie to więcej niż dziesięć bajtów pamięci kalkulatora, ponieważ istnieje nagłówek programu, ale jest tylko dziesięć bajtów kodu.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

To wymaga danych wejściowych w postaci [number]:[program name]; dodanie polecenia Input wykorzystuje jeszcze trzy bajty. ~jest jednostkowym tokenem minus.

lirtosiast
źródło
1

Rubin - 50 57 54 znaków

p (1..(n=gets.to_i)/2).reduce(1.0){|r,i|r*(n+1-i)/i/4}
Dogbert
źródło
Oblicza to nCr, a nie prawdopodobieństwo.
david4dev
@ david4dev, naprawione.
Dogbert
1

J, 20

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

przykłady:

f 2
0.5
f 4
0.375
f 6
0.3125
f 8
0.273438
Eelvex
źródło
Pytanie wymaga podania danych STDIN, a nie funkcji.
Dogbert
@Dogbert: Wiem; Zapomniałem o tym wspomnieć. Zamierzałem go zaktualizować ...
Eelvex
1

APL 21 15 znaków

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

Bo tam, gdzie nie renderuje się dobrze

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

Gdzie wszystko w {} to symbole specyficzne dla APL, jak tutaj .

jpjacobs
źródło
Czy ostatnia postać ma być kwadratem?
JB
Tak, powinien to być symbol quada.
jpjacobs
Dostaję�[token]: � undefined
david4dev
To chyba problem z kodowaniem. W NARS2000 możesz skopiować i wkleić tak, jak jest.
jpjacobs,
1

Windows PowerShell, 45

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

Meh

Joey
źródło
1

MATLAB, 29

n=input('');binopdf(n/2,n,.5)
Memming
źródło
0

PostScript, 77

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

Mathematica, 19

f=2^-# #!/(#/2)!^2&
Zestawienie
źródło
0

JavaScript, 86 bajtów

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
źródło
0

Python 3, 99

To naiwne podejście, jak sądzę, a rozwiązanie fR0DDY jest znacznie fajniejsze, ale przynajmniej jestem w stanie je rozwiązać.

Wypróbuj tutaj

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
źródło
0

Cel C:

152 148 bajtów dla samej funkcji.

Metody klasy, nagłówki i interfejs użytkownika nie są zawarte w kodzie.

Dane wejściowe: intwartość określająca liczbę monet.

Wyjście: floatwartość określająca prawdopodobieństwo.

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

Nie golfowany:

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

Jest to oparte na odpowiedzi Microsoft Excel . W C i Objective-C wyzwanie polega na sztywnym kodowaniu algorytmów.

DDPWNAGE
źródło