Berechnen Sie die Wahrscheinlichkeit, halb so viele Köpfe wie Münzwürfe zu bekommen.


10

Schreiben Sie ein Programm, das bei einer kleinen positiven geraden Ganzzahl aus der Standardeingabe die Wahrscheinlichkeit berechnet, dass das Umwerfen so vieler Münzen zu halb so vielen Köpfen führt.

Zum Beispiel sind bei 2 Münzen die möglichen Ergebnisse:

HH HT TH TT

wobei H und T Kopf und Zahl sind. Es gibt 2 Ergebnisse ( HTund TH), die halb so viele Köpfe haben wie die Anzahl der Münzen. Es gibt insgesamt 4 Ergebnisse, daher beträgt die Wahrscheinlichkeit 2/4 = 0,5.

Das ist einfacher als es aussieht.

Testfälle:

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

1
Wir können davon ausgehen, dass die Münzen perfekt sind und es sogar eine Chance gibt, Kopf oder Zahl zu bekommen?
Juan

Müssen wir die Ausgabe auf stdout drucken?
Dogbert

@ Juan ja. @ Dogbert ja.
David4dev

Könnten wir weitere Testfälle erhalten, um unsere Lösungen zu überprüfen?
Dogbert

@ Dogbert - fertig
david4dev

Antworten:


3

J, 22 19 (Killer-Ansatz)

Ich bin darauf gekommen, als ich meine Haskell-Antwort gespielt habe.

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

(gleiche E / A wie meine andere J-Antwort )


Dies gibt einen Fehler für mich:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev Autsch. Meine übrig gebliebene Skriptdatei funktionierte auch nicht. Ich erinnere mich nicht, wo ich es vermasselt habe, aber die von Ihnen getestete Version ist in der Tat fehlerhaft. Es ist jetzt behoben.
JB

3

Pari / GP - 32 30 34 Zeichen

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

Wow, ich habe keine Programmiersprache mit eingebauter Binomialfunktion in Betracht gezogen.
David4dev

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

3

Python 53 Zeichen

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

3

Excel, 25

Nicht ganz nach Spezifikation :)

Benennen Sie eine Zelle nund geben Sie Folgendes in eine andere Zelle ein:

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

2
Excel implementiert das ^ tatsächlich richtig, sodass Sie auf diese Weise einige Zeichen ausschneiden können.
SuperJedi224

3

Haskell, 39 43 46

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

Demonstration:

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

Ich erhalte eine Fehlermeldung:Undefined variable "readln"
david4dev

@ david4dev das 'L' in readLnist ein großes .
JB

Ich denke main=do x<-readLn;print$foldr1(/)[1..x]macht das gleiche und spart 3 Bytes?
Lynn

Tatsächlich. Zusammenführen, danke!
JB

2

J, 25 (natürlicher Ansatz)

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

Beispielverwendung:

$ 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

Es ist alles selbsterklärend, aber für eine grobe Aufteilung der Verantwortlichkeiten:

  • !~ -:könnte als Binomial angesehen werden (x, x / 2)
  • % 2&^ist "geteilt durch 2 ^ x "
  • &. (". @ stdin) _ für I / O.

2

GNU Octave - 36 Zeichen

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

2

Ruby, 39 Zeichen

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

2

Golfscript - 30 Zeichen

Einschränkung - funktioniert nur für Eingänge unter 63

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

Testfälle

$ 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

Analyse

'0.'GS macht kein Gleitkomma, also fälschen wir es, indem wir danach eine Ganzzahl schreiben.
\~Ziehen Sie die Eingabe an den Anfang des Stapels und konvertieren Sie sie in eine Ganzzahl. Erstellen
..Sie 2 Kopien der Eingabe.
),1>Erstellen Sie eine Liste aus 1..n Teilen Sie
\2//die Liste in 1..n / 2 und n / 2 + 1..n
{{*}*}%Multipliziere die Elemente der beiden Unterlisten mit (n / 2)! und n! / (n / 2)!
~Extrahieren Sie diese beiden Zahlen auf den Stapel.
\Tauschen Sie die beiden Zahlen um
/Divide
5@?*Multiplizieren Sie mit 5 ** n. Dies ist die Ursache für die oben angegebene Einschränkung


Ich bin gespannt, warum die Einschränkung. Verwenden Sie Gospers Hack, um alle Kombinationen zu generieren? Die Idee kam mir (und die Spezifikation sagt nichts über die Ausführungszeit aus).
Peter Taylor

Golfscript hat keine Gleitkommavariablenklasse. Er berechnet also eine Ganzzahl, die nach der Zeichenfolge 0.als Dezimalteil der Antwort geschrieben wird. Bei dieser Methode wird jedoch die erforderliche 0 weggelassen, wenn die Chance um weniger als 10% steigt .
aaaaaaaaaaa

@ Peter, was eBusiness gesagt hat :)
Gnibbler

2

TI-BASIC, 10

Dies benötigt mehr als zehn Bytes Rechnerspeicher, da ein Programmheader vorhanden ist, aber nur zehn Bytes Code vorhanden sind.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Dies erfolgt in der Form [number]:[program name]; Das Hinzufügen eines Eingabebefehls verwendet drei weitere Bytes. ~ist das unäre Minuszeichen.


1

Ruby - 50 57 54 Zeichen

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

Dies berechnet nCr nicht die Wahrscheinlichkeit.
David4dev

@ david4dev, behoben.
Dogbert

1

J, 20

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

Beispiele:

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

Die Frage fragt nach Eingaben von STDIN, nicht nach einer Funktion.
Dogbert

@ Dogbert: Ich weiß; Ich habe vergessen, das zu erwähnen. Ich wollte es aktualisieren ...
Eelvex

1

APL 21 15 Zeichen

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

Denn wo es nicht richtig rendert

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

Wo alles in {} APL-spezifische Symbole wie hier sind .


Soll das letzte Zeichen ein Quadrat sein?
JB

Ja, es sollte das Quad-Symbol sein.
jpjacobs

Ich bekomme�[token]: � undefined
david4dev

Ich denke, das ist ein Codierungsproblem. In NARS2000 können Sie es kopieren und so wie es ist einfügen.
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

Python 3, 99

Ich nehme an, dies ist ein naiver Ansatz, und die Lösung von fR0DDY ist viel cooler, aber zumindest kann ich sie lösen.

Probieren Sie es hier aus

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

Ziel c:

152 148 Bytes nur für die Funktion.

Klassenmethoden, Header und Benutzeroberfläche sind nicht im Code enthalten.

Eingabe: Ein intWert, der die Anzahl der Münzen bestimmt.

Ausgabe: Ein floatWert, der die Wahrscheinlichkeit bestimmt.

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

Dies basiert auf der Microsoft Excel-Antwort . In C und Objective-C besteht die Herausforderung darin, die Algorithmen hart zu codieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.