On vous donne une matrice n-par-m d'entiers, où n, m> 3 . Votre tâche consiste à trouver la sous-matrice 3 x 3 qui a la moyenne la plus faible et à sortir cette valeur.
Règles et clarifications:
- Les entiers seront non négatifs
- Format d'entrée et de sortie en option
- La sortie doit être précise jusqu'à au moins 2 décimales (si elle n'est pas entière)
- Les sous-matrices doivent être constituées de lignes et de colonnes consécutives
Cas de test:
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
Il s'agit de code-golf, donc le code le plus court dans chaque langue l'emporte. J'encourage les gens à poster des réponses dans les langues déjà utilisées, même si elles ne sont pas plus courtes que la première.
Réponses:
Octave, 30 octets
Essayez-le en ligne!
la source
Gelée ,
119 octetsEnregistré 2 octets grâce à @ Dennis .
Essayez-le en ligne!
Explication
la source
+3\⁺€F÷9Ṃ
enregistre quelques octets.+3\
premier et le doublon+3\€
? Je ne m'attendais pas à ce que cela se produise\
pops3
et+
et pousse le quicklink+3\
,⁺
pops le la quicklink et pousse deux copies, puis€
apparaît la copie et supérieure pousse une version de cartographie.Octave, 38 octets
la source
MATL ,
139 octetsPort de la réponse de @ rahnema1 .
Essayez-le en ligne!
Comment ça marche
Tenez compte des commentaires
par exemple.
la source
Mathematica,
3735 octetsMerci @MartinEnder pour 2 octets!
Explication
la source
Python 2 ,
93818079 octetsEssayez-le en ligne!
Comment ça marche
f est une fonction récursive qui prend une liste de tuples (ou tout autre itérable 2D indexable qui représente une matrice M ) et calcule récursivement le minimum de la moyenne de la sous-matrice 3 × 3 dans le coin supérieur gauche et f est appliqué récursivement à M sans sa première ligne et M sans sa première colonne.
f(M)
fait ce qui suit.Si M a moins de trois lignes,
M[2:]
est une liste vide, que f renvoie.Notez que, puisque n> 3 lors de la première exécution, l'initiale ne peut pas renvoyer une liste vide.
Si M a trois lignes ou plus,
M[2:]
n'est pas vide et donc véridique, donc le code à droite deand
est exécuté, renvoyant le minimum des trois valeurs suivantes.M[:3]
donne les trois premières lignes de M ,zip(*...)
transpose les lignes et les colonnes (donnant une liste de tuples),sum(...,())
concatène tous les tuples (cela fonctionne parce que+
c'est la concaténation) etsum(...)/9
calcule la moyenne de la liste résultante de neuf entiers.applique récursivement f à M avec sa première ligne supprimée.
transpose les lignes et les colonnes, supprime la première ligne du résultat (donc la première colonne de M , et applique récursivement f au résultat.
Notez que la couche précédemment supprimée dans un appel récursif sera toujours une ligne, donc tester si M a suffisamment de lignes sera toujours suffisant.
Enfin, on peut s'attendre à ce que certains appels récursifs renvoyés
[]
soient un problème. Cependant, en Python 2 , chaque fois que n est un nombre et A est un itérable, la comparaisonn < A
renvoie Vrai , donc le calcul du minimum d'un ou plusieurs nombres et un ou plusieurs itérables retournera toujours le nombre le plus bas.la source
J , 21 octets
Essayez-le en ligne!
La bonne façon d'opérer sur les sous-tableaux en J est d'utiliser la troisième
_3
forme de coupure ( );.
oùx (u;._3) y
signifie appliquer le verbeu
sur chaque sousx
-tableau complet de la taille du tableauy
. Une solution utilisant cela ne nécessite qu'un octet de plus, mais sera beaucoup plus efficace sur les baies plus grandes.Essayez-le en ligne!
Explication
la source
[]
ils ressemblent, mais ce n'est vraiment pas le cas.[
ou|
:)Gelée , 18 octets
Vous avez raté l'astuce, telle qu'utilisée par miles dans leur réponse , d'utiliser une réduction cumulative n-sage de l'addition - toute la première ligne peut être remplacée par
+3\
pour 11.Essayez-le en ligne!
Parcourt toutes les sous-listes contiguës, filtre pour ne garder que celles de longueur 3 et les sommes (qui vectorise) puis répète pour chaque liste résultante, pour obtenir les sommes des 3 sous-matrices 3 et finalement aplatit celles-ci en une seule liste, prend le minimum et divise par 9 (le nombre d'éléments faisant cette somme minimale).
la source
Pyth, 19 octets
Un programme qui prend l'entrée d'une liste de listes et imprime le résultat.
Suite de tests
Comment ça marche
[Explication à venir plus tard]
la source
Python 3 ,
111103 octetsEssayez-le en ligne!
la source
Python 2, 96 octets
Cas de test chez Repl.it
Une fonction sans nom prenant une liste de listes,
a
- les lignes de la matrice.La fonction d'assistance
h
zippe à travers trois tranches adjacentes et mappe la fonction de somme à travers la transpositionzip(*s)
, de chacune. Cela se traduit par la somme de toutes les tranches de hauteur de trois colonnes simples.La fonction sans nom appelle la fonction d'aide, transpose et appelle à nouveau la fonction d'aide sur le résultat, puis trouve le minimum de chacun et le minimum du résultat, qu'elle divise ensuite en
9.
pour donner la moyenne.la source
JavaScript (ES6),
1079896 octetsUne fonction qui calcule les sommes des triplets sur les lignes, puis s'appelle pour faire la même chose sur les colonnes, en gardant une trace de la valeur minimale
M
.JS est un peu bavard pour ce genre de choses et n'a pas de
zip()
méthode native . Il m'a fallu beaucoup de temps pour économiser une douzaine d'octets sur une approche plus naïve. (Pourtant, une méthode plus courte existe probablement.)Version non récursive, 103 octets
Enregistré 2 octets avec l'aide de Neil
Cas de test
Afficher l'extrait de code
la source
(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
, même si je pense que ma première tentative était en fait plus grande que cela.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 octetsEssayez-le en ligne!
Explication
la source
Haskell , 87 octets
Essayez-le en ligne!
la source