Uma matriz estocástica é uma matriz de probabilidades usada no contexto das cadeias de Markov.
Uma matriz estocástica direita é uma matriz em que cada linha é somada 1
.
Uma matriz estocástica esquerda é uma matriz em que cada coluna é somada 1
.
Uma matriz duplamente estocástica é uma matriz em que cada linha e cada coluna é somada 1
.
Neste desafio, representaremos as probabilidades em porcentagem usando números inteiros . Nesse caso, uma linha ou coluna deve somar 100
e não 1
.
Seu objetivo é escrever um programa ou função que, dada uma matriz quadrada de números inteiros como entrada, produza um dos quatro valores indicando que a matriz é estocástica direita, estocástica esquerda, duplamente estocástica ou nenhuma delas.
Entrada
Você pode usar qualquer representação adequada de uma matriz que seja natural para o seu idioma para a entrada. Por exemplo, uma lista de listas, uma sequência de valores separados por vírgula com linhas separadas por quebras de linha, etc.
A matriz de entrada sempre será quadrada e conterá apenas números inteiros não negativos. A matriz de entrada sempre será pelo menos 1×1
.
Você pode passar a entrada usando STDIN
, como argumento de função, ou qualquer coisa semelhante.
Saída
Você deve escolher quatro saídas distintas que correspondem a estocástico direito , estocástico esquerdo , duplamente estocástico ou nenhum deles . Essas saídas devem ser constantes, independentemente de qual entrada é passada. Seu programa não pode retornar saídas diferentes para o mesmo caso, por exemplo, dizer que qualquer número negativo corresponde a nenhum deles não é válido.
Em suma, deve haver uma correspondência 1 para 1 entre sua saída e os quatro casos possíveis. Alguns exemplos dessas quatro saídas seriam {1, 2, 3, 4}
ou {[1,0], [0,1], [1,1], [0,0]}
ou mesmo {right, left, doubly, none}
.
Indique na sua resposta as quatro saídas que o seu programa usa.
Se uma matriz é duplamente estocástica, você deve retornar a saída correspondente a duplamente estocástica, e não à direita ou esquerda estocástica.
Você pode imprimir a saída STDOUT
, retorná-la de uma função ou algo semelhante.
Casos de teste
[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]
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
Respostas:
05AB1E ,
131110 bytesEstocástico direito: Estocástico
[0,1]
esquerdo:
[1,0]
Duplamente estocástico:
[1,1]
Nenhum desses:
[0,0]
Experimente online!
Explicação
fonte
Haskell,
5755 bytesEntrada do tipo
(Eq a, Num a) => [[a]]
. Mostra lista booleana[left-stochastic, right-stochastic]
Obrigado a @proudhaskeller por salvar 2 bytes
fonte
[transpose,id]<*>
(então você pode omitir ass a=
funções anynomous são permitidas)[transpose,id]<*>
tem um tipo de[[[a]]]->[[[a]]]
, que precisa de outra camadamap
epure
/return
/(:[])
ou de uma entrada do tipo [[[Int]]], que não é natural. O melhor que eu consegui émap(all(==100).map sum).(<$>[transpose,id]).flip id
all((==100).sum)
vez deall(==100).map sum
?all
faz um mapeamento em si.R, 55 bytes
Função sem nome, onde
m
se supõe ser uma matriz R.Saída:
[1] TRUE FALSE
: Estocástico esquerdo[1] FALSE TRUE
: Estocástico direito[1] TRUE TRUE
: Duplamente[1] FALSE FALSE
: Nenhumfonte
any(colSums(m)-100)
e da mesma formarowSums
, você eliminará dois bytes ao inverter todas as saídas; portanto, se você quiser mantê-las, sempre poderá colocar um!
by-net à frente-1
.Oitava,
35343231 bytesChame assim:
Teste aqui.
Economizou 2 bytes graças ao flawr inicialmente, mas optou por outra abordagem que foi 1 byte menor.
Isso gera o seguinte para os diferentes casos:
O último
,2
seria desnecessário se não fossem incluídos dígitos únicos. Além disso, se isso somar em1
vez de100
(como poderia ter), ele salvará outros4
bytes.fonte
Mathematica 29 Bytes
substituindo o caractere = U + F3C7 = [\ Transpose]. Este trecho de código será colado corretamente no Mathematica.
A mesma convenção de veracidade com {lefttruth, righttruth} que a saída
fonte
{}⋃
salva um byteUnion@
Total@
porTr/@
salvará mais 2 bytes.{}⋃Tr/@#=={100}&/@{#,#}&
k,
2119 bytesSaída
00b
Nenhum10b
esquerda01b
direita11b
ambosExemplo:
editar: reduzir a contagem de bytes em 3 - a função não precisa ser incluída em um lambda
edit: reduza bytecount em 2 - H / T @Simon Major
fonte
MATL , 12 bytes
A saída é dois valores zero / um. Primeiro indica se a matriz é estocástica esquerda, depois se é estocástica direita.
Experimente online! Ou verifique todos os casos de teste
fonte
Mathematica,
4643 bytesComo em outras respostas, os resultados são
{False, False}
para não estocástico{True, False}
para estocástico esquerdo{False, True}
para estocástico direito{True, True}
para duplamente estocásticoSalva 3 bytes alternando para o formulário do operador
AllTrue
fonte
\[Transpose]
�
era menos esclarecedora@
no finalPHP, 104 bytes
Uma função anônima que ecoa 0 => ambos, 1 => esquerda, 2 => direita, 3 => nenhum.
Use como:
Uma versão do programa de linha de comando em 114 bytes:
Usado como:
fonte
Python 2,
7064 bytesNada louco aqui, apenas fazendo uso de splatting
zip
para transpor a matriz :) As saídas são as seguintes:E aqui está o código :)
fonte
splat
operador :) Essencialmente é isso que está me deixando transpor a matriz :)C #,
205203183 bytesGolfe:
Ungolfed com comentários:
Tecla de saída: 1 - estocástico direito 2 - estocástico esquerdo 3 - estocástico duplo 4 - nenhum
Experimente: http://rextester.com/PKYS11433
EDIT1:
r=0;c=0;
=>r=c=0;
EDIT2: Operadores ternários aninhados. Os créditos vão para @Yodle.
fonte
if(e==1&&w==1)return 3;if(e==1)return 1;return w==1?2:4;
Comoe
ew
só pode ser 1 ou 0, ele pode ser alterado parareturn w<<1|e;
e redefinir nenhum == 0.if
instruções em operações ternárias e retornar um número inteiro no final. Idunno se devo postar minha solução, pois é tão semelhante.JavaScript (ES6), 83 bytes
Apenas para ser contrário, isso não apenas produz o resultado estequiático certo à esquerda, mas os booleanos também são invertidos, de modo que uma produção de
[false, true]
ainda significa estatisticamente correto.fonte
C # 6, 130 bytes
{False, False}
para não estocástico{True, False}
para estocástico esquerdo para estocástico{False, True}
direito{True, True}
para duplamente estocásticodemo repl.it
Ungolfed
fonte
Groovy, 57
Saída
[0,0]
se nenhum.[1,0]
se certo.[0,1]
se for deixado.[1,1]
se ambos.fonte
Pip , 17 bytes
Em uma reviravolta inesperada, essa submissão é uma função.
Retorna uma lista de dois
0
/1
valores:[0 0]
= não estocástico,[0 1]
= estocástico esquerdo,[1 0]
= estocástico direito,[1 1]
= duplamente estocástico. Experimente online!Explicação
fonte
Dyalog APL , 16 bytes
{∧/100=+/↑⍵(⍉⍵)}
{ }
definição de função direta (aka "dfn"),⍵
é o argumento⍵(⍉⍵)
a matriz ao lado de sua transposição↑
misture-os em uma única matriz 2 × n × n+/
soma ao longo do último eixo, obtenha uma matriz 2 × n100=
quais elementos são 100 (os booleanos são 0 1)∧/
"e" - ao longo do último eixo, obtenha 2 booleanos para estocástico esquerdo e direitofonte
C ++ 14,
139136133130 bytes-3 bytes para
s=M.size()
, -3 bytes para retornar pelo parâmetro de referência, -3 bytes como um lambda sem nomeAssume a entrada como
vector<vector<int>>
. Retorna 3,2,1,0 para duplamente, esquerda, direita, nenhuma estocástica.Ungolfed:
fonte