세포의 이웃 찾기


20

... 또는 토 로이드 무어 지역

을 감안할 때 양의 정수 h, w및 음수가 아닌 정수는 i, 주변 인덱스 모두를 반환 i.

왼쪽 상단에서 맨 아래, 맨 아래에서 맨 위로 번호가 매겨진 요소 의 h행으로 구성된 행렬을 가정하고 w합리적인 형식으로 적절한 색인 목록을 반환해야합니다. 색인을 둘러싸십시오 i. 이 행렬은 원환 체 (각 가장자리를 감싸는 무한대 맵)입니다.

예를 들어, 입력 h=4w=4매트릭스 될 것이다 :

 0  1  2  3 
 4  5  6  7
 8  9 10 11
12 13 14 15

그러나 더 구체적으로 :

15 12 13 14 15 12
 3  0  1  2  3  0
 7  4  5  6  7  4
11  8  9 10 11  8
15 12 13 14 15 12
 3  0  1  2  3  0

iwas 0인 경우 15, 12, 13, 3, 1, 7, 4, 5(0 기반) 을 반환해야합니다 .

0 기반 :

h   w   i       Expected result

4   4   5       0, 1, 2, 4, 6, 8, 9, 10
4   4   0       15, 12, 13, 3, 1, 7, 4, 5
4   5   1       15, 16, 17, 0, 2, 5, 6, 7
1   3   2       1, 2, 0, 1, 0, 1, 2, 0
1   1   0       0, 0, 0, 0, 0, 0, 0, 0

1 기반 :

h   w   i       Expected result

4   4   6       1, 2, 3, 5, 7, 9, 10, 11
4   4   1       16, 13, 14, 4, 2, 8, 5, 6
4   5   2       16, 17, 18, 1, 3, 6, 7, 8
1   3   3       2, 3, 1, 2, 1, 2, 3, 1
1   1   1       1, 1, 1, 1, 1, 1, 1, 1

규칙

  • 답변은 0 또는 1 색인 일 수 있습니다. 선택하십시오.
  • 당신은 i < h * w(또는 i <= h * w1- 인덱스 답변) 가정 할 수 있습니다 .
  • 당신은 i >= 0(또는 i > 01- 인덱스 답변) 가정 할 수 있습니다 .
  • 8 개의 원하는 값만 포함되어 있으면 반환 된 값의 순서는 중요하지 않습니다.
  • 표준 허점은 금지되어 있습니다.
  • 이것은 이므로 각 언어에서 가장 짧은 대답이 이깁니다!

더 기술적 인 사운드 타이틀을위한 @Conor O'Brien 과 더 많은 테스트 케이스를위한 @ngm 에 감사합니다 !


3
이웃별로 3x3 행렬을 반환해도됩니까?
Adám

@ Adám 가능한 경우 중앙 셀을 포함하지 않는 목록을 선호합니다. 그러나 이미 답변이 있음을 이해하십시오. 이것을 걸러 내기에 충분히 쉬운가?
Dom Hastings

주문이 중요합니까?
Robert Fraser

@RobertFraser 주문은 중요하지 않습니다. 규칙에 추가하겠습니다.
Dom Hastings

@DomHastings 나는 그 의견을 다음과 같이 해석합니다 : 3 x 3 행렬을 반환하거나 중앙 셀을 포함 할 수 없습니까?
JungHwan Min

답변:


8

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

@KevinCruijssen 덕분에 2 바이트 절약

0 기반 인덱스를 예상합니다.

(h,w,i)=>[...'12221000'].map((k,j,a)=>(i+w+~-k)%w+~~(i/w+h+~-a[j+2&7])%h*w)

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

주변 지수는 다음 순서로 반환됩니다.

5462701

방법?

에서 각 주변 셀 의 인덱스 는 다음과 같습니다. ( x + d x , y + d y )나는엑스,와이(엑스+엑스,와이+와이)

Idx,dy=((x+dx)modw)+w((y+dy)modh)=((N+dx)modw)+w((Nw+dy)modh)

여기서 는 대상 셀의 인덱스입니다.N=wy+x

리스트 를 살펴보고 을 빼서 값을 얻습니다 .1 d x[1,2,2,2,1,0,0,0]1dx

[0,1,1,1,0,1,1,1]

의 해당 값 에 대해 2 개의 위치만큼 이동 된 동일한 목록을 사용합니다.dy

[1,1,0,1,1,1,0,1]

