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.