Обчисліть ймовірність отримати вдвічі більше головок, ніж кидання монет.


10

Напишіть програму, яка, враховуючи невелике додатне парне ціле число від стандартного введення, обчислює ймовірність того, що перегортання багатьох монет призведе до половини стільки головок.

Наприклад, з огляду на 2 монети можливі результати:

HH HT TH TT

де Н і Т - голови і хвости. Є два результати ( HTі TH), що вдвічі менше головок, ніж кількість монет. Всього є 4 результати, тому ймовірність становить 2/4 = 0,5.

Це простіше, ніж це виглядає.

Тестові приклади:

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

1
Ми можемо вважати, що монети ідеальні, і є рівномірний шанс отримати голови або хвости?
Хуан

Чи потрібно надрукувати вихід у stdout?
Догберт

@Juan так. @Dogbert так.
david4dev

Чи можемо ми отримати ще кілька тестових випадків для перевірки наших рішень?
Догберт

@Dogbert - зроблено
david4dev

Відповіді:


3

J, 22 19 (вбивчий підхід)

Я прийшов до цього під час гольфу на мою відповідь Haskell.

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

(такий же I / O, як і моя інша відповідь J )


Це дає помилку для мене:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev Ой. Не працював і мій файл сценарію, який залишився. Я не пам'ятаю, де я заплутався, але версія, яку ви протестували, справді несправна. Зараз це виправлено.
JB

3

Пари / GP - 32 30 34 символів

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

Нічого собі, я не вважав мовою програмування, яка має вбудовану двочленну функцію.
david4dev

32 символів: print(binomial(n=input,n\2)/2^n).
Чарльз

3

Пітон 53 символів

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

3

Excel, 25

Не зовсім відповідно до специфікації, хоча :)

Назвіть назву комірки nта введіть таке в іншу клітинку:

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

2
Excel насправді реалізує ^ належним чином, так що ви можете вирізати кілька символів таким чином.
SuperJedi224

3

Хаскелл, 39 43 46

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

Демонстрація:

$ 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"
david4dev

@ david4dev 'L' у readLn- велика.
JB

Я думаю, main=do x<-readLn;print$foldr1(/)[1..x]чи робить те саме і економить 3 байти?
Лінн

Справді. Об’єднання, спасибі!
JB

2

J, 25 (природний підхід)

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

Використання зразка:

$ 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

Це все само собою, але для грубого розподілу обов'язків:

  • !~ -:можна вважати двочленним (x, x / 2)
  • % 2&^"розділено на 2 ^ х "
  • &. (". @ stdin) _ для вводу / виводу



2

Гольфскрипт - 30 символів

Обмеження - працює лише для входів менше 63

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

тестові справи

$ 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

Аналіз

'0.'GS не робить плаваючу крапку, тому ми підробимо це, записавши ціле число після цього.
\~Витягніть вхід у верхню частину стека та перетворіть у ціле число.
..Зробіть 2 копії вводу.
),1>Створіть список з 1..n
\2//Розділіть перерахуйте на 1..n / 2 та n / 2 + 1..n
{{*}*}%Помножте елементи двох поданих списків, що дають (n / 2)! і п! / (п / 2)!
~Витягніть ці два числа на стек.
\Поміняйте два числа навколо
/Ділити
5@?*Помножимо на 5 ** n. Це причина обмеження, наведеного вище


Мені цікаво, чому обмеження. Ви використовуєте хакер Gosper для створення всіх комбінацій? Ідея мені виникла (а специфікація нічого не говорить про час виконання).
Пітер Тейлор

Гольфскрипт не має змінного класу з плаваючою комою, тому те, що він робить, - це обчислити ціле число, яке пишеться після рядка, 0.- це десяткова частина відповіді, але цей метод залишає необхідні 0, коли шанс зростає менше 10%.
aaaaaaaaaaaa

@ Peter, що сказав електронний бізнес :)
gnibbler

2

TI-BASIC, 10

Це займе більше десяти байтів пам'яті калькулятора, оскільки є заголовок програми, але є лише десять байтів коду.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Це вимагає введення форми [number]:[program name]; додавання команди Input використовує ще три байти. ~- знак одинарного мінуса.



1

J, 20

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

приклади:

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

Питання вимагає введення STDIN, а не функції.
Догберт

@Dogbert: Я знаю; Я забув це згадати. Я мав намір оновити його ...
Eelvex

1

APL 21 15 символів

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

Бо там, де це не вірно

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

Де все в {} є специфічними символами APL, як тут .


Чи має бути останнім символом квадрат?
JB

Так, це повинен бути символ квадроцикла.
jpjacobs

Я отримую�[token]: � undefined
david4dev

Я думаю, це проблема кодування. У NARS2000 ви можете скопіювати його, як є.
jpjacobs



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 байт

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

Пітон 3, 99

Я вважаю, що це наївний підхід, і рішення fR0DDY набагато крутіше, але я принаймні я в змозі його вирішити.

Спробуйте тут

from itertools import*
n=int(input())
print(sum(n/2==i.count("H")for i in product(*["HT"]*n))/2**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:

152 148 байт лише для функції.

Методи класу, заголовки та інтерфейс користувача не входять до коду.

Вхід: int значення, що визначає кількість монет.

Вихід: floatзначення, що визначає ймовірність.

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

Безголівки:

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

Це ґрунтується на відповіді Microsoft Excel . У C і Objective-C завдання полягає в жорсткому кодуванні алгоритмів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.