Dada uma sequência de eventos com probabilidades entre 0,0 e 1,0, gere e calcule a probabilidade de cada combinação ocorrer. Você pode presumir que uma sequência de números seja fornecida em qualquer construção que o idioma escolhido forneça.
Aqui está um exemplo; você pode presumir que o comprimento das combinações da sequência cabe na memória:
{ 0.55, 0.67, 0.13 }
O programa deve imprimir cada combinação e a probabilidade associada dessa sequência. Um 1 indica que o evento nesse índice da sequência de entrada ocorreu e um 0 indica que esse evento não ocorreu. A saída desejada está abaixo (não me importo com a impressão do trabalho, isso é apenas para fins informativos do algoritmo):
[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
Esse problema está tangencialmente relacionado ao cálculo de um "produto cartesiano".
Lembre-se, isso é código-golfe, portanto o código com o menor número de bytes vence.
fonte
[0.129195, 0.019305, 0.262305, ..., 0.047905]
suficiente como saída ou é[0,0,0], [0,0,1], ...
necessário?Respostas:
Haskell, 86 bytes
Exemplo de uso:
A maioria dos bytes é gasta na formatação de saída. Se você está interessado apenas no vetor de probabilidade, são apenas 29 bytes:
Como funciona:
fonte
Mathematica,
4645 bytesLeva uma lista. Até funciona para a lista vazia
{}
, para a qual a saída é{1}
.Caso de teste:
Explicação
Dada uma lista de probabilidades
s
e uma lista de bitsb
com0
denotando "não ocorreu" e1
denotando "ocorreu", a lista de probabilidades a serem multiplicadas é dada poraté assinar. Se, em vez disso,
0
denota "ocorreu" e1
"não ocorreu", isso simplifica aentão nós:
fonte
Perl,
4240 bytesInclui +1 para
-a
Dê números sobre STDIN:
saídas
combi.pl
:fonte
MATL ,
1211 bytesEntrada é um vetor de coluna, com o formato
[0.55; 0.67; 0.13]
Experimente online!
fonte
Perl, 116 bytes
Legível:
Cria uma lista de todas as combinações possíveis de 0s e 1s de comprimento igual ao número de parâmetros de entrada (por exemplo, para o exemplo acima, seria de comprimento 3) e calcula cada probabilidade.
Agradeço ao @Dada por me mostrar o que a
glob
função pode fazer, mesmo que eu não tenha 100% de certeza de que entendi como isso é feito.Saída de amostra:
fonte
-a
em vez de(@a=split/ /,<>)
...R,
7269 bytesPega a entrada de stdin e retorna um vetor R de probabilidades.
Edit: Removida uma transposição desnecessária, a matriz de permutação agora é a versão transposta da abaixo e as probabilidades são calculadas como o produto em colunas e não em linhas. Exemplo de saída:
Observe que as probabilidades estão em uma ordem diferente devido ao fato de que a matriz de permutação gerada por
expand.grid
produz o seguinte (a geração dessa matriz provavelmente pode ser alterada usando pacotes externos):A primeira probabilidade corresponde ao resultado invertido da primeira linha na matriz acima e a segunda à segunda linha invertida etc. A formatação da saída para ver isso ainda mais claramente torna o programa mais longo (164 bytes):
que produz:
fonte
expand.grid
! Eu acho que issoapply
pode funcionar tanto em quadros de dados quanto em matrizes, portanto seu código deve funcionar sem ot(t(...))
, o que economizará 6 bytes.t
não está relacionado a nenhum quadro de dados, mas para permitir a subtração do vetor de probabilidade da matriz de permutação (com diferentes dimensões). Pelo menos um deles é necessário devido à maneira como R lida com essas operações vetorizadas, mas eu provavelmente poderia remover a transposição externa e aplicar o produto sobre as colunas. Será atualizado amanhãGeléia , 9 bytes
Experimente online!
fonte
J, 14 bytes
Uso
Explicação
fonte
|*//0.55 0.67 0.13-/0 1
em um trem?Pitão, 10 bytes
Experimente online: Demonstração
Explicação:
fonte
C, 110 bytes
Ungolfed:
Funciona até 32 itens, + 5 + 1 bytes para 64 itens (declare
long k;
e adicioneL
no primeiro loop para quek<1L<<N
).fonte
*1*<<n
ou isso é apenas uma coisa de C ++?05AB1E , 8 bytes
Experimente online!
fonte
JavaScript (Firefox 30-57), 57 bytes
Retorna uma matriz de todas as probabilidades. Se você deseja a matriz de eventos também, então para 86 bytes:
Se você receber os eventos como uma sequência, serão apenas 80 bytes:
Subtraia dois bytes para
1/
cada solução se a probabilidade nunca for zero.fonte
<script></script>
bloco? Estou tendo problemas com o primeiro "por" ser inesperado?Perl 6,
2419 bytes de Latin-1Código mais antigo:
Esta é uma função. Use-o assim:
para obter:
Explicação do código mais antigo:
O código mais recente é basicamente o mesmo, apenas usando a sintaxe do terser:
O mapa gera uma matriz cheia de
any
construções, que se multiplicam emany
construções maiores , resolvendo o problema perfeitamente, sem precisar de um loop.Não é o idioma mais curto para o programa, mas é uma tradução muito direta do problema.
fonte
Dyalog APL , 10 bytes
Nova Solução
Origem do índice independente. Função anônima. Leva a lista de probabilidades como argumento.
∘.×/
A redução do produto cartesiano⊢
os valores do argumento,¨
cada um emparelhado com1-⊢
os valores do argumento do complemento (lit. um menos os valores do argumento)TryAPL online!
Solução antiga
Requer
⎕IO←0
qual é o padrão em muitos sistemas. Solicita a lista de probabilidades.Explicação
|
valor absoluto de⎕
a entrada, ɑ = [ ɑ ₁ ɑ ₂ ɑ ]∘.×.-
tensor interno modificado multiplicado, ( ɑ ₁ - b ₁) ⊗ ( ɑ ₂ - b ₂) ⊗ ( ɑ ₃ - b ₃), com⊂⍳2
a lista anexa b = [[0 1]]Definição matemática
Como b é delimitado, é escalar e, portanto, estendido ao comprimento de ɑ , ou seja, 3, de modo que toda a expressão é
A = │ ( ɑ ₁ - b ) ⊗ ( ɑ ₂ - b ) ⊗ ( ɑ ₃ - b ) │ =
│ ( ɑ ₁ - [0,1]) ⊗ ( ɑ ₂ - [0,1]) ⊗ ( ɑ ₃ - [0,1]) │ =
│ [ ɑ ₁, ɑ ₁ - 1] ⊗ [ ɑ ₂ , ɑ ₂ - 1] ⊗ [ ɑ ₃, ɑ ₃ - 1] │ =
⎢ ⎡ ⎡ ɑ ₁ ɑ ₂ ɑ₃ ⎤ ⎡ ɑ ₁ ɑ ₂ ( ɑ ₃-1) ⎤ ⎤ ⎥
⎢ ⎢ ⎣ ɑ ₁ ( ɑ ₂-1) ɑ ₃ ⎦ ⎣ ɑ ₁ ( ɑ ₂-1) ( ɑ ₃-1) ⎦ ⎥ ⎥
⎢ ⎢ ⎡ ( ɑ ₁-1) ɑ ₂ ɑ ₃ ⎤ ⎡ ( ɑ ₁-1) ɑ ₂ ( ɑ ₃-1) ⎥ ⎥ ⎤
⎢ ⎣ ⎣ ( ɑ ₁-1) ( ɑ ₂-1) ɑ ₃⎦ ⎣ ( ɑ ₁-1) ( ɑ ₂-1) ( ɑ ₃-1) ⎦ ⎦
TryAPL online!
Notas (aplica-se à solução antiga e à nova)
O programa e a fórmula funcionam para qualquer número ( n ) de variáveis e retornam uma matriz n- dimensional de comprimento 2 em todas as dimensões. Com três variáveis, a probabilidade de um resultado específico
P ( p , q , r ) = A p , q , r
que pode ser convenientemente selecionado da matriz com
(⊃A)[p;q;r]
extraído comp q r⌷⊃A
Por exemplo,
1 1 0⌷⊃|0.55 0.67 0.13∘.×.-⊂⍳2
dá- P (55%, 67%, ¬13%) = 1,9305%fonte
PHP,
1059794 9387 bytesExecute assim:
Observe que a saída é pouco endian:
Explicação
Tweaks
$p
1 com o cálculo de$c
$i
invés de incrementar$c
vez de$$i
fonte
C ++ 17,
137131129 bytesSalvando 6 bytes declarando
#define A auto
, pela primeira vez que uma macro tão curta salva qualquer coisa. -2 bytes para usar#import
e excluir o espaço antes<
Gera todas as combinações possíveis.
Ungolfed:
Uso:
fonte