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.


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

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

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]

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 *)

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ę.


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

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ę).


Podoba mi się pomysł filtrowania podlist. Przydatne, jeśli rozmiar podlisty zależał od obliczonej wartości.
— mile



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ą.


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.