주어진 사건의 모든 조합의 가능성 정보 제공 목적입니다). [0,0,0]

확률이 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

이 문제는 “Cartesian product”계산과 관련이 있습니다.

이것은 코드 골프이므로 바이트 수가 가장 적은 코드가 이깁니다.



답변

하스켈, 86 바이트

unlines.map(\p->show(fst<$>p)++" = "++show(product$snd<$>p)).mapM(\x->[(0,1-x),(1,x)])

사용 예 :

Prelude> putStrLn $ unlines.map(\p->show(fst<$>p)++" = "++show(product$snd<$>p)).mapM(\x->[(0,1-x),(1,x)]) $ [0.55, 0.67, 0.13]
[0,0,0] = 0.12919499999999998
[0,0,1] = 1.9304999999999996e-2
[0,1,0] = 0.262305
[0,1,1] = 3.9195e-2
[1,0,0] = 0.157905
[1,0,1] = 2.3595e-2
[1,1,0] = 0.320595
[1,1,1] = 4.790500000000001e-2

대부분의 바이트는 출력 형식화에 사용됩니다. 확률 벡터에만 관심이 있다면 29 바이트에 불과합니다.

map product.mapM(\x->[1-x,x])

작동 방식 :

                    mapM(\x->[(0,1-x),(1,x)])   -- for each number x in the input
                                                -- list make either the pair (0,1-x)
                                                -- or (1,x). Build a list with
                                                -- all combinations

    map(\p->                    )               -- for each such combination p
          show(fst<$>p)                         -- print the first elements
          ++" = "++                             -- then the string " = "
          show(product$snd<$>p)                 -- then the product of the second
                                                -- elements

unlines                                         -- joins with newlines


답변

매스 매 티카, 46 45 바이트

(s=#;1##&@@Abs[#-s]&/@{1,0}~Tuples~Length@s)&

목록을 가져옵니다. {}출력이 있는 빈 목록에서도 작동합니다 {1}.

테스트 사례 :

%[{0.55, 0.67, 0.13}]
{0.129195, 0.019305, 0.262305, 0.039195, 0.157905, 0.023595, 0.320595, 0.047905}

설명

확률 s목록 b0“발생하지 않음”및 1” 발생 했음” 을 나타내는 비트 목록이 주어지면 곱할 확률 목록은 다음과 같이 주어집니다.

1 - b - s

서명합니다. 대신에 0“발생 했음”및 1“발생하지 않음”을 나타내면 다음과 같이 단순화됩니다.

b - s

그래서 우리는 :

                      {1,0}~Tuples~Length@s   (* Generate all possible bit combinations *)
              (#-s)&/@{1,0}~Tuples~Length@s   (* Generate probabilities to be multiplied
                                                  up to sign *)
     1##&@@Abs[#-s]&/@{1,0}~Tuples~Length@s   (* Correct sign and multiply;
                                                 1##& is short for Times *)
(s=#;1##&@@Abs[#-s]&/@{1,0}~Tuples~Length@s)& (* Assign s to first argument of function,
                                                 done separately to avoid clash
                                                 with inner function *)


답변

펄, 42 40 바이트

에 +1 포함 -a

STDIN에 숫자를 적으십시오 :

perl -M5.010 combi.pl <<< "0.55 0.67 0.13"

출력

0.129195
0.019305
0.262305
0.039195
0.157905
0.023595
0.320595
0.047905

combi.pl:

#!/usr/bin/perl -a
$"=")\\*({1-,}";say eval for<({1-,}@F)>


답변

MATL , 12 11 바이트

TF-|Z}&Z*!p

입력 값은 형식이있는 열 벡터입니다. [0.55; 0.67; 0.13]

온라인으로 사용해보십시오!

TF    % Push [1, 0]
-     % Subtract from implicit input (column array), with broadcast. Gives a 2-col
      % matrix where the first column is the input minus 1 and the second is the input
|     % Absolute value
Z}    % Split the matrix into its rows
&Z*   % Cartesian product of all resulting. This gives a matrix as result, with each
      % "combination" on a different row
!p    % Product of each row. Implicitly display


답변

펄, 116 바이트

for(glob"{0,1}"x(@a=split/ /,<>)){@c=split//;$d=1;$d*=@c[$_]?$a[$_]:1-$a[$_]for 0..$#a;say"[".join(",",@c)."] = $d"}

읽을 수있는 :

for(glob"{0,1}"x(@a=split/ /,<>)){
    @c=split//;
    $d=1;$d*=@c[$_]?$a[$_]:1-$a[$_]for 0..$#a;
    say"[".join(",",@c)."] = $d"
}

입력 매개 변수의 수와 동일한 길이 (0과 1)의 가능한 모든 조합의 목록을 작성하고 (예를 들어 위의 예에서는 길이가 3 임) 각 확률을 계산합니다.

나를 보여주는 @Dada에 감사는 어떤 glob기능을 할 수 있는지 이해가 나는 100 % 아니에요에도 불구하고, 수행 방법 은 그 않습니다.

샘플 출력 :

[0,0,0] = 0.129195
[0,0,1] = 0.019305
[0,1,0] = 0.262305
[0,1,1] = 0.039195
[1,0,0] = 0.157905
[1,0,1] = 0.023595
[1,1,0] = 0.320595
[1,1,1] = 0.047905


답변

72 화 69 바이트

stdin에서 입력을 받아서 확률의 R- 벡터를 반환합니다.

apply(abs(t(expand.grid(rep(list(1:0),length(x<-scan())))-x)),1,prod)

편집 : 하나의 불필요한 전치가 제거되고 순열 행렬은 이제 아래의 전치 버전이며 확률은 행 단위가 아닌 열 단위 곱으로 계산됩니다.
출력 예 :

[1] 0.129195 0.157905 0.262305 0.320595 0.019305 0.023595 0.039195 0.047905

확률 행렬 expand.grid은 다음에 의해 생성되는 순열 행렬로 인해 다른 순서로 진행됩니다 (이 행렬의 생성은 외부 패키지를 사용하여 골프를 칠 수 있음).

1    1    1    1
2    0    1    1
3    1    0    1
4    0    0    1
5    1    1    0
6    0    1    0
7    1    0    0
8    0    0    0

첫 번째 확률은 위의 행렬에서 첫 번째 행의 반전 된 결과에 해당하고 두 번째 행은 거꾸로 된 두 번째 행 등에 해당합니다. 출력을 형식화하면 프로그램을 더욱 명확하게 볼 수 있습니다 (164 바이트).

m=expand.grid(rep(list(1:0),length(x<-scan())))
cat(paste0("[",apply(abs(m-1),1,function(x)paste0(x,collapse=",")),"] = ",apply(abs(t(t(m)-x)),1,prod),"\n"),sep="")

대신에 다음을 생성합니다.

[0,0,0] = 0.129195
[1,0,0] = 0.157905
[0,1,0] = 0.262305
[1,1,0] = 0.320595
[0,0,1] = 0.019305
[1,0,1] = 0.023595
[0,1,1] = 0.039195
[1,1,1] = 0.047905


답변

젤리 , 9 바이트

ż@C×þF¥@/

온라인으로 사용해보십시오!