3x3 그리드에서 이웃 인덱스 반환


11

코드 골프에 대한 두 번째 시도는 어떻게 진행되는지 봅시다.

9 값의 배열이 있다고 가정하십시오. 이제 3x3 그리드의 배열을 상상해보십시오.

해당 번호가 배열의 인덱스 인 이웃을 반환해야합니다.

0 | 1 | 2

3 | 4 | 5

6 | 7 | 8

규칙 :

  • 코드 골프이므로 최단 답변이 이깁니다.
  • 척 배열의 인덱스는 0 또는 1에서 시작할 수 있습니다 (모든 예제는 0을 사용합니다)
  • 그냥 값 값을 반환하는 것은 눈살을 찌푸리게한다 (같은 if 3: return 046)
  • 제출은 절차 / 함수 / 방법 일 수 있지만 예제는 좋을 것입니다
  • 반환 된 값은 임의의 순서 일 수 있습니다 (입력이 0 인 경우 13 또는 31 일 수 있음)
  • 당신이 원하는 경우, 출력은 예, 번호 목록이 될 수 [0,4,6]대신046
  • 예제에서 볼 수 있듯이 대각선은 계산되지 않습니다.

예 :

입력:

0

산출:

13

입력:

산출:

046

입력:

4

산출:

1357


4
이 문제는 샌드 박스 에서 어느 정도 시간이 걸리는 것처럼 보입니다 . 도전 과제를 게시하여 다른 사용자가 도전 과제를 검토하고 메인에 게시하기 전에 도움을 줄 수 있습니다. 귀하의 예에서 대각선을 세지 않는 것 같습니다. 이것을 질문 자체에 추가하고 싶을 수도 있습니다. 인접 배열의 인덱스를 출력해야한다는 요구 사항도 언급했습니다. 나는 이것이 3x3 그리드를 위해 하드 코딩 될 수 있다고 생각한다. 이웃 자체를 출력하는 것이 더 좋을까요?
Poke

7
아시다시피, 눈살을 찌푸리는 것은 우리가 여기서 하는 일 이 아닙니다. 출력 하드 코딩이 허용되거나 허용되지 않습니다. 일반적으로 하드 코딩으로 정확히 계산되는 것을 정의하는 것은 매우 어렵 기 때문에 개인적으로 허용하거나 그리드 크기를 추가 입력으로 지정합니다.
Dennis

1
출력이 숫자 [0,4,6]대신에 예를 들어 046?
Laikoni

@Laikoni 네, 이미 답변을했기 때문에 조금 늦었습니다.
hcorion

@Dennis 예, 어떻게 넣을 지 잘 모르겠습니다. 나는 C와 python이 두 가지를 모두 제공하지만 하드 코딩되지 않은 답변을 최종으로 사용하여 어떻게 대답했는지 좋아합니다. 하드 코딩이 아닌 알고리즘을 장려하고 싶었지만 (응답이 너무 길지 않은지) 확실하지 않았으며, 질문에 대한 답변을 원치 않았습니다.
hcorion

답변:


2

젤리 , 16 13 바이트

9Ḷ,d3ạ/S€=1T’

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

작동 원리

9Ḷ,d3ạ/S€=1T’  Main link. Argument: n (0, ..., 8)

9              Set the return value to 9.
 Ḷ             Unlength; yield [0, ..., 8].
  ,            Pair; yield [[0, ..., 8], n].
   d3          Divmod 3; yield [[[0, 0], ..., [2, 2]], [n:3, n%3]]].
     ạ/        Reduce by absolute difference, yielding
               [[|0 - n:3|, |0 - n%3|], ..., [[|2 - n:3|, |2 - n%3|]].
       S€      Sum each, yielding
               [|0 - n:3| + |0 - n%3|, ..., [|2 - n:3| + |2 - n%3|].
         =1    Compare the sums with 1.
           T   Truth; yield all 1-based indices of 1.
            ’  Decrement to yield all 0-based indices of 1.

규칙 상태 : "가장자리 배열의 인덱스는 0 또는 1에서 시작할 수 있습니다." -당신은 끝에 감소를 떨어 뜨릴 수 있습니다.
steenbergh

@ steenbergh 필자는 1 기반 입력을 가져와야한다고 가정합니다.
Dennis

9

MATL , 17 16 바이트

9:qWIe1Y6Z+i)BPf

이 배열은 1부터 시작 1합니다 9. 즉 에서 까지의 숫자가 포함 됩니다 .

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

설명

2예를 들어 입력 을 고려하십시오 .

9:q  % Push [0 1 2 ... 8]
     % STACK: [0 1 2 ... 8]
W    % Rise to 2, element-wise
     % STACK: [1 2 4 ... 256]
Ie   % Reshape as 3-row matrix (column-major order)
     % STACK: [1   8  64;
               2  16 128;
               4  32 256]
1Y6  % Push [0 1 0; 1 0 1; 0 1 0]
     % STACK: [1   8  64;
               2  16 128;
               4  32 256],
              [0   1   0;
               1   0   1;
               0   1   0]
Z+   % Convolution, maintaining size
     % STACK: [10  81 136;
               21 170 336;
               34 276 160]
i    % Take input, n
     % STACK: [10  81 136;
               21 170 336;
               34 276 160],
               2
 )   % Get n-th entry (1-based; column-major order)
     % STACK: 21
