Dada una secuencia de eventos con probabilidades entre 0.0 y 1.0, generar y derivar la probabilidad de que ocurra cada combinación. Puede suponer que se proporciona una secuencia de números en cualquier construcción que proporcione su idioma elegido.
Aquí hay un ejemplo; puede suponer que la longitud de las combinaciones de la secuencia se ajusta a la memoria:
{ 0.55, 0.67, 0.13 }
El programa imprimirá cada combinación y la probabilidad asociada de que ocurra esa secuencia. Un 1 indicará que ocurrió el evento en ese índice de la secuencia de entrada y un 0 indicará que ese evento no ocurrió. El resultado deseado está debajo (no me importa imprimir el trabajo, eso es solo para fines informativos del 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
Este problema está relacionado tangencialmente con el cálculo de un "producto cartesiano".
Recuerde, este es el código golf, por lo que gana el código con el menor número de bytes.
fuente
[0.129195, 0.019305, 0.262305, ..., 0.047905]
Sería suficiente como salida o son los[0,0,0], [0,0,1], ...
necesarios?Respuestas:
Haskell, 86 bytes
Ejemplo de uso:
La mayoría de los bytes se gastan para el formato de salida. Si solo le interesa el vector de probabilidad, solo tiene 29 bytes:
Cómo funciona:
fuente
Mathematica,
4645 bytesToma una lista. Incluso funciona para la lista vacía
{}
, para la cual es la salida{1}
.Caso de prueba:
Explicación
Dada una lista de probabilidades
s
y una lista de bitsb
con0
denotando "no ocurrió" y1
denotando "ocurrió", la lista de probabilidades a multiplicar viene dada porhasta firmar. Si en cambio
0
denota "ocurrió" y1
"no ocurrió", entonces esto se simplifica aAsí que nosotros:
fuente
Perl,
4240 bytesIncluye +1 para
-a
Dar números en STDIN:
salidas
combi.pl
:fuente
MATL ,
1211 bytesLa entrada es un vector de columna, con el formato
[0.55; 0.67; 0.13]
Pruébalo en línea!
fuente
Perl, 116 bytes
Legible:
Crea una lista de todas las combinaciones posibles de 0s y 1s de longitud igual al número de parámetros de entrada (por ejemplo, para el ejemplo anterior, sería de longitud 3), luego calcula cada probabilidad.
Gracias a @Dada por mostrarme lo
glob
que puede hacer la función , aunque no estoy 100% seguro de entender cómo lo hace.Salida de muestra:
fuente
-a
en lugar de(@a=split/ /,<>)
...R,
7269 bytesToma información de stdin y devuelve un vector R de probabilidades.
Editar: se eliminó una transposición innecesaria, la matriz de permutación ahora es la versión transpuesta de la siguiente y las probabilidades se calculan como el producto en forma de columna en lugar de en forma de fila. Salida de ejemplo:
Tenga en cuenta que las probabilidades están en un orden diferente debido al hecho de que la matriz de permutación generada por
expand.grid
produce lo siguiente (la generación de esta matriz probablemente se puede jugar usando paquetes externos):La primera probabilidad corresponde al resultado invertido de la primera fila en la matriz anterior y la segunda a la segunda fila invertida, etc. El formateo de la salida para ver esto aún más claramente hace que el programa sea más largo (164 bytes):
que en cambio produce:
fuente
expand.grid
! Creo queapply
puede funcionar tanto en marcos de datos como en matrices, por lo que su código debería funcionar sin elt(t(...))
, lo que le ahorrará 6 bytes.t
no está relacionado con ningún marco de datos, sino para permitir la resta del vector de probabilidad de la matriz de permutación (con diferentes dimensiones). Se necesita al menos uno de ellos debido a la forma en que R maneja estas operaciones vectorizadas, pero probablemente podría eliminar la transposición externa y aplicar el producto sobre columnas. Se actualizará mañanaJalea , 9 bytes
Pruébalo en línea!
fuente
J, 14 bytes
Uso
Explicación
fuente
|*//0.55 0.67 0.13-/0 1
un tren?Pyth, 10 bytes
Pruébelo en línea: demostración
Explicación:
fuente
C, 110 bytes
Sin golf:
Funciona hasta 32 elementos, + 5 + 1 bytes para 64 elementos (declare
long k;
y agregueL
en el primer bucle para quek<1L<<N
).fuente
*1*<<n
o es solo una cosa de C ++?05AB1E , 8 bytes
Pruébalo en línea!
fuente
JavaScript (Firefox 30-57), 57 bytes
Devuelve una matriz de todas las probabilidades. Si también desea la matriz de eventos, entonces para 86 bytes:
Si se le permiten los eventos como una cadena, entonces solo son 80 bytes:
Resta dos bytes para
1/
cada solución si la probabilidad nunca será cero.fuente
<script></script>
bloque? ¿Tengo problemas con el primer "para" ser inesperado?Perl 6,
2419 bytes de latín-1Código anterior:
Esta es una función. Úselo así:
Llegar:
Explicación del código anterior:
El código más nuevo es básicamente el mismo, solo que usa la sintaxis terser:
El mapa genera una matriz llena de
any
construcciones, que se multiplican enany
construcciones más grandes , resolviendo el problema sin necesidad de un bucle.No es el lenguaje más corto para el programa, pero es una traducción muy directa del problema.
fuente
Dyalog APL , 10 bytes
Nueva solución
Indice de origen independiente. Función anónima. Toma la lista de probabilidades como argumento.
∘.×/
La reducción del producto cartesiano sobre⊢
los valores del argumento,¨
cada uno emparejado con1-⊢
los valores del argumento del complemento (literalmente uno menos los valores del argumento)TryAPL en línea!
Antigua solución
Requiere
⎕IO←0
cuál es el predeterminado en muchos sistemas. Solicita la lista de probabilidades.Explicación
|
valor absoluto de⎕
la entrada, ɑ = [ ɑ ₁ ɑ ₂ ɑ ₃]∘.×.-
tensor interno modificado multiplicado, ( ɑ ₁ - b ₁) ⊗ ( ɑ ₂ - b ₂) ⊗ ( ɑ ₃ - b ₃), con⊂⍳2
la lista adjunta b = [[0 1]]Definición matemática
Como b está encerrado, es escalar y, por lo tanto, se extiende a la longitud de ɑ , es decir, 3, por lo que toda la expresión es
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 en línea!
Notas (se aplica tanto a la solución antigua como a la nueva)
El programa y la fórmula funcionan para cualquier número ( n ) de variables y devuelve una matriz n- dimensional de longitud 2 en cada dimensión. Con tres variables, la probabilidad de un resultado específico
P ( p , q , r ) = A p , q , r
que puede seleccionarse convenientemente de la matriz con
(⊃A)[p;q;r]
extraído conp q r⌷⊃A
Por ejemplo,
1 1 0⌷⊃|0.55 0.67 0.13∘.×.-⊂⍳2
da P (55%, 67%, ¬13%) = 1.9305%fuente
PHP,
1059794 9387 bytesCorre así:
Tenga en cuenta que la salida es little endian:
Explicación
Ajustes
$p
a 1 con el cálculo de$c
$i
lugar de incrementar$c
lugar de$$i
fuente
C ++ 17,
137131129 bytesAhorrando 6 bytes declarando
#define A auto
, la primera vez que una macro tan corta guarda algo. -2 bytes para usar#import
y eliminar el espacio antes<
Genera todas las combinaciones posibles.
Sin golf:
Uso:
fuente