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

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 )


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)

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

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)

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

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

2

GNU Octave - 36 znaków

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


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


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.


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}

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

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 .


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



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 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)))

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.