Você recebe uma matriz n por m de números inteiros, onde n, m> 3 . Sua tarefa é encontrar a sub-matriz 3 por 3 que tem a média mais baixa e gerar esse valor.
Regras e esclarecimentos:
- Os números inteiros não serão negativos
- Formato opcional de entrada e saída
- A saída deve ser precisa até pelo menos 2 pontos decimais (se não for um número inteiro)
- As submatrizes devem ser compostas de linhas e colunas consecutivas
Casos de teste:
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
Minimum mean: 14
100 65 2 93
3 11 31 89
93 15 95 65
77 96 72 34
Minimum mean: 46.111
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Minimum mean: 1
4 0 0 5 4
4 5 8 4 1
1 4 9 3 1
0 0 1 3 9
0 3 2 4 8
4 9 5 9 6
1 8 7 2 7
2 1 3 7 9
Minimum mean: 2.2222
Este é o código-golfe, portanto o código mais curto em cada idioma vence. Encorajo as pessoas a postar respostas em idiomas que já são usados, mesmo que não sejam mais curtos que o primeiro.
Respostas:
Oitava, 30 bytes
Experimente online!
fonte
Geléia ,
119 bytesEconomizou 2 bytes graças a @ Dennis .
Experimente online!
Explicação
fonte
+3\⁺€F÷9Ṃ
salva alguns bytes.+3\
primeiro e o duplicado como+3\€
? Não esperava que isso acontecesse\
abre3
e+
empurra o link rápido+3\
, abre o link⁺
rápido e empurra duas cópias, em seguida,€
abre a cópia superior e empurra uma versão de mapeamento.Oitava, 38 bytes
fonte
MATL ,
139 bytesPorto da resposta de @ rahnema1 .
Experimente online!
Como funciona
Considere entrada
como um exemplo.
fonte
Mathematica,
3735 bytesObrigado @MartinEnder por 2 bytes!
Explicação
fonte
Python 2 ,
93818079 bytesExperimente online!
Como funciona
f é uma função recursiva que pega uma lista de tuplas (ou qualquer outra iterável 2D indexável que represente uma matriz M ) e calcula recursivamente o mínimo da média da submatriz 3 × 3 no canto superior esquerdo ef aplicada de forma recursiva a M sem sua primeira linha e M sem sua primeira coluna.
f(M)
faz o seguinte.Se M tiver menos de três linhas,
M[2:]
é uma lista vazia, que f retorna.Observe que, como n> 3 na primeira execução, a inicial não pode retornar uma lista vazia.
Se M tiver três linhas ou mais,
M[2:]
não estiver vazio e, portanto, verdadeiro, o código à direitaand
será executado, retornando o mínimo dos três valores a seguir.M[:3]
gera as três primeiras linhas de M ,zip(*...)
transpõe linhas e colunas (produzindo uma lista de tuplas),sum(...,())
concatena todas as tuplas (isso funciona porque+
é concatenação) esum(...)/9
calcula a média da lista resultante de nove números inteiros.aplica recursivamente f a M com sua primeira linha removida.
transpõe linhas e colunas, remove a primeira linha do resultado (portanto, a primeira coluna de M e aplica-se recursivamente f ao resultado.
Observe que a camada removida anteriormente em uma chamada recursiva sempre será uma linha, portanto, testar se M tem linhas suficientes sempre será suficiente.
Finalmente, pode-se esperar que o retorno de algumas chamadas recursivas
[]
seja um problema. No entanto, no Python 2 , sempre que n for um número e A for iterável, a comparaçãon < A
retornará True ; portanto, calcular o mínimo de um ou mais números e um ou mais iteráveis sempre retornará o número mais baixo.fonte
J , 21 bytes
Experimente online!
A maneira correta de operar em sub-matrizes em J é usar a terceira
_3
forma de corte ( ),;.
ondex (u;._3) y
significa aplicar o verbou
em cada sub-x
matriz completa do tamanho da matrizy
. Uma solução usando isso requer apenas mais 1 byte, mas será muito mais eficiente em matrizes maiores.Experimente online!
Explicação
fonte
[]
aparência deles, mas na verdade não é.[
ou|
:)Gelatina , 18 bytes
Perdeu o truque, usado por milhas em sua resposta , ao usar uma redução cumulativa n-wise de adição - toda a primeira linha pode ser substituída
+3\
por 11.Experimente online!
Atravessa todas as sublistas contíguas, filtra para manter apenas as de comprimento 3 e somas (que vetoriza) e depois repete para cada lista resultante, para obter as somas de todas as sub-matrizes 3 por 3 e, por fim, as nivela em uma lista, leva o mínimo e divide por 9 (o número de elementos que fazem essa soma mínima).
fonte
Pitão, 19 bytes
Um programa que recebe entrada de uma lista de listas e imprime o resultado.
Suíte de teste
Como funciona
[Explicação que vem depois]
fonte
Python 3 ,
111103 bytesExperimente online!
fonte
Python 2, 96 bytes
Casos de teste em Repl.it
Uma função sem nome que faz uma lista de listas,
a
- as linhas da matriz.A função auxiliar
h
percorre três fatias adjacentes e mapeia a função de soma através da transposiçãozip(*s)
, de cada uma. Isso resulta na soma de todas as alturas de três fatias de colunas únicas.A função sem nome chama a função auxiliar, transpõe e chama a função auxiliar novamente no resultado e, em seguida, encontra o mínimo de cada um e o mínimo do resultado, que ele divide
9.
para produzir a média.fonte
JavaScript (ES6),
1079896 bytesUma função que calcula a soma de trigêmeos nas linhas e, em seguida, chama a si mesma a fazer o mesmo nas colunas, mantendo o controle do valor mínimo
M
.JS é um pouco detalhado para esse tipo de coisa e não possui um
zip()
método nativo . Levei muito tempo para salvar apenas uma dúzia de bytes em uma abordagem mais ingênua. (No entanto, provavelmente existe um método mais curto.)Versão não recursiva, 103 bytes
Economizou 2 bytes com a ajuda de Neil
Casos de teste
Mostrar snippet de código
fonte
(a,b=a.map(g=a=>a.slice(2).map((e,i)=>a[i]+a[i+1]+e)))=>eval(`Math.min(${b[0].map((_,i)=>g(b.map(a=>a[i])))})`)/9
m=>m.map((r,y)=>r.map((v,x)=>[..."12345678"].map(i=>v+=(m[y+i/3|0]||[])[x+i%3])&&(M=v<M?v:M)),M=1/0)&&M/9
, embora eu acho que minha primeira tentativa foi realmente maior do que isso.m=>m.map((r,y)=>y>1&&r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)),M=1/0)&&M/9
.m=>m.map((r,y)=>y>1?r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)):M=1/0)&&M/9
05AB1E ,
2116 bytesExperimente online!
Explicação
fonte
Haskell , 87 bytes
Experimente online!
fonte