Znajdź submatrix o najmniejszym środku

21

Otrzymujesz macierz liczb całkowitych n -m-m , gdzie n, m> 3 . Twoim zadaniem jest znalezienie podmacierzy 3 na 3 o najniższej średniej i wygenerowanie tej wartości.

Zasady i wyjaśnienia:

  • Liczby całkowite będą nieujemne
  • Opcjonalny format wejściowy i wyjściowy
  • Dane wyjściowe muszą być dokładne z dokładnością do co najmniej 2 miejsc po przecinku (jeśli nie jest liczbą całkowitą)
  • Podmacierze muszą składać się z kolejnych wierszy i kolumn

Przypadki testowe:

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

To jest więc wygrywa najkrótszy kod w każdym języku. Zachęcam ludzi do publikowania odpowiedzi w językach, które są już używane, nawet jeśli nie są one krótsze niż pierwszy.

Stewie Griffin
źródło
Interesujące byłoby również wyzwanie z niekoniecznie ciągłymi wierszami i kolumnami
Luis Mendo
Nie, śmiało :-)
Luis Mendo
Czy masz na myśli liczby całkowite w sensie matematycznym lub typu danych, tj. Czy możemy wziąć macierz całkowitych liczb zmiennoprzecinkowych?
Dennis
Sens matematyczny. Czy to jedna rzecz, której się tutaj nauczyłem, to to, że możesz przyjmować założenia dotyczące typów danych w różnych językach ...
Stewie Griffin
Słodko, to oszczędza bajt. Dzięki za wytłumaczenie.
Dennis

Odpowiedzi:

11

Galaretka , 11 9 bajtów

+3\⁺€F÷9Ṃ

Zaoszczędzono 2 bajty dzięki @ Dennis .

Wypróbuj online!

Wyjaśnienie

+3\⁺€F÷9Ṃ  Main link. Input: 2d matrix
+3\        Reduce overlapping sublists of size 3 by addition
   ⁺€      Repeat previous except over each row
     F     Flatten
      ÷9   Divide by 9
        Ṃ  Minimum
mile
źródło
1
Och,> _ <oczywiście: D
Jonathan Allan
Byłbym zainteresowany nieprzygotowaną wersją galaretki, ponieważ ma ona tak wiele przydatnych funkcji.
J Atkin
1
+3\⁺€F÷9Ṃoszczędza kilka bajtów.
Dennis
@Dennis Wow, czy to naprawdę przetwarzanie +3\najpierw, a duplikat jako +3\€? Nie spodziewałem się, że tak się stanie
mile
1
Analizator składni jest zasadniczo oparty na stosie; \wyskakuje 3i +przesuwa szybkie łącze +3\, wyskakuje szybkie łącze i przesuwa dwie kopie, a następnie wyskakuje najwyższą kopię i przesyła wersję mapowania.
Dennis
8

Oktawa, 38 bajtów

@(M)min(conv2(M,ones(3)/9,'valid')(:))
Rainer P.
źródło
8

MATL , 13 9 bajtów

3thYCYmX<

Port odpowiedzi @ rahnema1 .

Wypróbuj online!

Jak to działa

Rozważ wejście

[100 65  2 93;
   3 11 31 89;
  93 15 95 65;
  77 96 72 34]

jako przykład.

3th   % Push [3 3]
      % STACK: [3 3]
YC    % Input matrix implicitly. Convert 3x3 sliding blocks into columns
      % STACK: [100   3  65  11;
                  3  93  11  15;
                 93  77  15  96;
                 65  11   2  31;
                 11  15  31  95;
                 15  96  95  72;
                  2  31  93  89;
                 31  95  89  65;
                 95  72  65  34]
Ym    % Mean of each column
      % STACK: [46.1111 54.7778 51.7778 56.4444]
X<    % Minimum of vector. Display implicitly
      % STACK: [46.1111]
Luis Mendo
źródło
7

Mathematica, 37 35 bajtów

Dzięki @MartinEnder za 2 bajty!