w*(~~(i/w+h+~-a[j+2&7])%h)~~(a[j+2&7]-1+i/w+h)%h*w한 쌍의 괄호를 제거하여 2 바이트 를 절약합니다.
Kevin Cruijssen

@KevinCruijssen 좋은 캐치. 감사!
Arnauld

6

APL (Dyalog Classic) , 27 바이트

{(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-14⌽,⍳3 3}

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

{ }인수가있는 함수 (차원 h w) 및 (인덱스 i)

⍳3 3모든 2 자리 숫자 원계의 행렬이다 : 0 0, 0 1, ...,2 2

, 행렬을 벡터로 참여시킵니다

1↓4⌽중심 요소를 제거 1 1왼쪽 (4 회전시킴으로써 4⌽() 및 하나의 적하 1↓)

1- 1에서 빼서 모든 이웃 오프셋을 제공합니다.

( 각 오프셋에 괄호 안의 함수 트레인을 적용합니다.

⍺⊤⍵의 기본 인코딩입니다 - 행렬 의 좌표

(⍺⊤⍵)-⊢ 이웃의 좌표를 제공하여 현재 오프셋을 뺍니다.

⍺|a좌표를 감싸고 행렬 내에 머 무르려면 mod입니다.

⍺⊥ 베이스에서 디코딩


5

APL (Dyalog Unicode) , 40 바이트 SBCS

익명의 접사 기능. 소요 h w왼쪽 인수로 및 i오른쪽 인자로.

{14⌽,3 3↑,⍨⍣2⍪⍨⍣2⊃⊖∘⍉/(¯1+⍺⊤⍵),⊂⍺⍴⍳×/⍺}

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

{} "dfn"; 왼쪽 인수 (차원)이고 오른쪽 인수 (인덱스)입니다.

×/⍺ 차원의 곱 (곱셈-감소)

 그 많은 지수의 첫 번째

⍺⍴ 상기 기준을 사용하여 (R)의 eshape 그

 묶음 (단일 요소로 취급하기 위해)

(), 다음을 추가하십시오.

  ⍺⊤⍵ 혼합 기수로 인덱스를 인코딩하십시오 h w(이것은 인덱스의 좌표를 제공합니다)

  ¯1+ 그 좌표에 음수를 더하다

⊖∘⍉/ 회전으로 줄임
  이것은 다음과 같습니다 y⊖⍉x⊖⍉. 이것은…에 해당합니다. y⊖x⌽i오른쪽으로 오프셋 만큼 많은 단계만큼 왼쪽으로 회전하고 i(낮은 것), 아래로 오프셋 만큼 많은 단계를 회전하여 (낮은 것) 왼쪽 상단에있는 3x3 행렬

 공개 (감소로 인해 벡터가 스칼라로 감소했기 때문에)

⍪⍨⍣2 두 번 자체 스택 (단일 행 행렬에는 세 번만 필요)

,⍨⍣2 두 번 추가하십시오 (단일 열 행렬에는 세 번만 필요합니다)

3 3↑ 처음 세 열의 처음 세 행을 가져 가라.

3x3 행렬 반환이 허용되는 경우 다음 두 단계를 생략 할 수 있습니다.

, 라벨 (평평하게)

4⌽ 4 단계 왼쪽으로 회전 (중앙 요소를 앞쪽으로 가져옴)

1↓ 첫 번째 요소를 삭제


@ Adám은 위의 내용을 수정하고 줄이십시오. {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}, 중간 요소도 제거해야할지 모르겠습니다. {4⌽1↓4⌽...}
ngn

@ ngn 어, 그것은 아주 독창적입니다. 당신은 그것을 게시합니다!
Adám

@ Adám ok
ngn

출력에 중심 요소가 있다고 생각하지 않습니다.
JungHwan Min

1
마지막 테스트 케이스에는 여전히 8 개의 요소가 있습니다. 의도 된 결과물은 이웃을 상대 위치에 인쇄하는 것이라고 생각합니다.[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
JungHwan Min


4

R , 125111108 바이트

function(x,i,m=array(1:prod(x),x),n=rbind(m,m,m),o=cbind(n,n,n),p=which(m==i,T)+x-1)o[p[1]+0:2,p[2]+0:2][-5]

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

@JayCe 및 @Mark가 14 및 8 바이트의 골프를 쳤다.

입력은 [w, h], iR이 배열 열을 먼저 채 웁니다.

배열을 만들고 행 및 열 방향으로 "트리플"합니다. 그런 다음 i원래 배열을 찾아 이웃을 찾으십시오. 없이 출력 i.


1
14 바이트 를 절약 할 수 있습니다 . 나는 arr.ind 논쟁이있는 것을 오늘 몰랐다!
JayCe

다음 으로 대체 하여 8 바이트 를 절약 할 수 있습니다.seq()1:
Mark

3

PHP , 165 바이트

이것은 "0 기반"입니다. PHP에는 더 나은 솔루션이 있어야하지만 이것이 출발점입니다!

<?list(,$h,$w,$i)=$argv;for($r=-2;$r++<1;)for($c=-2;$c++<1;)$r||$c?print(($k=(int)($i/$w)+$r)<0?$h-1:($k>=$h?0:$k))*$w+(($l=$i%$w+$c)<0?$w-1:($l>=$w?0:$l))%$w.' ':0;

그것을 실행하려면 :

php -n <filename> <h> <w> <i>

예:

php -n cell_neighbours.php 4 5 1

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


3

K (ngn / k) , 27 24 바이트

{x/x!''(x\y)-1-3\(!9)^4}

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

{ }인수가있는 함수 x(차원 h w) 및 y(인덱스 i)

(!9)^4이다 0 1 2 3 4 5 6 7 8를 빼고4

3\ 삼항으로 인코딩 : (0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)

1-에서을 빼서 1이웃 오프셋을 제공합니다.(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)

x\y의 기본 x인코딩입니다 y- y행렬 의 좌표

- 각 오프셋을 빼서 8 쌍의 이웃 좌표를 제공합니다

x!''개조되어 x각 - 랩 좌표 주위 머물 매트릭스 내에

x/밑으로부터 해독 x-좌표 쌍을 단일 정수로 변환


호기심에서, 당신의 K의 변종은 J와 같은 "역 주장"부사를 가지고 ~있습니까?
코너 오브라이언

1
@ ConorO'Brien 내가 아는 ks (Kx 's K, Kona, oK 및 mine) 중 어느 것도 골프를 타는 것은 불행한 일입니다. / \ '/ : \ :':에는 6 개의 내장 부사가 있습니다. 사용자 정의에 대한 메커니즘은 없습니다.
ngn

물론 셀카 부사를 추가 할 수 있지만 골프는 그 자체로 ngn / k의 끝이 아니며 테스트 사례와 경험을 축적하는 수단 일뿐입니다.
ngn

공정 해. 물론 언어의 잠재적 인 단점으로 볼 수 있습니다. 필자는 PPCG를 사용하여 Attache를 개발하는 데 도움을 주었으며, Attache에는 포함되지 않은 유용한 기능이 부족하다는 것을 깨달았습니다. 나는 K를 사용하지 않지만 아마도 그 유형의 부사를 ​​보증 할 수있는 다른 유스 케이스가 있습니까?
코너 오브라이언

@ ConorO'Brien 나는 J와 비슷한 APL에 익숙하고 ~그 유틸리티를 확신하지만 k는 인쇄 가능한 ASCII로 제한되며 (거의) digraphs가 없으므로 새로운 부사는 의미합니다. 다른 유용한 프리미티브의 희생뿐만 아니라 구현들 사이의 비 호환성. 나는 이것을 어떻게 넣을 수 있는지 알 수 없다.
ngn

2

MATL , 24 바이트

*:2Geti=&fh3Y6&fh2-+!Z{)

입력은 h, w, i. 결과는 숫자가있는 행 벡터 또는 열 벡터입니다.

입력 i및 출력은 1 기반입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

*     % Take two inputs implicitly. Multiply
      % STACK: 16
:     % Range
      % STACK: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
2G    % Push second input again
      % STACK: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16], 4
e     % Reshape with that number of rows, in column-major order
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16]
t     % Duplicate
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16]
i=    % Take third input and compare, element-wise
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [0 0 0 0; 0 1 0 0; 0 0 0 0; 0 0 0 0]
&f    % Row and column indices of nonzeros (1-based)
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], 2, 2,
h     % Concatenate horizontally
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2]
3Y6   % Push Moore mask
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1 1 1; 1 0 1; 1 1 1]
&f    % Row and column indices of nonzeros (1-based)
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1; 2; 3; 1; 3; 1; 2; 3], [1; 1; 1; 2; 2; 3; 3; 3] 
h     % Concatenate horizontally
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1 1; 2 1; 3 1; 1 2; 3 2; 1 3; 2 3; 3 3] 
2-    % Subtract 2, element-wise
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [-1 -1; 0 -1; 1 -1; -1 0; -1 0; -1 1; 0 1; 1 1] 
+     % Add, element-wise with broadcast
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 1; 2 1; 3 1; 1 2; 3 2; 1 3; 2 3; 3 3]
!     % Transpose
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 2 3 1 3 1 2 3; 1 1 1 2 2 3 3 3]
Z{    % Convert into a cell array of rows
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        {[1 2 3 1 3 1 2 3], [1 1 1 2 2 3 3 3]}
)     % Index. A cell array acts as an element-wise (linear-like) index
      % STACK: [1 2 3 5 7 9 10 11]


