이웃 수가 가장 많은 숫자 찾기


12

도전

주어진 숫자의 격자 (10 <= N <= 99) 인접한 4 개의 숫자의 합이 가장 큰 리턴 숫자. 그것은 숫자의 위, 아래, 오른쪽 및 왼쪽의 숫자이지만 그 자체는 아닙니다.

  1. 숫자 자체는 계산되지 않으며 네 이웃 만 계산됩니다.
  2. 모서리의 숫자는 누락 된 숫자가 0 인 것처럼 처리 해야 합니다.
  3. 나는 동점을 피하기 위해 테스트를 설계 할 것입니다.
  4. 숫자는 반복되지 않습니다.
  5. 이것은 입니다.

주어진

56 98 32 96
12 64 45 31
94 18 83 71

반환

18

실제 테스트

주어진

98 95 67 66 57 16 40 94 84 37
87 14 19 34 83 99 97 78 50 36
18 44 29 47 21 86 24 15 91 61
60 41 51 26 10 58 11 62 55 71
42 85 56 12 46 81 93 65 49 77
89 13 74 39 54 76 92 33 82 90
96 88 70 79 80 28 25 20 75 68
38 63 17 72 53 48 73 30 45 69
64 35 32 31 23 43 22 52 27 59

반환

13

주어진

82 43 79 81 94 36 17 64 58
24 52 13 87 70 18 28 61 69
16 99 75 21 50 44 89 90 51
49 80 63 31 54 65 41 55 38
67 91 76 78 23 86 83 14 73
46 68 62 77 34 48 20 74 10
33 35 26 97 59 66 25 37 32
12 92 84 27 85 56 22 40 45
96 15 98 53 39 30 88 71 29
60 42 11 57 95 19 93 72 47

반환

15

1
" 모서리의 숫자는 누락 된 숫자가 0 인 것처럼 처리 될 있습니다. "-그리드의 모서리에서 숫자를 처리하는 방법을 선택할 수 있음을 의미합니다. 따라서 그리드의 다른 쪽을 감쌀 수 있습니까?
얽히고 설킨

@Shaggy No. 예상 결과가 변경 될 수 있습니다. 모두 같은 방식으로하자. 텍스트 업데이트 s / can / should /
Umbrella

2
피할 수없는 MATL 답변을 기다리는
14 분 39 초

대부분의 솔루션이 어떤 식 으로든 입력을 변경하는 것을 알 수 있습니다. 이것이 기존입니까? 내 (아직 게시되지 않은) 솔루션에는 입력을 변경하는 데 필요한 바이트가 포함되어 있으며 다른 많은 사람들이 그렇지 않은 이유가 궁금합니다.
우산

1
@Umbrella 일반적으로 입력이 수정되는지는 중요하지 않습니다. 깨끗한 코드가 아닌 짧은 코드에 관심이 있습니다. 출력이 옳다면 우리는 꽤 관대합니다.

답변:


9

MATL , 20 15 13 12 바이트

t1Y6Z+tuX>=)

Emigna 덕분에 5 바이트, Giuseppe 덕분에 2 바이트, Luis Mendo 덕분에 5 바이트를 절약했습니다.
온라인으로 사용해보십시오!

설명

t1Y6Z+tuX>=)
t                  Duplicate the (implicit) input.
 1Y6               Push the array [0 1 0; 1 0 1; 0 1 0].
    Z+             Convolve with the input.
       uX>         Get the maximum unique element...
      t   =        ... and compare elementwise.
           )       Index into the input.

6

APL (Dyalog Unicode) , 31 27 26 24 23 바이트 SBCS

Cows ck 덕분에 -2. ngn 덕분에 -1입니다.

익명의 암묵적 접두사 기능. 행렬을 인수로 사용합니다. 많은 시스템에서 기본값 인 ⎕IO( i ndex O rigin) 이라고 가정 0합니다.

{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,

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

, 입력을 라벨링 (평평하게)

{}⊃ 다음 기능의 결과에 따라 요소에서 요소를 선택하십시오.

⊢⍵ 인수를 산출 (분리형 3 3에서 )

 … ⌺3 3 각 3x3 이웃에 다음 기능을 적용하십시오.

  ⊢∘, 뾰족한 (평평한) 이웃을 위해 가장자리 정보를 무시하십시오

  () 다음의 암묵적 기능을 그들에게 적용하십시오

   -/ 교호 합 (lit. right-associative minus reduction)

   +/- 합계에서 그것을 빼십시오 (이것은 다른 모든 요소의 합계를 제공합니다)

, 라벨 (평평하게) (이웃은 합산)

 정렬 할 인덱스를 생성합니다

 첫 번째를 선택하십시오 (즉, 가장 높은 합계의 색인)


그것은 빠르다. 준비 되었습니까? ;)
우산