Min@BlockMap[Mean@*Mean,#,{3,3},1]&

Wyjaśnienie

Min@BlockMap[Mean@*Mean,#,{3,3},1]&
    BlockMap[                    ]&  (* BlockMap function *)
                        #            (* Divide the input *)
                          {3,3}      (* Into 3x3 matrices *)
                                1    (* With offset 1 *)
             Mean@*Mean              (* And apply the Mean function twice to
                                        each submatrix *)
Min                                  (* Find the minimum value *)
JungHwan Min
źródło
Bardzo, bardzo zręczny!
Greg Martin
5

Python 2 , 93 81 80 79 bajtów

f=lambda M:M[2:]and min(sum(sum(zip(*M[:3])[:3],()))/9,f(M[1:]),f(zip(*M)[1:]))

Wypróbuj online!

Jak to działa

f jest funkcją rekurencyjną, która pobiera listę krotek (lub dowolną inną iterowalną dwuwymiarową iterowalną reprezentującą macierz M ) i rekurencyjnie oblicza minimum średniej podmacierzy 3 × 3 w lewym górnym rogu i f stosuje rekurencyjnie do M bez pierwszy wiersz i M bez pierwszej kolumny.

f(M) wykonuje następujące czynności.

  • Jeśli M ma mniej niż trzy wiersze, M[2:]jest pustą listą, która zwraca f .

    Zauważ, że ponieważ n> 3 w pierwszym uruchomieniu, inicjał nie może zwrócić pustej listy.

  • Jeśli M ma trzy wiersze lub więcej, M[2:]jest niepuste, a zatem zgodne z prawdą, więc kod po prawej stronie andzostanie wykonany, zwracając minimum trzy następujące wartości.

    min(sum(sum(zip(*M[:3])[:3],()))/9

    M[:3]zwraca pierwsze trzy wiersze M , zip(*...)transponuje wiersze i kolumny (uzyskując listę krotek), sum(...,())konkatenuje wszystkie krotki (działa to, ponieważ +jest konkatenacją) i sum(...)/9oblicza średnią z wynikowej listy dziewięciu liczb całkowitych.

    f(M[1:])

    rekurencyjnie stosuje f do M z usuniętym pierwszym rzędem.

    f(zip(*M)[1:])

    transponuje wiersze i kolumny, usuwa pierwszy wiersz wyniku (więc pierwsza kolumna M i rekurencyjnie stosuje f do wyniku.

Zauważ, że poprzednio usunięta warstwa w wywołaniu rekurencyjnym zawsze będzie wierszem, więc testuj, czy M ma wystarczającą liczbę wierszy, zawsze będzie wystarczające.

Wreszcie można się spodziewać, że powrót niektórych rekurencyjnych połączeń []będzie problemem. Jednak w Pythonie 2 , za każdym razem, gdy n jest liczbą, a A jest iterowalną, porównanie n < Azwraca True , więc obliczenie minimum jednej lub więcej liczb i jednej lub więcej iteracji zawsze zwróci najniższą liczbę.

Dennis
źródło
3

J , 21 bajtów

[:<./@,9%~3+/\3+/\"1]

Wypróbuj online!

Właściwym sposobem działania na podtablicach w J jest użycie trzeciej ( _3) formy cięcia, ;.gdzie x (u;._3) yoznacza zastosowanie czasownika una każdej pełnej podtablicy rozmiaru xtablicy y. Rozwiązanie, które wymaga tylko 1 bajtu więcej, ale będzie znacznie wydajniejsze na większych tablicach.

[:<./@,9%~3 3+/@,;._3]

Wypróbuj online!

Wyjaśnienie

[:<./@,9%~3+/\3+/\"1]  Input: 2d array M
                    ]  Identity. Get M
                  "1   For each row
              3  \       For each overlapping sublist of size 3
               +/          Reduce by addition
          3  \         For each overlapping 2d array of height 3
           +/            Reduce by addition
       9%~             Divide by 9
[:    ,                Flatten it
  <./@                 Reduce by minimum
mile
źródło
1
Podoba mi się, jak []wyglądają, że są do siebie dopasowane, ale tak naprawdę nie są.
Lynn
1
@ Lynn Poczekaj chwilę, to nie w porządku. J ma odwracać uwagę widzów za pomocą wielu niezrównoważonych nawiasów. Powinienem użyć a [lub |:)
mil
2

Galaretka , 18 lat bajtów

Brakowało trik, stosowany przez mil na ich odpowiedź , z użyciem n-mądry kumulują zmniejszyć dodania - cała pierwsza linia może być zastąpiony +3\przez 11.

ẆµL=3µÐfS€
ÇÇ€FṂ÷9

Wypróbuj online!

Przechodzi przez wszystkie sąsiednie podlisty, filtry, aby zachować tylko te o długości 3 i sumy (które wektoryzuje), a następnie powtarza się dla każdej wynikowej listy, aby uzyskać sumy wszystkich podmacierzy 3 na 3, a na koniec spłaszcza je w jedną listę, przyjmuje minimum i dzieli przez 9 (liczba elementów tworzących tę minimalną sumę).

Jonathan Allan
źródło
Podoba mi się pomysł filtrowania podlist. Przydatne, jeśli rozmiar podlisty zależał od obliczonej wartości.
mile
2

Pyth, 19 bajtów

chSsMsMs.:R3C.:R3Q9

Program, który pobiera dane z listy list i drukuje wynik.

Zestaw testowy

Jak to działa

[Wyjaśnienie nastąpi później]

TheBikingViking
źródło
1

Python 3 , 111 103 bajtów

lambda m,r=range:min(sum(sum(m[y+i][x:x+3])for i in r(3))/9for x in r(len(m[0])-3)for y in r(len(m)-3))

Wypróbuj online!

ovs
źródło
1

Python 2, 96 bajtów

h=lambda a:[map(sum,zip(*s))for s in zip(a,a[1:],a[2:])]
lambda a:min(map(min,h(zip(*h(a)))))/9.

Przypadki testowe w Repl.it

Nienazwana funkcja zajmująca listę list, a- wiersze macierzy.

Funkcja pomocnika hprzesuwa się przez trzy sąsiednie wycinki i odwzorowuje funkcję sumy na transpozycję,zip(*s) każdego z nich. Powoduje to zsumowanie wszystkich wysokości trzech plasterków pojedynczych kolumn.

Nienazwana funkcja wywołuje funkcję pomocnika, transponuje i ponownie wywołuje funkcję pomocnika w wyniku, a następnie znajduje minimum każdego z nich i minimum wyniku, które następnie dzieli, 9.aby uzyskać średnią.

Jonathan Allan
źródło
1

JavaScript (ES6), 107 98 96 bajtów

Funkcja, która oblicza sumy trojaczków nad wierszami, a następnie wywołuje się, aby zrobić to samo w kolumnach, śledząc minimalną wartość M.

f=m=>m.map((r,y)=>r.map((v,x)=>M=(z[x<<9|y]=v+=r[x+1]+r[x+2])<M?v:M),z=[M=1/0])&&m[1]?f([z]):M/9

JS jest trochę gadatliwy dla tego rodzaju rzeczy i nie ma natywnego zip() metody. Zajęło mi sporo czasu, aby zaoszczędzić zaledwie kilkanaście bajtów dzięki bardziej naiwnemu podejściu. (Jednak prawdopodobnie istnieje krótsza metoda).

Wersja nierekurencyjna, 103 bajty

Zapisano 2 bajty za pomocą Neila

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

Przypadki testowe

Arnauld
źródło
Jestem trochę zainteresowany twoim tak zwanym naiwnym podejściem, ponieważ najlepsze, co mogłem zrobić z rozsądnie czystym podejściem, to 113 bajtów:(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
Neil
@Neil Myślę, że to było coś bliskiego 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, chociaż myślę, że moja pierwsza próba była większa.
Arnauld
Ładne, chociaż byłem w stanie zgolić bajt: 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.
Neil
@Neil Cool. Pozwala to zaoszczędzić jeszcze jeden bajt przy pomocym=>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
Arnauld
1

05AB1E , 21 16 bajtów

2FvyŒ3ùO})ø}˜9/W

Wypróbuj online!

Wyjaśnienie

2F         }       # 2 times do:
  v     }          # for each row in the matrix
   yŒ3ù            # get all sublists of size 3
       O           # reduce by addition
         )ø        # transpose matrix
            ˜      # flatten the matrix to a list
             9/    # divide each by 9
               W   # get the minimum
Emigna
źródło
1

Haskell , 87 bajtów

import Data.List
t(a:b:c:d)=a+b+c:t(b:c:d);t _=[]
s=(/9).minimum.(t=<<).transpose.map t

Wypróbuj online!

Roman Czyborra
źródło