2

배치, 105 바이트

@for /l %%c in (0,1,8)do @if %%c neq 4 cmd/cset/a(%3/%2+%1+%%c/3-1)%%%1*%2+(%3%%%2+%2+%%c%%3-1)%%%2&echo.

인덱스가 0입니다. @ChasBrown의 모듈로 3 트릭을 훔쳐서 23 바이트를 절약했습니다.



1

클린 , 85 83 바이트

import StdEnv
r=(rem)
$h w i=tl[r(n+i/w)h*w+r(r(m+i)w)w\\n<-[0,1,h-1],m<-[0,1,w-1]]

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

i좌표로 취급 (0 <= p < h, 0 <= q < w)하고 값이있는 인접 요소의 값을 생성합니다 p'w + q'.


1

젤리 , 20 바이트

PRs©Ṫ{œi+€Ø-Ż¤ŒpḊœị®

왼쪽의 차원 목록 [h,w]과 오른쪽의 셀을 정수로 받아들이는 2 차원 링크 i는 이웃 목록을 생성합니다.

참고 : 순서는 OP에서 허용되는 예와 다릅니다.

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

방법?

PRs©Ṫ{œi+€Ø-Ż¤ŒpḊœị® - Link: [h,w], i
P                    - product -> h*w
 R                   - range -> [1,2,3,...,h*w]
    Ṫ{               - tail of left -> w
  s                  - split into chunks -> [[1,2,3,...w],[w+1,...,2*w],[(h-1)*w+1,...,h*w]]
   ©                 - ...and copy that result to the register
      œi             - multi-dimensional index of (i) in that list of lists, say [r,c]
             ¤       - nilad followed by link(s) as a nilad:
          Ø-         -   literal list -> [-1,1]
            Ż        -   prepend a zero -> [0,-1,1]
        +€           - addition (vectorises) for €ach -> [[r,r-1,r+1],[c,c-1,c+1]]
              Œp     - Cartesian product -> [[r,c],[r,c-1],[r,c+1],[r-1,c],[r-1,c-1],[r-1,c+1],[r+1,c],[r+1,c-1],[r+1,c+1]]
                Ḋ    - dequeue -> [[r,c-1],[r,c+1],[r-1,c],[r-1,c-1],[r-1,c+1],[r+1,c],[r+1,c-1],[r+1,c+1]]
                   ® - recall (the table) from the register
                 œị  - multi-dimensional index into (1-indexed & modular)

1

첨부 , 66 바이트

{a.=[]Moore[Integers@@__2,{Push[a,_]},cycle->1]Flat[a@_][0:3'5:8]}

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

여전히 Moores및 구현해야 NMoore하지만 여전히 Moore반복 함수 역할을하는 것을 가지고 있습니다. 기본적으로 첫 번째 정수 Integers@@__2의 모양 배열 __2(마지막 두 인수)의 정수 배열을 만듭니다 Prod[__2]. 이것은 우리에게 목표 배열을 제공합니다. 그런 다음 각 요소 ( ) 를 순환시키는 옵션을 사용하여 크기의 각 Moore 이웃 (함수 인수) Moore에서 함수 {Push[a,_]}를 반복합니다 . 이것은 각 이웃을 배열에 추가합니다 . 그리고, 평탄화 의 일 부재 는 무어 이웃을 중심으로, (제 인자). 이 평평한 배열에서 중심을 제외한 모든 멤버를 가져옵니다.1cycle->1aFlat[a@_]_a_[0:3'5:8]

언어를 업데이트 한이 솔루션은 다음과 같습니다 (49 바이트).

{Flat[NMoore[Integers@@__2,_,cycle->1]][0:3'5:8]}

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