3
@Umbrella 아니요, 프로그래밍이 빠른 프로그래밍 언어를 사용합니다.
Adám

3
어때요 {⊃⍒,{+/1↓⍉4 2⍴⍵}⌺3 3⊢⍵}⊃,? 편집 : 또는 심지어{⊃⍒,{⊢/+⌿4 2⍴⍵}⌺3 3⊢⍵}⊃,
user41805

@Cowsquack 나는 항상 그 트릭을 잊어 버렸습니다.
Adám

2
-1 바이트 :{⊃⍒,(+/--/)⊢∘,⌺3 3⊢⍵}⊃,
ngn

5

젤리 , 22 바이트

;€0ZṙØ+SṖ
,ZÇ€Z+$/ŒMœị

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

MATL 및 Dyalog와 같은 컨볼 루션 내장 기능이 없음 언어를 잊어 버리면 컨볼 루션 내장 기능 (@dylnan 덕분에)이 아프지 만 부분적으로 ŒM및 덕분에 아무런 도움이되지 않습니다 œị. 먼저, 한 방향으로 이웃을 계산하는 도우미 함수는 우연히 입력을 바꿉니다.

;€0Z         Append a zero to each row, then transpose.
    ṙØ+S     Rotate by +1 and −1 (Ø+ = [1,-1]) and sum these.
        Ṗ    Pop the last row.

시각적으로 계산은 다음과 같습니다.

1 2 3   ;€0   1 2 3 0   Z   1 4 7   ṙØ+     2 5 8   0 0 0     S   2  5  8   Ṗ   2  5  8
4 5 6  ————→  4 5 6 0  ——→  2 5 8  ————→  [ 3 6 9 , 1 4 7 ]  ——→  4 10 16  ——→  4 10 16
7 8 9         7 8 9 0       3 6 9           0 0 0   2 5 8         2  5  8       2  5  8
                            0 0 0           1 4 7   3 6 9         4 10 16

해석 :이 결과의 셀 (x, y)은 셀 (y, x)의 수평 이웃의 합입니다. (예를 들어, 여기에서 f (A) [2,3] = 16 = 7 + 9 = A [3,1] + A [3,3] 입니다.)

그런 다음 주요 기능 :

,ZÇ€            Pair the input with its transpose and apply helper to both.
    Z+$/        Fold by Z+, i.e., turn [X,Y] into transpose(X)+Y.
                Now we've summed the horizontal and vertical neighbors for each cell.
        ŒM      Find the 2D index of the maximal value.
          œị    2D-index (into the original input).

1
무엇에 대해 æc?
dylnan

아, 나는 그것에 대해 몰랐다 :) 나는 골프를 너무 바빠서 그것을 사용하여 답변을 자유롭게 작성하십시오.
Lynn

5

젤리 , 18 바이트

5BæcµḊṖ)
ZÇZ+ÇŒMœị

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

도우미 함수는 각 행에서 각 요소의 이웃을 찾습니다. 주요 함수는 이것을 행에 수행하고 열은 최대 이웃 합계를 가진 요소를 찾습니다.

5BæcµḊṖ)
5B           bin(5): 1,0,1
  æc         Convolve with [[1,2,9],[other rows]] (for example): [[1,2,10,2,9],...]
    µ        New chain.
       )     Apply this to each element:
     Ḋ       Remove the first element.
      Ṗ      Remove the last element.
             Gives [[2,10,2],...]

ZÇZ+ÇŒMœị   
Z            Zip the matrix
 Ç           Apply helper function
  Z          Zip again. Yields the sum of the vertical neighbors of each element.
   +         Add:
    Ç        The sum of each element's horizontal neighbors.
     ŒM      Find the multidimensional index of the maximal element.
       œị    Index back into the original matrix.



2

스텐실 , 1 + 10 = 11 바이트 (비경쟁)

명령 줄 옵션 :  1 1 세대 계산

y⊃⍨⊃⍒,
+/N

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

y 편평 일본어 입력으로부터
⊃⍨ 선택
 첫
 내림차순으로
, 평탄화의를

+/
N 자아가없는 폰 뉴만 지역의  합


물론 이웃을 위해 하나의 문자가 내장 된 언어가 있습니다.
우산

