Una matriz estocástica es una matriz de probabilidades utilizada en el contexto de las cadenas de Markov.
Una matriz estocástica derecha es una matriz donde cada fila suma 1
.
Una matriz estocástica izquierda es una matriz donde cada columna suma 1
.
Una matriz doblemente estocástica es una matriz donde cada fila y cada columna suman 1
.
En este desafío, representaremos las probabilidades en porcentaje usando enteros . En ese caso, una fila o columna debe sumar 100
y no 1
.
Su objetivo es escribir un programa o función que, dada una matriz cuadrada de enteros como entrada, genere uno de los cuatro valores que indican que la matriz es estocástica derecha, estocástica izquierda, doblemente estocástica o ninguna de esas.
Entrada
Puede usar cualquier representación adecuada de una matriz que sea natural para su idioma para la entrada. Por ejemplo, una lista de listas, una cadena de valores separados por comas con filas separadas por saltos de línea, etc.
La matriz de entrada siempre será cuadrada y solo contendrá enteros no negativos. La matriz de entrada siempre será al menos 1×1
.
Puede pasar la entrada utilizando STDIN
, como argumento de función, o algo similar.
Salida
Debe elegir cuatro salidas distintas que correspondan a estocástico derecho , estocástico izquierdo , doblemente estocástico o ninguno de esos . Esas salidas deben ser constantes independientemente de la entrada que se pase. Es posible que su programa no devuelva resultados diferentes para el mismo caso, por ejemplo, decir que cualquier número negativo no corresponde a ninguno de ellos no es válido.
En resumen, debe haber una correspondencia 1 a 1 entre su salida y los cuatro casos posibles. Algunos ejemplos de esas cuatro salidas serían {1, 2, 3, 4}
o {[1,0], [0,1], [1,1], [0,0]}
ni siquiera {right, left, doubly, none}
.
Indique en su respuesta las cuatro salidas que utiliza su programa.
Si una matriz es doblemente estocástica, debe devolver la salida correspondiente a doblemente estocástica, y no estocástica derecha o izquierda.
Puede imprimir el resultado STDOUT
, devolverlo desde una función o algo similar.
Casos de prueba
[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]
Tanteo
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Respuestas:
05AB1E ,
131110 bytesEstocástico derecho: Estocástico
[0,1]
izquierdo:
[1,0]
Doble estocástico:
[1,1]
Ninguno de esos:
[0,0]
Pruébalo en línea!
Explicación
fuente
Haskell,
5755 bytesEntrada de tipo
(Eq a, Num a) => [[a]]
. Lista booleana de salidas[left-stochastic, right-stochastic]
Gracias a @proudhaskeller por guardar 2 bytes
fuente
[transpose,id]<*>
(entonces podría omitirlos a=
ya que se permiten funciones anónimas)[transpose,id]<*>
tiene un tipo de[[[a]]]->[[[a]]]
, que necesita otra capa demap
y unpure
/return
/(:[])
o una entrada de tipo [[[Int]]], que no es natural. Lo mejor que tengo esmap(all(==100).map sum).(<$>[transpose,id]).flip id
all((==100).sum)
lugar deall(==100).map sum
?all
hace un mapeo en sí mismo.R, 55 bytes
Función sin nombre donde
m
se supone que es una matriz R.Salida:
[1] TRUE FALSE
: Estocástico izquierdo[1] FALSE TRUE
: Estocástico derecho[1] TRUE TRUE
: Doblemente[1] FALSE FALSE
: Ningunafuente
any(colSums(m)-100)
y de la misma manera, elrowSums
te dejará dos bytes mientras invierte todas las salidas, por lo que si desea conservarlos, siempre puede poner un!
frente para el-1
byte neto .Octava,
35343231 bytesLlámalo así:
Pruébalo aquí.
Inicialmente guardé 2 bytes gracias a flawr, pero elegí otro enfoque que fue 1 byte más corto.
Esto genera lo siguiente para los diferentes casos:
Lo último
,2
sería innecesario si no se incluyeran dígitos individuales. Además, si esto se suma a en1
lugar de100
(como podría haberlo hecho), ahorraría otros4
bytes.fuente
Mathematica 29 Bytes
sustituyendo el carácter = U + F3C7 = [\ Transpose]. Este fragmento de código se pegará correctamente en Mathematica.
La misma convención de veracidad con {lefttruth, righttruth} como salida
fuente
{}⋃
ahorra un byteUnion@
Total@
conTr/@
ahorrará otros 2 bytes.{}⋃Tr/@#=={100}&/@{#,#}&
k,
2119 bytesSalida
00b
ninguna10b
izquierda01b
Derecha11b
ambosEjemplo:
editar: reducir el recuento de bytes en 3: la función no necesita estar encerrada en una lambda
editar: reducir bytecount en 2 - H / T @Simon Major
fuente
MATL , 12 bytes
La salida es dos valores cero / uno. Primero indica si la matriz es estocástica izquierda, segundo si es estocástica derecha.
Pruébalo en línea! O verificar todos los casos de prueba
fuente
Mathematica,
4643 bytesComo con otras respuestas, las salidas son
{False, False}
para no estocástico{True, False}
para el estocástico izquierdo{False, True}
para el estocástico derecho{True, True}
para doble estocásticoSe guardaron 3 bytes al cambiar a la forma de operador de
AllTrue
fuente
\[Transpose]
�
era menos esclarecedor@
al finalPHP, 104 bytes
Una función anónima que echos 0 => ambos, 1 => izquierda, 2 => derecha, 3 => ninguno.
Usar como:
Una versión del programa de línea de comando a 114 bytes:
Usado como:
fuente
Python 2,
7064 bytesNo hay nada loco aquí, solo haciendo uso de las salpicaduras
zip
para transponer la matriz :) Los resultados son los siguientes:Y aquí está el código :)
fuente
splat
operador :) Esencialmente, eso es lo que me permite transponer la matriz :)C #,
205203183 bytesGolfizado:
Ungolfed con comentarios:
Tecla de salida: 1 - estocástico derecho 2 - estocástico izquierdo 3 - estocástico doble 4 - ninguno
Pruébelo: http://rextester.com/PKYS11433
EDITAR1:
r=0;c=0;
=>r=c=0;
EDIT2: operadores ternarios anidados. Los créditos van a @Yodle.
fuente
if(e==1&&w==1)return 3;if(e==1)return 1;return w==1?2:4;
Dado quee
yw
solo puede ser 1 o 0, se puede cambiarreturn w<<1|e;
y redefinir none == 0.if
declaraciones en operaciones ternarias y simplemente devuelve un número entero al final. No sé si debería publicar mi solución, ya que es muy similar.JavaScript (ES6), 83 bytes
Para ser contrario, esto no solo genera el resultado estoico derecho a la izquierda, sino que los valores booleanos también se invierten, por lo que una salida de
[false, true]
todavía significa estoico derecho.fuente
C # 6, 130 bytes
{False, False}
para no estocástico{True, False}
para izquierdo estocástico{False, True}
para derecho estocástico{True, True}
para doble estocásticodemo de repl.it
Sin golf
fuente
Groovy, 57
Salida
[0,0]
si ninguno.[1,0]
si es correcto[0,1]
si queda[1,1]
si ambos.fuente
Pip , 17 bytes
En un giro inesperado, esta sumisión es una función.
Devuelve una lista de dos
0
/1
valores:[0 0]
= no estocástico,[0 1]
= estocástico izquierdo,[1 0]
= estocástico derecho,[1 1]
= doblemente estocástico. Pruébalo en línea!Explicación
fuente
Dyalog APL , 16 bytes
{∧/100=+/↑⍵(⍉⍵)}
{ }
definición de función directa (también conocida como "dfn"),⍵
es el argumento⍵(⍉⍵)
la matriz junto con su transposición↑
mezclarlos en una sola matriz 2 × n × n+/
suma a lo largo del último eje, obtiene una matriz 2 × n100=
qué elementos son 100 (los booleanos son 0 1)∧/
"y" -reducción a lo largo del último eje, obtener 2 booleanos para el estocástico izquierdo y derechofuente
C ++ 14,
139136133130 bytes-3 bytes para
s=M.size()
, -3 bytes para regresar por parámetro de referencia, -3 bytes como una lambda sin nombreAsume que la entrada es como
vector<vector<int>>
. Devuelve 3,2,1,0 para doble, izquierda, derecha, ninguno estocástico.Sin golf:
fuente