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


21

당신은 주어진하고 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

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


또한 연속적인 행과 열이 아닌 도전에 도전하는 것도 흥미로울 것입니다
Luis Mendo

아니요, 직접 진행하십시오 :-)
Luis Mendo

수학 또는 데이터 유형 의미에서 정수 를 의미 합니까? 즉, 정수 부동 소수점 행렬을 취할 수 있습니까?
Dennis

수학적 감각. 그것이 내가 여기에 배운 한 가지, 그것은 당신이 다양한 언어로 데이터 유형 ...에 대한 가정을 할 수 있다는 것입니다
스튜이 그리핀

단, 바이트를 절약합니다. 설명해 주셔서 감사합니다.
Dennis

답변:



11

젤리 , 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

1
아,> _ <물론 : D
Jonathan Allan

나는 많은 유용한 기능을 가지고 있기 때문에 ungolfed 젤리 버전에 관심이 있습니다.
J Atkin

1
+3\⁺€F÷9Ṃ몇 바이트를 절약합니다.
Dennis

@ 데니스 와우, 정말 +3\먼저 처리 하고 복제본은 +3\€? 그런 일이 일어나지 않기를 기대 함
마일

1
파서는 본질적으로 스택 기반입니다. \3+와 퀵 링크를 밀어 +3\, 다음,하여 퀵 링크 팝과 두 개의 사본을 밀어 맨 위의 사본을 아빠와 매핑 버전을 푸시합니다.
Dennis


8

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]

7

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

매우 매끄러운!
Greg Martin

5

파이썬 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 반복 가능 항목)을 가져 와서 왼쪽 위 모서리에있는 3x3 하위 행렬 의 평균의 최소값을 재귀 적으로 계산 하고 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를 반환 하므로 최소 하나 이상의 숫자와 하나 이상의 반복 가능한 값을 계산하면 항상 가장 낮은 숫자를 반환합니다.


3

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

1
나는 []그들이 일치 하는 모습을 좋아하지만 실제로는 그렇지 않습니다.
Lynn

1
@Lynn 잠깐만 요, 옳지 않습니다. J는 불균형이 여러 개인 시청자를 산만하게합니다. a [또는 |:)를 사용해야 함
miles

2

젤리 , 18 바이트

그들의 마일 의해 사용 된 바와 같이, 트릭 킥 않음 전체 첫번째 라인으로 대체 될 수있다 -에 n 현명한 부가로 감소 누적 사용하는, +3\(11).

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

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

모든 인접한 하위 목록을 탐색하고 길이가 3 인 항목 만 유지하는 필터와 벡터 (합계)는 각 결과 목록에 대해 반복되며, 3 x 3 개의 하위 행렬의 합계를 가져 와서 마지막으로 하나의 목록으로 병합합니다. 9 (이 최소 합계를 만드는 요소 수)로 나눕니다.


필터링 하위 목록 아이디어가 마음에 듭니다. 해당 하위 목록 크기가 계산 된 값에 의존하는 경우 유용합니다.
마일



1

파이썬 2, 96 바이트

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.

Repl.it의 테스트 사례

리스트의리스트를 취하는 명명되지 않은 함수 a-행렬의 행.

도우미 함수 h는 세 개의 인접한 슬라이스를 압축하고 합계 함수를 zip(*s)각각 의 조옮김 전체에 매핑합니다 . 결과적으로 모든 높이의 단일 열 세 조각을 합산합니다.

명명되지 않은 함수는 도우미 함수를 호출하고 결과에서 도우미 함수를 다시 전치하여 호출 한 다음 각 결과의 최소값과 최소값을 찾은 다음 9.평균으로 나눕니다 .


1

자바 스크립트 (ES6), 107 98 96 바이트

행에서 삼중 항의 합을 계산 한 다음 열에 대해 동일한 작업을 수행하여 최소값을 추적하는 함수입니다 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는 그런 종류의 것들에 대해 조금 장황하며 기본 zip()방법 이 없습니다 . 보다 순진한 접근 방식으로 수십 바이트를 절약하는 데 많은 시간이 걸렸습니다. (그러나 더 짧은 방법이 존재할 수 있습니다.)

비 재귀 버전, 103 바이트

Neil의 도움으로 2 바이트 절약

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

테스트 사례


나는 순전히 순수한 접근 방식으로 할 수있는 최선은 113 바이트이기 때문에 소위 순진한 접근 방식에 다소 관심이 있습니다.(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 나는 그것이 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첫 번째 시도가 실제로 그것보다 더 크다고 생각하지만 그것이 가까운 것에 있다고 생각합니다.
Arnauld 2012

바이트를 면도 할 수 있었지만 좋았습니다 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

@ 닐 쿨. 이것은 하나 더 바이트를 저장할 수 있습니다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
Arnauld

1

05AB1E , 21 16 바이트

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

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

설명

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.