1
공평하게, 그것의 유일한 목적은 이러한 종류의 문제 를 해결 하는 것 입니다.
Adám

경쟁이 아닌 이유는 무엇입니까?
Kevin Cruijssen

1
@KevinCruijssen 원래 입력에 더 쉽게 액세스해야한다는 것을 알았을 때 언어에 추가 y 했습니다. 그 전에는 (,⍎'input')대신에 글을 써야 했습니다 y.
Adám

1
@ Adám Ah 알았어, 그래, 그것은 실제로 경쟁이 아니다. 어제 도전 과제가 게시 된 것을 보지 못했습니다. 언어 (또는 언어 버전)가 더 최신 버전이므로 더 이상 경쟁이되지 않는 기존 과제라면 현재 메타에서는 더 이상 경쟁이되지 않습니다 .
Kevin Cruijssen

2

자바 스크립트 (ES6), 94 바이트

a=>a.map(p=m=(r,y)=>p=r.map((v,x)=>(s=~r[x-1]+~p[x]+~(a[y+1]||0)[x]+~r[x+1])>m?v:(m=s,o=v)))|o

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

어떻게?

대신 네 이웃의 합계의 최대를 찾고, 우리는 최소 찾아 m이야 자신의 한 보완의. 이를 통해 다음과 같이 정의되지 않은 값을 0과 같이 처리 할 수 ​​있습니다.

~undefined === -1
~0 === -1

내부 map () 은 행 r 의 내용을 변경하지 않는 방식으로 작성됩니다 . 따라서 다음 반복에서 상위 이웃을 테스트하기 위해 결과를 p 에 저장할 수 있습니다 .

우리는 사용:

  • ~r[x-1] 왼쪽 셀
  • ~r[x+1] 올바른 세포를 위해
  • ~p[x] 최고 세포를 위해
  • ~(a[y+1]||0)[x] 하단 셀


1

자바 8, 187 바이트

m->{int r=0,l=m.length,i=l,L,j,S=0,s;for(;i-->0;)for(L=j=m[i].length;j-->0;)if((s=(i<1?0:m[i-1][j])+(i<l-1?m[i+1][j]:0)+(j<1?0:m[i][j-1])+(j<L-1?m[i][j+1]:0))>S){S=s;r=m[i][j];}return r;}

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

설명:

m->{                           // Method with integer-matrix parameter and integer return
  int r=0,                     //  Result-integer, starting at 0
      l=m.length,              //  Amount of rows
      i=l,                     //  Rows index integer
      L,                       //  Amount of columns
      j,                       //  Column index integer
      S=0,                     //  Largest sum of four cells
      s;                       //  Current sum of four cells
  for(;i-->0;)                 //  Loop over the rows
    for(L=j=m[i].length;j-->0;)//   Inner loop over the columns
      if((s=                   //    Set the current sum to: the sum of:
           (i<1?0:m[i-1][j])   //     Value of the cell to the left, or 0 if out of bounds
          +(i<l-1?m[i+1][j]:0) //     Value of the cell to the right, or 0 if out of bounds
          +(j<1?0:m[i][j-1])   //     Value of the cell down, or 0 if out of bounds
          +(j<L-1?m[i][j+1]:0))//     Value of the cell up, or 0 if out of bounds
         >S){                  //    If this current sum is larger than the largest sum:
        S=s;                   //     Replace the largest sum with this current sum
        r=m[i][j];}            //     And set the result to the current cell
  return r;}                   //  Return the result

1

자바 스크립트 ES6, 170 바이트

c=g=>{s=0;n=0;f=m=>m||[];for(i=0;i<g.length;i++)for(j=0;j<g[i].length;j++){s=~~f(g[i-1])[j]+~~f(g[i+1])[j]+~~f(g[i])[j-1]+~~f(g[i])[j+1];b=s>n?g[i][j]+!(n=s):b;}return b}

1
PPCG에 오신 것을 환영합니다! 코드는 입력이라는 변수에 저장되어 있다고 가정하는 것 같다 g , 허용되지 않습니다 . 입력을 읽는 전체 프로그램이나 함수 (JS에서는 일반적으로 선호되는 방식)를 작성해야합니다.
Arnauld

1
@Arnauld 감사합니다! 나는 코드를 수정했다
Jean-Philippe Leclerc

테스트하기 쉽도록 TIO 링크 추가를 고려할 수 있습니다 . (주석에 링크를 맞추기 위해 두 번째 테스트 사례를 제거했습니다.)
Arnauld
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.