B    % Convert to binary
     % STACK: [1 0 1 0 1]
P    % Flip
     % STACK: [1 0 1 0 1]
f    % Find: gives indices of nonzeros. Implicitly display
     % STACK: [1 3 5]

1
왓? 이걸 어떻게 생각 해냈어?
Robert Fraser

1
@RobertFraser 이웃을 찾는 것에 대한 이러한 도전은 항상 나에게 컨볼 루션 접근법을 제안합니다. 그러나 컨볼 루션은 본질적으로 이웃의 가치를 더해 주므로, 끝에서 그것들을 분리 할 수 ​​있어야했습니다. 그것은 2의 힘과 2 진 확장 부분입니다
Luis Mendo

5

수학, 32 바이트

GridGraph@{3,3}~AdjacencyList~#&

배열 대신 그래프를 사용합니다. GridGraph@{3,3}아래에 표시된 3x3 격자 모양의 그래프를 생성합니다. Mathematica는 기본적으로 꼭지점에 대해 숫자 1-9로 레이블을 지정합니다. 그런 다음 ~AdjacencyList~#&정점의 이웃에게 알려줍니다.

3x3 그리드 그래프


그 내장을 사랑해야 ...
Neil

4

Mathematica, 40 바이트

{24,135,26,157,2468,359,48,579,68}[[#]]&

1- 색인. 답을 찾으십시오. Mathematica에서 누군가 더 잘할 수 있습니까?


3
나는 이것에 대한 내장이 없다는 것에 놀랐다. 2D 배열에서 요소의 모든 이웃을 찾을 수있는 내장 기능이있을 것으로 예상되지만 확실하지는 않지만 Mathematica에 너무 많은 내장 기능이 있다는 사실 외에는 아무것도 모른다.
HyperNeutrino

2
0- 인덱싱 및을 사용하여 바이트를 저장할 수 있습니다 31[420,51,...,75][[#]]&.
Martin Ender

1
GridGraph@{3,3}~AdjacencyList~#&1- 인덱싱과 함께 32 바이트에 사용할 수 있습니다 .
나무가 아님

@ lanlock4 굉장합니다! 답장을 보내려면 답변을 작성해주세요.
Greg Martin

4

옥타브, 42 40 39 바이트

@(n,x=~e(3),y=x(n)=1)find(bwdist(x)==1)

1 기반 색인.

모든 테스트 사례를 확인하십시오.

설명:

x=~e(3);         % create a 3*3 matrix of zeros
x(n)=1;          % set the element with index n to 1
d=bwdist(x);     % compute the distance transform of the matrix
find(d == 1)     % find where the distance is 1.

예: n = 2

x =

   0   0   0
   1   0   0
   0   0   0

옥타브에서 데이터는 열 단위로 저장됩니다.

d =

   1.00000   1.41421   2.23607
   0.00000   1.00000   2.00000
   1.00000   1.41421   2.23607

거리가 1 인 논리 인덱스

d == 1

 1   0   0
 0   1   0
 1   0   0

find(d ==1)

 1
 3
 5


2

하스켈 , 74 71 68 바이트

f n=[x|x<-[n-3,n-1..n+3],0<x,x<10,gcd 3x<2||n-1/=x,gcd 3n<2||n+1/=x]

온라인으로 사용해보십시오! 1- 인덱스 그리드를 사용합니다. 사용법 예 : f 3returns [2,6].

편집 : Ørjan Johansen 덕분에 3 6 바이트를 절약했습니다 !


들어 77 75 바이트, 다음 함수는 #임의의 격자 크기에 대한 작동합니다 m:

n#m=[x|x<-[n-m,n-1,n+1,n+m],0<x,x<=m*m,gcd x m<m||n-1/=x,gcd n m<m||n+1/=x]

온라인으로 사용해보십시오! n목록 [n-m,n-1,n+1,n+m]에는 네 개의 이웃이 모두 포함됩니다. x이 목록의 각 항목마다 왼쪽 격자 테두리와 왼쪽 테두리 를 적용하기 위해 격자 위 또는 아래에 있지 않은지 확인 -1<x하고 x<m*m확인 합니다.xmod n 3>0||n-1/=xmod(n+1)m>0||n+1/=x


1
[n-3,n-1..n+3]및 을 사용할 수 있습니다 gcd 3n>1.
Ørjan Johansen

죄송합니다 gcd. 그 부분 은 신경 쓰지 마십시오 . 그랬어 야 <3했고 휴식을 취했다 n==0. 모든 것을 -indexed로 변경하면 해당 트릭을 사용할 수 있습니다1 .
Ørjan Johansen 17

아, n/=2&&n/=5로 대체 할 수 있습니다 mod x 3>0. (또는 gcd재색 인화 버전, 이제 두 번 사용할 수 있음)
Ørjan Johansen

2

루비 , 51 48 45 바이트

->a{[a+3,a-3][a/6..a/3]+[a+1,a-1][a%-3..a%3]}

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

수직 및 수평 이웃이있는 2 개의 배열을 생성 한 후 하나 이상을 선택하십시오.

루비 하드 코드, 44 바이트

->a{%w(13 024 15 046 1357 248 37 468 57)[a]}

... 그럴 가치가 없어.


2

C, 100 92 91 83 78 74 바이트

p(n){putchar(n+48);}f(n){n>3&&p(n-3);n<7&&p(n+3);n%3&&p(n+1);--n%3&&p(n);}

1- 색인. 4 바이트를 절약 해 준 @Neil에게 감사합니다.

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

하드 코드 버전, 56 바이트

l[]={13,204,15,406,1357,248,37,468,57};
#define L(n)l[n]

0 인덱스


2
첫 번째 버전에서는 n>3&&p(n-3)4 바이트를 절약하기 위해 쓸 수 없습니까? 두 번째 버전에서는 l[]=바이트를 저장하기 위해 쓸 수 없습니까?
Neil

@ 닐 예 가능합니다. 감사!
Steadybox

코드가 현재 정확합니까? 테스트 케이스를 시도하면 세 가지 모두 실패합니다. : S 여기에서 시도하십시오. 작동하는 TIO 링크를 제공 할 수 있습니까? 아마 뭔가 잘못한 것입니까?
케빈 크루이 센

1
@KevinCruijssen TIO 링크가 추가되었으며 마지막 편집에서 실제 코드를 편집하는 것을 잊어 버린 것 같습니다 ... 오, 음. 귀하의 링크도 올바르게 작동하지만 내 답변은 1 인덱싱되지만 예제 테스트 사례는 0 인덱싱됩니다.
Steadybox

@Steadybox 아, 맞아요. 나는 1 인덱스 부분을 놓쳤다. TIO를 추가해 주셔서 감사합니다. +1
Kevin Cruijssen

1

파이썬 2, 51 바이트

lambda x:[x+3,x-3][x/6:x/3+1]+[x+1,x-1][x%-3:x%3+1]

내 이전 버전을 기반으로 Ruby 답변을 다른 코드를 사용하여 대부분 동일한 코드이고 동일한 결과를 생성하기 때문에 흥미로 웠습니다. 이것을 올바르게 얻는 것은 루비가 조금 더 골프를 치는 데 도움이되었습니다.

기본적으로 루비는 배열 슬라이스 인덱스를 포함하기 때문에 짧습니다. 파이썬에는 +1 . 보상 .

설명

두 배열 (수직 및 수평 이웃)을 얻은 다음 계산에 따라 하나 또는 둘 다를 선택하십시오.


1

Java 7, 63 바이트 (하드 코딩)

int c(int i){return new int[]{31,420,51,640,7531,842,73,864,75}[i];}

0 인덱스
(역순으로 출력하기 때문에 024하고 046유효한 정수되지 않습니다.)
아직도 비 하드 버전 작업을하지만, 나는 그것이 짧은되지 않습니다 말씀 드릴 수 있습니다 ..

여기에서 시도하십시오.


82 바이트

String c(int n){return""+(n>3?n-3:"")+(n<7?n+3:"")+(n%3>0?n+1:"")+(--n%3>0?n:"");}

1-indexed
기반 @Steadybox 'C 답변

여기에서 시도하십시오.



0

배치, 116 바이트

@set c=cmd/cset/a%1
@set/ar=%1%%3
@if %1 gtr 2 %c%-3
@if %r% gtr 0 %c%-1
@if %r% lss 2 %c%+1
@if %1 lss 6 %c%+3

인덱스가 0입니다.

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