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


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

1
Мы можем предположить, что монеты идеальны, и есть ли шанс получить головы или хвосты?
Хуан

Нужно ли выводить вывод на стандартный вывод?
Догберт

@Juan да. @ Догберт, да.
david4dev

Можем ли мы получить еще несколько тестов для проверки наших решений?
Догберт

@Dogbert - сделано
david4dev

Ответы:


3

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

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

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

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


Это дает мне ошибку:0 1|domain error: script | %/ >:i.&.(".@stdin)_
david4dev

@ david4dev Ой. Мой оставшийся файл сценария тоже не работал. Я не помню, где я ошибся, но версия, которую вы тестировали, действительно ошибочна. Это сейчас исправлено.
JB

3

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

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

Вау, я не рассматривал язык программирования со встроенной биномиальной функцией.
david4dev

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


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

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

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



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. Это является причиной ограничения, указанного выше


Мне любопытно, почему ограничение. Используете ли вы взлом 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]; добавление команды ввода использует еще три байта. ~это одинарный минус токен.



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

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

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 проблема заключается в жестком кодировании алгоритмов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.