Une matrice stochastique est une matrice de probabilités utilisée dans le contexte des chaînes de Markov.
Une matrice stochastique droite est une matrice où chaque ligne fait la somme 1
.
Une matrice stochastique gauche est une matrice où chaque colonne fait la somme 1
.
Une matrice doublement stochastique est une matrice où chaque ligne et chaque colonne résument 1
.
Dans ce défi, nous représenterons les probabilités en pourcentage en utilisant des entiers . Une ligne ou une colonne doit dans ce cas additionner 100
et non 1
.
Votre objectif est d'écrire un programme ou une fonction qui, étant donné une matrice carrée d'entiers, génère une des quatre valeurs indiquant que la matrice est soit stochastique droite, stochastique gauche, doublement stochastique ou aucune de celles-ci.
Contribution
Vous pouvez utiliser toute représentation appropriée d'une matrice qui est naturelle pour votre langue pour l'entrée. Par exemple, une liste de listes, une chaîne de valeurs séparées par des virgules avec des lignes séparées par des sauts de ligne, etc.
La matrice d'entrée sera toujours carrée et ne contiendra que des entiers non négatifs. La matrice d'entrée sera toujours au moins 1×1
.
Vous pouvez passer l'entrée en utilisant STDIN
, comme argument de fonction, ou quelque chose de similaire.
Sortie
Vous devez choisir quatre sorties distinctes qui correspondent à stochastique droite , gauche stochastique , bistochastiques ou aucun de ceux . Ces sorties doivent être constantes quelle que soit l'entrée transmise. Votre programme peut ne pas renvoyer des sorties différentes pour le même cas, par exemple en disant que tout nombre négatif ne correspond à aucune de celles-ci n'est pas valide.
En bref, il doit y avoir une correspondance 1 à 1 entre votre sortie et les quatre cas possibles. Quelques exemples de ces quatre sorties seraient {1, 2, 3, 4}
ou {[1,0], [0,1], [1,1], [0,0]}
ou même {right, left, doubly, none}
.
Veuillez indiquer dans votre réponse les quatre sorties utilisées par votre programme.
Si une matrice est doublement stochastique, vous devez renvoyer la sortie correspondant à doublement stochastique et non à droite ou à gauche stochastique.
Vous pouvez imprimer la sortie dans STDOUT
, la renvoyer à partir d'une fonction ou quelque chose de similaire.
Cas de test
[100] => Doubly stochastic
[42] => None of those
[100 0 ] => Doubly stochastic
[0 100]
[4 8 15]
[16 23 42] => Left stochastic
[80 69 43]
[99 1 ] => Right stochastic
[2 98]
[1 2 3 4 ]
[5 6 7 8 ] => None of those
[9 10 11 12]
[13 14 15 16]
Notation
Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte.
Réponses:
05AB1E ,
131110 octetsStochastique droit
[0,1]
:
[1,0]
Stochastique gauche: Doublement stochastique:
[1,1]
Aucun de ceux-ci:
[0,0]
Essayez-le en ligne!
Explication
la source
Haskell,
5755 octetsEntrée de type
(Eq a, Num a) => [[a]]
. Liste booléenne de sorties[left-stochastic, right-stochastic]
Merci à @proudhaskeller pour avoir économisé 2 octets
la source
[transpose,id]<*>
(alors vous pouvez omettre les a=
car des fonctions anonymes sont autorisées)[transpose,id]<*>
a un type de[[[a]]]->[[[a]]]
, qui nécessite une autre couche demap
etpure
/return
/(:[])
ou une entrée de type [[[Int]]], ce qui n'est pas naturel. Le meilleur que j'ai eu estmap(all(==100).map sum).(<$>[transpose,id]).flip id
all((==100).sum)
lieu deall(==100).map sum
?all
fait une cartographie en soi.R, 55 octets
Fonction sans nom où
m
est supposée être une matrice R.Sortie:
[1] TRUE FALSE
: Stochastique gauche[1] FALSE TRUE
: Stochastique droit[1] TRUE TRUE
: Doublement[1] FALSE FALSE
: Aucunla source
any(colSums(m)-100)
et de même pour lerowSums
vous déposera deux octets tout en inversant toutes les sorties, donc si vous souhaitez les conserver, vous pouvez toujours mettre un!
avant pour l'-1
octet net .Octave,
35343231 octetsAppelez ça comme ceci:
Testez-le ici.
Enregistré 2 octets grâce à flawr au départ, mais a opté pour une autre approche qui était 1 octet plus court.
Cela génère les éléments suivants pour les différents cas:
Le dernier
,2
serait inutile si des chiffres uniques n'étaient pas inclus. De plus, si cela se résumait à1
au lieu de100
(comme cela aurait pu être le cas), cela économiserait un autre4
octet.la source
Mathematica 29 octets
en remplaçant le caractère = U + F3C7 = [\ Transpose]. Cet extrait de code sera collé correctement dans Mathematica.
Même convention de véracité avec {lefttruth, righttruth} en sortie
la source
{}⋃
enregistre un octet de plusUnion@
Total@
parTr/@
sauvera encore 2 octets.{}⋃Tr/@#=={100}&/@{#,#}&
k,
2119 octetsSortie
00b
aucun10b
la gauche01b
droite11b
tous les deuxExemple:
modifier: réduire le nombre d'octets de 3 - la fonction n'a pas besoin d'être enfermée dans un lambda
modifier: réduire le nombre d'octets de 2 - H / T @Simon Major
la source
MATL , 12 octets
La sortie est deux valeurs zéro / un. La première indique si la matrice est stochastique gauche, la seconde si elle est stochastique droite.
Essayez-le en ligne! Ou vérifiez tous les cas de test
la source
Mathematica,
4643 octetsComme pour les autres réponses, les sorties sont
{False, False}
pour non stochastique{True, False}
pour stochastique gauche{False, True}
pour stochastique à droite{True, True}
pour doublement stochastiqueEnregistré 3 octets en passant à la forme d'opérateur de
AllTrue
la source
\[Transpose]
�
c'était moins instructif@
à la finPHP, 104 octets
Une fonction anonyme qui fait écho à 0 => les deux, 1 => à gauche, 2 => à droite, 3 => ni l'un ni l'autre.
Utilisez comme:
Une version du programme en ligne de commande à 114 octets:
Utilisé comme:
la source
Python 2,
7064 octetsRien de fou ici, juste utiliser des éclaboussures
zip
pour transposer la matrice :) Les sorties sont les suivantes:Et voici le code :)
la source
splat
opérateur :) C'est essentiellement ce qui me permet de transposer la matrice :)C #,
205203183 octetsGolfé:
Non golfé avec des commentaires:
Touche de sortie: 1 - stochastique droite 2 - stochastique gauche 3 - double stochastique 4 - aucune
Essayez-le: http://rextester.com/PKYS11433
EDIT1:
r=0;c=0;
=>r=c=0;
EDIT2: Opérateurs ternaires imbriqués. Les crédits vont à @Yodle.
la source
if(e==1&&w==1)return 3;if(e==1)return 1;return w==1?2:4;
Étant donné quee
etw
ne peut être que 1 ou 0, il peut être modifiéreturn w<<1|e;
et redéfini aucun == 0.if
instructions en opérations ternaires et renvoyez simplement un entier à la fin. Idunno si je devais poster ma solution car elle est tellement similaire.JavaScript (ES6), 83 octets
Juste pour être contraire, non seulement cela donne le résultat stoachistique droit sur la gauche, mais les booléens sont également inversés, donc une sortie de
[false, true]
signifie toujours stoachistique droit.la source
C # 6, 130 octets
{False, False}
pour non stochastique{True, False}
pour gauche-stochastique{False, True}
pour droite-stochastique{True, True}
pour doublement stochastiquedémo repl.it
Non golfé
la source
Groovy, 57
Sortie
[0,0]
sinon.[1,0]
si c'est vrai.[0,1]
si laissé.[1,1]
si les deux.la source
Pip , 17 octets
Dans une tournure inattendue, cette soumission est une fonction.
Renvoie une liste de deux
0
/1
valeurs:[0 0]
= non stochastique,[0 1]
= stochastique gauche[1 0]
= stochastique droite,[1 1]
= doublement stochastique. Essayez-le en ligne!Explication
la source
Dyalog APL , 16 octets
{∧/100=+/↑⍵(⍉⍵)}
{ }
définition de fonction directe (aka "dfn"),⍵
est l'argument⍵(⍉⍵)
la matrice à côté de sa transposition↑
les mélanger dans un seul tableau 2 × n × n+/
somme le long du dernier axe, obtenez une matrice 2 × n100=
quels éléments sont 100 (les booléens sont 0 1)∧/
"et" -réduction le long du dernier axe, obtenir 2 booléens pour gauche, droite stochastiquela source
C ++ 14,
139136133130 octets-3 octets pour
s=M.size()
, -3 octets pour le retour par paramètre de référence, -3 octets comme lambda sans nomSuppose que l'entrée est similaire
vector<vector<int>>
. Renvoie 3,2,1,0 pour doublement, gauche, droite, aucun stochastique.Non golfé:
la source