Te dan una matriz de enteros n-por-m , donde n, m> 3 . Su tarea es encontrar la submatriz de 3 por 3 que tenga la media más baja y generar este valor.
Reglas y aclaraciones:
- Los enteros serán no negativos.
- Formato opcional de entrada y salida
- La salida debe ser precisa hasta al menos 2 puntos decimales (si no es entero)
- Las submatrices deben estar formadas por filas y columnas consecutivas
Casos de prueba:
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 es el código de golf, por lo que gana el código más corto en cada idioma. Animo a las personas a publicar respuestas en idiomas que ya se utilizan, incluso si no es más corto que el primero.
Respuestas:
Octava, 30 bytes
Pruébalo en línea!
fuente
Jalea ,
119 bytesGuardado 2 bytes gracias a @ Dennis .
Pruébalo en línea!
Explicación
fuente
+3\⁺€F÷9Ṃ
Guarda un par de bytes.+3\
primero y el duplicado como+3\€
? No esperaba que eso sucediera\
aparece3
y+
empuja el enlace rápido+3\
, abre el enlace⁺
rápido y empuja dos copias, luego€
abre la copia superior y empuja una versión de mapeo.Octava, 38 bytes
fuente
MATL ,
139 bytesLa respuesta del puerto de @ rahnema1 .
Pruébalo en línea!
Cómo funciona
Considerar entrada
como ejemplo.
fuente
Mathematica,
3735 bytes¡Gracias @MartinEnder por 2 bytes!
Explicación
fuente
Python 2 ,
93818079 bytesPruébalo en línea!
Cómo funciona
f es una función recursiva que toma una lista de tuplas (o cualquier otra iterable 2D indexable que represente una matriz M ) y calcula recursivamente el mínimo de la media de la submatriz 3 × 3 en la esquina superior izquierda yf aplica recursivamente a M sin su primera fila y M sin su primera columna.
f(M)
hace lo siguienteSi M tiene menos de tres filas,
M[2:]
es una lista vacía, que devuelve f .Tenga en cuenta que, dado que n> 3 en la primera ejecución, la inicial no puede devolver una lista vacía.
Si M tiene tres filas o más,
M[2:]
no está vacío y, por lo tanto, es verdadero, entonces el código a la derecha deand
se ejecuta, devolviendo el mínimo de los tres valores siguientes.M[:3]
produce las primeras tres filas de M ,zip(*...)
transpone filas y columnas (produciendo una lista de tuplas),sum(...,())
concatena todas las tuplas (esto funciona porque+
es concatenación) ysum(...)/9
calcula la media de la lista resultante de nueve enteros.aplica recursivamente f a M con su primera fila eliminada.
transpone filas y columnas, elimina la primera fila del resultado (por lo tanto, la primera columna de M y aplica recursivamente f al resultado).
Tenga en cuenta que la capa eliminada previamente en una llamada recursiva siempre será una fila, por lo que probar si M tiene suficientes filas siempre será suficiente.
Finalmente, uno puede esperar que algunas llamadas recursivas que regresen
[]
sean un problema. Sin embargo, en Python 2 , cuando n es un número y A es un iterable, la comparaciónn < A
devuelve True , por lo que calcular el mínimo de uno o más números y uno o más iterables siempre devolverá el número más bajo.fuente
J , 21 bytes
Pruébalo en línea!
La forma correcta de operar en subconjuntos en J es usar la tercera forma (
_3
) de corte;.
dondex (u;._3) y
significa aplicar el verbou
en cada subconjunto completo del tamañox
de la matrizy
. Una solución que usa solo requiere 1 byte más pero será mucho más eficiente en matrices más grandes.Pruébalo en línea!
Explicación
fuente
[]
se combinan, pero realmente no lo son.[
o|
:)Jalea , 18 bytes
Se perdió el truco, como lo utilizan millas en su respuesta , de usar una reducción acumulativa de suma n-sabia: toda la primera línea se puede reemplazar
+3\
por 11.Pruébalo en línea!
Atraviesa todas las sublistas contiguas, filtra para mantener solo las de longitud 3 y sumas (que vectoriza) luego repite para cada lista resultante, para obtener las sumas de todas las submatrices 3 por 3 y finalmente las aplana en una lista, toma el mínimo y se divide por 9 (el número de elementos que hacen esta suma mínima).
fuente
Pyth, 19 bytes
Un programa que toma la entrada de una lista de listas e imprime el resultado.
Banco de pruebas
Cómo funciona
[Explicación más tarde]
fuente
Python 3 ,
111103bytesPruébalo en línea!
fuente
Python 2, 96 bytes
Casos de prueba en Repl.it
Una función sin nombre que toma una lista de listas,
a
- las filas de la matriz.La función auxiliar se
h
desplaza a través de tres sectores adyacentes y asigna la función de suma a través de la transposiciónzip(*s)
, de cada uno. Esto da como resultado la suma de todas las alturas en tres sectores de columnas individuales.La función sin nombre llama a la función auxiliar, transpone y vuelve a llamar a la función auxiliar en el resultado, luego encuentra el mínimo de cada uno y el mínimo del resultado, que luego divide
9.
para obtener el promedio.fuente
JavaScript (ES6),
1079896 bytesUna función que calcula las sumas de tripletes sobre las filas y luego se llama a sí misma para hacer lo mismo sobre las columnas, haciendo un seguimiento del valor mínimo
M
.JS es un poco detallado para ese tipo de cosas y carece de un
zip()
método nativo . Me llevó bastante tiempo guardar solo una docena de bytes en un enfoque más ingenuo. (Sin embargo, probablemente exista un método más corto).Versión no recursiva, 103 bytes.
Guardado 2 bytes con la ayuda de Neil
Casos de prueba
Mostrar fragmento de código
fuente
(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
, aunque creo que mi primer intento fue en realidad más grande que eso.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 bytesPruébalo en línea!
Explicación
fuente
Haskell , 87 bytes
Pruébalo en línea!
fuente