평균이 가장 작은 하위 행렬 찾기 93

당신은 주어진하고 N 별 m 정수의 행렬 N, m> 3 . 당신의 작업은 발견하는 3- 바이 -3 최저 평균 및 출력이 값을 갖는 서브 매트릭스.

규칙 및 설명 :

  • 정수는 음이 아닙니다.
  • 선택적 입력 및 출력 형식
  • 출력은 소수점 이하 2 자리까지 정확해야합니다 (정수가 아닌 경우).
  • 하위 행렬은 연속적인 행과 열로 구성되어야합니다.

테스트 사례 :

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

이것은 이므로 각 언어에서 가장 짧은 코드가 승리합니다. 나는 사람들이 첫 번째보다 짧지 않더라도 이미 사용 된 언어로 답변을 게시하도록 권장합니다.



답변

옥타브, 30 바이트

@(A)min(mean(im2col(A,[3,3])))

온라인으로 사용해보십시오!


답변

젤리 , 11 9 바이트

+3\⁺€F÷9Ṃ

@ Dennis 덕분에 2 바이트를 절약했습니다 .

온라인으로 사용해보십시오!

설명

+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

답변

옥타브, 38 바이트

@(M)min(conv2(M,ones(3)/9,'valid')(:))

답변

MATL , 13 9 바이트

3thYCYmX<

@ rahnema1의 답변 포트 .

온라인으로 사용해보십시오!

작동 원리

입력 고려

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

예로서.

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]

답변

Mathematica, 37 35 바이트

2 바이트의 @MartinEnder에게 감사합니다!

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

설명

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

답변

파이썬 2 , 93 81 80 79 바이트

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

온라인으로 사용해보십시오!

작동 원리

f 는 튜플 목록 (또는 행렬 M 을 나타내는 다른 색인 가능한 2D 반복 가능 항목)을 가져 와서 왼쪽 위 모서리에있는 3×3 하위 행렬 의 평균의 최소값을 재귀 적으로 계산 하고 f 없이 M 에 재귀 적으로 적용되는 재귀 함수입니다. 첫 번째 행과 첫 번째 열이없는 M.

f(M) 다음을 수행합니다.

  • 경우 M은 세 개 미만의 행이, M[2:]빈리스트이며, f를 반환합니다.

    첫 번째 실행에서 n> 3 이므로 이니셜은 빈 목록을 반환 할 수 없습니다.

  • M 에 3 개 이상의 행이있는 경우 M[2:]비어 있지 않고 진실이므로 오른쪽의 코드 and가 실행되어 다음 3 개 값 중 최소값을 반환합니다.

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

    M[:3]처음 세 행 산출 M을 , zip(*...)전치 행 및 열 (튜플들의 목록을 수득)는 sum(...,())(때문 작품 모든 투플을 연결 한 +연결 임), 및 sum(...)/9아홉 개 정수 결과 목록의 평균을 계산한다.

    f(M[1:])

    첫 번째 행이 제거 된 상태 에서 M에 f 를 재귀 적으로 적용 합니다.

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

    행과 열을 전치하고 결과의 첫 번째 행을 제거하므로 ( M 의 첫 번째 열은 반복적으로 f 를 결과에 적용 합니다.

재귀 호출에서 이전에 제거 된 레이어는 항상 행이므로 M 에 충분한 행이 있는지 테스트하면 항상 충분합니다.

마지막으로 일부 재귀 호출 []이 문제가 될 것으로 예상 할 수 있습니다. 그러나 Python 2 에서 n 은 숫자이고 A 가 반복 가능할 때마다 비교 n < ATrue를 반환 하므로 최소 하나 이상의 숫자와 하나 이상의 반복 가능한 값을 계산하면 항상 가장 낮은 숫자를 반환합니다.


답변

J , 21 바이트

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

온라인으로 사용해보십시오!

J에서 하위 배열에 대해 작업하는 올바른 방법 은 배열 크기 의 전체 하위 배열마다 동사를 적용 하는 수단 _3인 세 번째 컷 형식 을 사용하는 것 입니다. 이를 사용하는 솔루션은 1 바이트 만 필요하지만 더 큰 배열에서는 훨씬 효율적입니다.;.x (u;._3) yuxy

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

온라인으로 사용해보십시오!

설명

[:<./@,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