Sie erhalten eine n-mal-m- Matrix von ganzen Zahlen, wobei n, m> 3 ist . Ihre Aufgabe ist es, die 3-mal-3 -Submatrix mit dem niedrigsten Mittelwert zu finden und diesen Wert auszugeben.
Regeln und Erläuterungen:
- Die ganzen Zahlen sind nicht negativ
- Optionales Eingabe- und Ausgabeformat
- Die Ausgabe muss bis auf mindestens 2 Dezimalpunkte genau sein (wenn es sich um eine nicht ganzzahlige Zahl handelt)
- Die Submatrizen müssen aus aufeinanderfolgenden Zeilen und Spalten bestehen
Testfälle:
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
Das ist Code-Golf, also gewinnt der kürzeste Code in jeder Sprache. Ich ermutige die Leute, Antworten in Sprachen zu posten, die bereits verwendet werden, auch wenn sie nicht kürzer als die erste sind.
Antworten:
Oktave, 30 Bytes
Probieren Sie es online!
quelle
Jelly ,
119 Bytes2 Bytes gespart dank @ Dennis .
Probieren Sie es online!
Erläuterung
quelle
+3\⁺€F÷9Ṃ
spart ein paar Bytes.+3\
zuerst verarbeitet und das Duplikat als+3\€
? Habe nicht damit gerechnet\
Pops3
und+
und drückt den Quicklink+3\
,⁺
öffnet das die Quick und schiebt zwei Kopien, dann€
die oberste Kopie erscheint und schiebt eine Abbildungs Version.Oktave, 38 Bytes
quelle
MATL ,
139 BytesPort von @ rahnema1's Antwort .
Probieren Sie es online!
Wie es funktioniert
Betrachten Sie die Eingabe
als Beispiel.
quelle
Mathematica,
37-35BytesDanke @MartinEnder für 2 Bytes!
Erläuterung
quelle
Python 2 ,
93818079 BytesProbieren Sie es online!
Wie es funktioniert
f ist eine rekursive Funktion, die eine Liste von Tupeln (oder jede andere indizierbare 2D-Iteration, die eine Matrix M darstellt ) verwendet und rekursiv das Minimum des Mittelwerts der 3 × 3- Submatrix in der oberen linken Ecke berechnet und f ohne rekursiv auf M angewendet seine erste Zeile und M ohne seine erste Spalte.
f(M)
macht das Folgende.Wenn M weniger als drei Zeilen hat,
M[2:]
ist dies eine leere Liste, die f zurückgibt.Beachten Sie, dass die Initiale keine leere Liste zurückgeben kann , da n> 3 in der ersten Ausführung ist.
Wenn M drei oder mehr Zeilen hat,
M[2:]
nicht leer und daher wahr ist, wird der Code rechts vonand
ausgeführt und gibt das Minimum der drei folgenden Werte zurück.M[:3]
ergibt die ersten drei Zeilen von M ,zip(*...)
transponiert Zeilen und Spalten (ergibt eine Liste von Tupeln),sum(...,())
verkettet alle Tupel (dies funktioniert, weil+
es sich um Verkettung handelt) undsum(...)/9
berechnet den Mittelwert der resultierenden Liste von neun ganzen Zahlen.wendet rekursiv f auf M an, wobei die erste Zeile entfernt wird.
transponiert Zeilen und Spalten, entfernt die erste Zeile des Ergebnisses (also die erste Spalte von M ) und wendet rekursiv f auf das Ergebnis an.
Beachten Sie, dass die zuvor entfernte Ebene in einem rekursiven Aufruf immer eine Zeile ist. Daher ist es immer ausreichend zu testen, ob M über genügend Zeilen verfügt.
Schließlich ist zu erwarten, dass einige rekursive Aufrufe, die zurückkehren
[]
, ein Problem darstellen. In Python 2 gibt der Vergleich jedoch immer dann, wenn n eine Zahl und A eine iterable Zahl ist, Truen < A
zurück. Wenn Sie also mindestens eine Zahl und mindestens eine iterable Zahl berechnen, wird immer die niedrigste Zahl zurückgegeben.quelle
J , 21 Bytes
Probieren Sie es online!
Der richtige Weg , auf Subarrays in J zu betreiben ist , um die dritte (um
_3
) Form geschnitten ,;.
wox (u;._3) y
Mittel Verb anzuwendenu
auf jeder vollen Subarray der Größex
des Arraysy
. Eine Lösung, die dies verwendet, benötigt nur 1 Byte mehr, ist jedoch auf größeren Arrays viel effizienter.Probieren Sie es online!
Erläuterung
quelle
[]
, wie sie aussehen, aber sie stimmen wirklich nicht überein.[
oder benutzen sollen|
:)Gelee , 18 Bytes
Verpasste den von Meilen in ihrer Antwort verwendeten Trick, eine n-weise kumulative Additionsreduktion zu verwenden - die gesamte erste Zeile kann durch
+3\
11 ersetzt werden.Probieren Sie es online!
Durchläuft alle zusammenhängenden Unterlisten, filtert, um nur diejenigen mit der Länge 3 und Summen (die vektorisieren) beizubehalten, und wiederholt sich dann für jede resultierende Liste, um die Summen aller 3 × 3-Untermatrizen zu erhalten und diese schließlich zu einer Liste zusammenzufassen, nimmt das Minimum und dividiert durch 9 (die Anzahl der Elemente, aus denen diese minimale Summe besteht).
quelle
Pyth, 19 Bytes
Ein Programm, das eine Liste von Listen eingibt und das Ergebnis druckt.
Testsuite
Wie es funktioniert
[Erklärung kommt später]
quelle
Python 3 ,
111103 BytesProbieren Sie es online!
quelle
Python 2, 96 Bytes
Testfälle bei Repl.it
Eine unbenannte Funktion, die eine Liste von Listen erstellt,
a
- die Zeilen der Matrix.Die Hilfsfunktion
h
blättert durch drei benachbarte Slices und ordnet die Summenfunktion der Transponierten zuzip(*s)
. Dies führt dazu, dass alle Höhen von drei Scheiben einzelner Spalten summiert werden.Die unbenannte Funktion ruft die Hilfsfunktion auf, transponiert und ruft die Hilfsfunktion erneut für das Ergebnis auf und ermittelt dann das Minimum von jedem und das Minimum des Ergebnisses, durch das sie dann dividiert
9.
, um den Durchschnitt zu erhalten.quelle
JavaScript (ES6),
1079896 BytesEine Funktion, die die Triplettsummen über die Zeilen berechnet und sich dann dazu aufruft, dasselbe über die Spalten zu tun und dabei den Minimalwert zu verfolgen
M
.JS ist ein bisschen wortreich für solche Sachen und es fehlt ein Eingeborener
zip()
Methode. Ich habe ziemlich viel Zeit gebraucht, um nur ein Dutzend Bytes gegenüber einem naiveren Ansatz zu sparen. (Möglicherweise gibt es jedoch eine kürzere Methode.)Nicht rekursive Version, 103 Bytes
2 Bytes mit Hilfe von Neil gespeichert
Testfälle
Code-Snippet anzeigen
quelle
(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
, obwohl ich denke, mein erster Versuch war tatsächlich größer als das.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 BytesProbieren Sie es online!
Erläuterung
quelle
Haskell , 87 Bytes
Probieren Sie es online!
quelle