Рассчитайте вероятность получения вдвое меньше голов, чем бросков монет.

10

Напишите программу, которая, учитывая маленькое положительное четное целое число из стандартного ввода, вычисляет вероятность того, что подбрасывание такого количества монет приведет к получению вдвое меньше голов.

Например, при 2 монетах возможны следующие результаты:

HH HT TH TT

где H и T - головы и хвосты. Есть 2 результата ( HTи TH), которые вдвое меньше голов, чем количество монет. Всего 4 результата, поэтому вероятность составляет 2/4 = 0,5.

Это проще, чем кажется.

Тестовые случаи:

2 -> 0.5
4 -> 0.375
6 -> 0.3125
8 -> 0.2734375
david4dev
источник
1
Мы можем предположить, что монеты идеальны, и есть ли шанс получить головы или хвосты?
Хуан
Нужно ли выводить вывод на стандартный вывод?
Догберт
@Juan да. @ Догберт, да.
david4dev
Можем ли мы получить еще несколько тестов для проверки наших решений?
Догберт
@Dogbert - сделано
david4dev

Ответы:

3

J, 22 19 (убийственный подход)

Я взялся за это, играя в гольф мой ответ на Haskell.

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

(тот же I / O, что и мой другой ответ J )

JB
источник
Это дает мне ошибку:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev
@ david4dev Ой. Мой оставшийся файл сценария тоже не работал. Я не помню, где я ошибся, но версия, которую вы тестировали, действительно ошибочна. Это сейчас исправлено.
JB
3

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

print(binomial(n=input(),n\2)/2^n)
Dogbert
источник
Вау, я не рассматривал язык программирования со встроенной биномиальной функцией.
david4dev
32 символов: print(binomial(n=input,n\2)/2^n).
Чарльз
3

Python 53 персонажа

i=r=1.;exec"r*=(2*i-1)/i/2;i+=1;"*(input()/2);print r
fR0DDY
источник
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
JB
источник
Я получаю сообщение об ошибке: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

Это все говорит само за себя, но для грубого разделения обязанностей:

  • !~ -:можно рассматривать как биномиальный (х, х / 2)
  • % 2&^«делится на 2 ^ х »
  • &. (". @ stdin) _ для ввода / вывода
JB
источник
2

GNU Octave - 36 персонажей

disp(binopdf((n=input(""))/2,n,.5));
Juan
источник
2

Рубин, 39 знаков

p 1/(1..gets.to_i).inject{|a,b|1.0*b/a}
Ventero
источник
2

Golfscript - 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)! и n! / (n / 2)!
~Извлеките эти два числа в стек.
\Поменяйте местами два числа вокруг
/деления,
5@?*умножьте на 5 ** n. Это является причиной ограничения, указанного выше

gnibbler
источник
Мне любопытно, почему ограничение. Используете ли вы взлом Gosper для создания всех комбинаций? Идея пришла мне в голову (и спецификация ничего не говорит о времени выполнения).
Питер Тейлор
В Golfscript нет класса переменных с плавающей запятой, поэтому он вычисляет целое число, которое записывается после строки, 0.является десятичной частью ответа, но этот метод пропускает требуемый 0, когда вероятность возрастает менее чем на 10%.
aaaaaaaaaaaa
@Peter, что сказал eBusiness :)
gnibbler
2

TI-BASIC, 10

Это займет более десяти байтов памяти калькулятора, потому что есть заголовок программы, но есть только десять байтов кода.

binompdf(Ans,.5,.5Ans

//Equivalently:

2^~AnsAns nCr (.5Ans

Это принимает входные данные в форме [number]:[program name]; добавление команды ввода использует еще три байта. ~это одинарный минус токен.

lirtosiast
источник
1

Рубин - 50 57 54 символа

p (1..(n=gets.to_i)/2).reduce(1.0){|r,i|r*(n+1-i)/i/4}
Dogbert
источник
Это вычисляет nCr не вероятность.
david4dev
@ david4dev, исправлено.
Догберт
1

J, 20

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

Примеры:

f 2
0.5
f 4
0.375
f 6
0.3125
f 8
0.273438
Eelvex
источник
Вопрос требует ввода от STDIN, а не функции.
Догберт
@Dogbert: я знаю; Я забыл упомянуть об этом. Я намеревался обновить его ...
Eelvex
1

APL 21 15 символов

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

Там, где это не правильно

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

Где все в {} являются специфическими символами APL, как здесь .

jpjacobs
источник
Последний символ должен быть квадратом?
JB
Да, это должен быть четырехугольный символ.
jpjacobs
Я получаю�[token]: � undefined
david4dev
Я думаю, это проблема кодирования. В NARS2000 вы можете скопировать и вставить его как есть.
jpjacobs
1

Windows PowerShell, 45

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

Мех.

детеныш
источник
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)))
SuperJedi224
источник
0

Python 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
mbomb007
источник
0

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

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

Это основано на ответе Microsoft Excel . В C и Objective-C проблема заключается в жестком кодировании алгоритмов.

DDPWNAGE
источник