확률이 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
목록 b
과 0
“발생하지 않음”및 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