Учитывая последовательность событий с вероятностями от 0,0 до 1,0, генерировать и выводить вероятность возникновения каждой комбинации. Вы можете предположить, что последовательность чисел предоставляется в любой конструкции, которую обеспечивает выбранный вами язык.
Вот пример; Вы можете предположить, что длина комбинаций последовательности вписывается в память:
{ 0.55, 0.67, 0.13 }
Программа должна распечатать каждую комбинацию и соответствующую вероятность этой последовательности. 1 означает, что событие в этом индексе входной последовательности произошло, а 0 означает, что это событие не произошло. Ниже приведен желаемый результат (меня не волнует печать работы, это только для информационных целей алгоритма):
[0,0,0] = (1 - 0.55) * (1-0.67) * (1-0.13) = 0.129195
[0,0,1] = (1 - 0.55) * (1-0.67) * (0.13) = 0.019305
[0,1,0] = (1 - 0.55) * (0.67) * (1-0.13) = 0.262305
[0,1,1] = (1 - 0.55) * (0.67) * (0.13) = 0.039195
[1,0,0] = (0.55) * (1-0.67) * (1-0.13) = 0.157905
[1,0,1] = (0.55) * (1-0.67) * (0.13) = 0.023595
[1,1,0] = (0.55) * (0.67) * (1-0.13) = 0.320595
[1,1,1] = (0.55) * (0.67) * (0.13) = 0.047905
Эта проблема косвенно связана с вычислением «декартового произведения».
Помните, это код-гольф, поэтому выигрывает код с наименьшим количеством байтов.
источник
[0.129195, 0.019305, 0.262305, ..., 0.047905]
достаточно в качестве вывода или[0,0,0], [0,0,1], ...
необходимы?Ответы:
Haskell, 86 байт
Пример использования:
Большая часть байтов расходуется на форматирование вывода. Если вас интересует только вектор вероятности, это всего лишь 29 байтов:
Как это устроено:
источник
Mathematica,
4645 байтЗанимает список. Даже работает для пустого списка
{}
, для которого вывод{1}
.Прецедент:
объяснение
Учитывая список вероятностей
s
и список битовb
с0
обозначением «не произошло» и1
обозначением «действительно произошло», список вероятностей, которые необходимо умножить, задается какдо подписи. Если вместо этого
0
означает «произошло» и1
«не произошло», то это упрощаетпоэтому мы:
источник
Perl,
4240 байтВключает +1 для
-a
Дайте цифры на STDIN:
выходы
combi.pl
:источник
MATL ,
1211 байтВвод - это вектор-столбец в формате
[0.55; 0.67; 0.13]
Попробуйте онлайн!
источник
Perl, 116 байт
Удобочитаемый:
Создает список всех возможных комбинаций длины 0 и 1, равный количеству входных параметров (например, для приведенного выше примера, он будет иметь длину 3), а затем вычисляет каждую вероятность.
Спасибо @Dada за то, что показали мне, на что способна эта
glob
функция , хотя я не уверен на 100%, что понимаю, как она это делает.Пример вывода:
источник
-a
вместо(@a=split/ /,<>)
...R,
7269 байтПринимает входные данные из stdin и возвращает R-вектор вероятностей.
Изменить: Удалена одна ненужная транспонирование, матрица перестановок теперь является транспонированной версией приведенной ниже, и вероятности рассчитываются как произведение по столбцам, а не по строкам. Пример вывода:
Обратите внимание, что вероятности находятся в другом порядке из-за того факта, что сгенерированная матрица перестановок
expand.grid
выдает следующее (генерация этой матрицы, вероятно, может быть выполнена с использованием внешних пакетов):Первая вероятность соответствует инвертированному результату первой строки в приведенной выше матрице, а вторая - инвертированной второй строке и т. Д. Форматирование вывода, чтобы увидеть это еще более отчетливо, делает программу более длинной (164 байта):
который вместо этого производит:
источник
expand.grid
! Я думаю, что этоapply
может работать как с кадрами данных, так и с матрицами, поэтому ваш код должен работать без тогоt(t(...))
, что сэкономит вам 6 байтов.t
это не связано с каким-либо фреймом данных, но позволяет вычитать вектор вероятности из матрицы перестановок (с различными измерениями). По крайней мере один из них необходим из-за способа, которым R обрабатывает эти векторизованные операции, но я мог бы, вероятно, удалить внешнюю транспонирование и вместо этого применить продукт над столбцами. Будет обновление завтраЖеле , 9 байт
Попробуйте онлайн!
источник
J, 14 байт
использование
объяснение
источник
|*//0.55 0.67 0.13-/0 1
в поезд?Pyth, 10 байт
Попробуйте онлайн: демонстрация
Объяснение:
источник
C, 110 байтов
Ungolfed:
Работает до 32 элементов, + 5 + 1 байт для 64 элементов (объявить
long k;
и добавитьL
в первый цикл, чтобыk<1L<<N
).источник
*1*<<n
или это просто C ++?05AB1E , 8 байтов
Попробуйте онлайн!
источник
JavaScript (Firefox 30-57), 57 байт
Возвращает массив всех вероятностей. Если вам тоже нужен массив событий, то для 86 байтов:
Если вы допускаете события в виде строки, то это всего лишь 80 байтов:
Вычтите два байта для
1/
каждого решения, если вероятность никогда не будет равна нулю.источник
<script></script>
блоке? У меня проблемы с первым "за", который был неожиданным?Perl 6,
2419 байт латиницы-1Старый код:
Это функция. Используйте это так:
получить:
Объяснение старого кода:
Более новый код в основном такой же, только с использованием более короткого синтаксиса:
Карта генерирует массив, полный
any
конструкций, которые умножаются на большиеany
конструкции, аккуратно решая проблему, даже не нуждаясь в цикле.Не самый короткий язык для программы, но это очень прямой перевод проблемы.
источник
Дьялог АПЛ , 10 байт
Новое решение
Индекс происхождения не зависит. Анонимная функция. Принимает список вероятностей в качестве аргумента.
∘.×/
Сокращение декартовых произведений⊢
значения аргумента,¨
каждый в паре с1-⊢
значения аргумента дополнения (горит один минус значения аргумента)Попробуй APL онлайн!
Старое решение
Требуется
⎕IO←0
по умолчанию во многих системах. Запрашивает список вероятностей.объяснение
|
абсолютное значение⎕
вход, ɑ = [ ɑ ₁ ɑ ₂ ɑ ₃]∘.×.-
умноженный модифицированный внутренний тензор, ( ɑ ₁ - b ₁) ⊗ ( ɑ ₂ - b ₂) ⊗ ( ɑ ₃ - b ₃), с⊂⍳2
приложенный список б = [[0 1]]Математическое определение
Поскольку b заключено, оно является скалярным и, следовательно, распространяется на длину ɑ , а именно 3, поэтому все выражение имеет вид
A = ɑ ( ɑ ₁ - b ) ⊗ ( ɑ b - b ) ⊗ ( ɑ ₃ - b ) │ =
│ ( ɑ ₁ - [0,1]) ⊗ ( ɑ ₂ - [0,1]) ⊗ ( ɑ ₃ - [0,1]) │ =
│ [ ɑ ₁, ɑ ₁ - 1] ⊗ [ ɑ ₂ , ɑ ₂ - 1] ⊗ [ ɑ ₃, ɑ ₃ - 1] = │
⎢ ⎡ ⎡ ɑ ₁ ɑ ₂ ɑ₃ ⎤ ⎡ ɑ ₁ ɑ ₂ ( ɑ ₃-1) ⎤ ⎤ ⎥
⎢ ⎢ ⎣ ɑ ₁ ( ɑ ₂-1) ɑ ₃ ⎦ ⎣ ɑ ₁ ( ɑ ₂-1) ( ɑ ₃-1) ⎦ ⎥ ⎥
⎢ ⎢ ⎡ ( ɑ ₁-1) ɑ ₃-1) ⎤ ⎥ ⎥ ⎢ ⎣ ɑ ( ɑ ₁-1) ( ɑ ₂-1) ɑ ₃⎦ ⎣ ( ɑ ₁- 1) ( ɑ ₂-1) ( ɑ ₃-1) ⎦ ⎦ ⎥⎡ ₂ ɑ ₃ ⎤ ⎡ ( ɑ ₁-1) ɑ ₂ (
Попробуй APL онлайн!
Примечания (относится как к старому, так и к новому решению)
Программа и формула работает для любого числа ( n ) переменных и возвращает n мерный массив длины 2 в каждом измерении. С тремя переменными вероятность конкретного результата
P ( p , q , r ) = A p , q , r,
которая может быть удобно выбрана из массива с
(⊃A)[p;q;r]
извлеченным сp q r⌷⊃A
Например,
1 1 0⌷⊃|0.55 0.67 0.13∘.×.-⊂⍳2
дает P (55%, 67%, ¬13%) = 1,9305%источник
PHP
1059794 9387 байтЗапустите так:
Обратите внимание, что выходные данные имеют порядок байтов:
объяснение
Tweaks
$p
в 1 с вычислением$c
$i
вместо увеличения$c
вместо$$i
источник
С ++ 17,
137131129 байтСохранение 6 байтов
#define A auto
, впервые объявив , что такой короткий макрос сохраняет что-либо. -2 байта для использования#import
и удаления места перед<
Создает все возможные комбинации.
Ungolfed:
Использование:
источник