Étant donné une séquence d'événements avec des probabilités comprises entre 0,0 et 1,0, générez et dérivez la probabilité que chaque combinaison se produise. Vous pouvez supposer qu'une séquence de nombres est fournie dans la construction de votre langue choisie.
Voici un exemple; vous pouvez supposer que la longueur des combinaisons de la séquence tient en mémoire:
{ 0.55, 0.67, 0.13 }
Le programme doit imprimer chaque combinaison et la probabilité associée que cette séquence se produise. Un 1 indique que l'événement dans cet index de la séquence d'entrée s'est produit et un 0 signifie que cet événement ne s'est pas produit. La sortie souhaitée est ci-dessous (je ne me soucie pas d'imprimer le travail, c'est juste à des fins d'information de l'algorithme):
[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
Ce problème est tangentiellement lié au calcul d'un "produit cartésien".
N'oubliez pas qu'il s'agit de code-golf, donc le code avec le moins d'octets gagne.
la source
[0.129195, 0.019305, 0.262305, ..., 0.047905]
suffisant en sortie ou sont-ils[0,0,0], [0,0,1], ...
nécessaires?Réponses:
Haskell, 86 octets
Exemple d'utilisation:
La plupart des octets sont dépensés pour le formatage de sortie. Si vous n'êtes intéressé que par le vecteur de probabilité, il n'est que de 29 octets:
Comment ça fonctionne:
la source
Mathematica,
4645 octetsPrend une liste. Fonctionne même pour la liste vide
{}
, pour laquelle la sortie est{1}
.Cas de test:
Explication
Compte tenu de la liste des probabilités
s
et une liste de bitsb
avec0
indiquant « ne se produit pas » et1
indiquant « ne se », la liste des probabilités à multiplier est donnée parà signer. Si au lieu de cela
0
dénote "s'est produit" et1
"ne s'est pas produit", cela simplifiealors on:
la source
Perl,
4240 octetsComprend +1 pour
-a
Donnez des chiffres sur STDIN:
les sorties
combi.pl
:la source
MATL ,
1211 octetsL'entrée est un vecteur colonne, au format
[0.55; 0.67; 0.13]
Essayez-le en ligne!
la source
Perl, 116 octets
Lisible:
Crée une liste de toutes les combinaisons possibles de 0 et 1 de longueur égale au nombre de paramètres d'entrée (par exemple, pour l'exemple ci-dessus, il serait de longueur 3), puis calcule chaque probabilité.
Merci à @Dada de m'avoir montré ce que la
glob
fonction peut faire, même si je ne suis pas sûr à 100% de comprendre comment cela fonctionne.Exemple de sortie:
la source
-a
au lieu de(@a=split/ /,<>)
...R,
7269 octetsPrend l'entrée de stdin et retourne un vecteur R de probabilités.
Edit: Suppression d'une transposition inutile, la matrice de permutation est maintenant la version transposée de celle ci-dessous et les probabilités sont calculées comme le produit par colonne plutôt que par ligne. Exemple de sortie:
Notez que les probabilités sont dans un ordre différent en raison du fait que la matrice de permutation générée par
expand.grid
produit ce qui suit (la génération de cette matrice peut probablement être jouée à l'aide de packages externes):La première probabilité correspond au résultat inversé de la première ligne de la matrice ci-dessus et la seconde à la deuxième ligne inversée, etc. Le formatage de la sortie pour voir cela rend encore plus clairement le programme plus long (164 octets):
qui produit à la place:
la source
expand.grid
! Je pense que celaapply
peut fonctionner sur les trames de données ainsi que sur les matrices, donc votre code devrait fonctionner sans let(t(...))
, ce qui vous fera économiser 6 octets.t
n'est lié à aucune trame de données mais pour permettre la soustraction du vecteur de probabilité de la matrice de permutation (avec différentes dimensions). Au moins l'un d'eux est nécessaire en raison de la façon dont R gère ces opérations vectorisées, mais je pourrais probablement supprimer la transposition externe et appliquer le produit sur des colonnes à la place.Gelée , 9 octets
Essayez-le en ligne!
la source
J, 14 octets
Usage
Explication
la source
|*//0.55 0.67 0.13-/0 1
un train?Pyth, 10 octets
Essayez-le en ligne: Démonstration
Explication:
la source
C, 110 octets
Non golfé:
Fonctionne jusqu'à 32 éléments, + 5 + 1 octets pour 64 éléments (déclarez
long k;
et ajoutezL
dans la première boucle pour quek<1L<<N
).la source
*1*<<n
ou est-ce juste une chose C ++?05AB1E , 8 octets
Essayez-le en ligne!
la source
JavaScript (Firefox 30-57), 57 octets
Renvoie un tableau de toutes les probabilités. Si vous voulez aussi le tableau des événements, alors pour 86 octets:
Si vous êtes autorisé à utiliser les événements sous forme de chaîne, cela ne représente que 80 octets:
Soustrayez deux octets pour
1/
chaque solution si la probabilité ne sera jamais nulle.la source
<script></script>
bloc? Je rencontre des problèmes avec le premier "pour" inattendu?Perl 6,
2419 octets de Latin-1Code plus ancien:
Ceci est une fonction. Utilisez-le comme ceci:
obtenir:
Explication de l'ancien code:
Le code le plus récent est fondamentalement le même, utilisant simplement la syntaxe terser:
La carte génère un tableau plein de
any
constructions, qui se multiplient enany
constructions plus grandes , résolvant proprement le problème sans même avoir besoin d'une boucle.Ce n'est pas la langue la plus courte du programme, mais c'est une traduction très directe du problème.
la source
Dyalog APL , 10 octets
Nouvelle solution
Indépendant de l'origine de l'index. Fonction anonyme. Prend la liste des probabilités comme argument.
∘.×/
La réduction du produit cartésien sur⊢
les valeurs d'argument,¨
chacun jumelé avec1-⊢
les valeurs des arguments complémentaires (lit. un moins les valeurs des arguments)TryAPL en ligne!
Ancienne solution
Requiert
⎕IO←0
ce qui est par défaut sur de nombreux systèmes. Demande la liste des probabilités.Explication
|
valeur absolue de⎕
l'entrée, ɑ = [ ɑ ₁ ɑ ₂ ɑ ₃]∘.×.-
tenseur intérieur modifié multiplié, ( ɑ ₁ - b ₁) ⊗ ( ɑ ₂ - b ₂) ⊗ ( ɑ ₃ - b ₃), avec⊂⍳2
la liste jointe b = [[0 1]]Définition mathématique
Comme b est inclus, il est scalaire, et donc étendu à la longueur de ɑ , à savoir 3, donc l'expression entière est
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 ligne!
Remarques (s'applique à la fois à l'ancienne et à la nouvelle solution)
Le programme et la formule fonctionnent pour n'importe quel nombre ( n ) de variables et renvoient un tableau à n dimensions de longueur 2 dans chaque dimension. Avec trois variables, la probabilité d'un résultat spécifique
P ( p , q , r ) = A p , q , r
qui peut être commodément sélectionné dans le tableau avec
(⊃A)[p;q;r]
extrait avecp q r⌷⊃A
Par exemple,
1 1 0⌷⊃|0.55 0.67 0.13∘.×.-⊂⍳2
donne P (55%, 67%, ¬13%) = 1,9305%la source
PHP,
1059794 9387 octetsCourez comme ceci:
Notez que la sortie est peu endienne:
Explication
Tweaks
$p
à 1 avec le calcul de$c
$i
au lieu d'incrémenter$c
au lieu de$$i
la source
C ++ 17,
137131129 129 octetsÉconomiser 6 octets en déclarant
#define A auto
, pour la première fois, qu'une macro aussi courte enregistre quoi que ce soit. -2 octets pour utiliser#import
et supprimer l'espace avant<
Génère toutes les combinaisons possibles.
Non golfé:
Usage:
la source