Trả về chỉ số hàng xóm trong lưới 3x3


11

Được rồi, nỗ lực thứ hai của tôi tại một sân golf mã, hãy xem điều này diễn ra như thế nào.

Giả sử bạn có một mảng gồm 9 giá trị. Bây giờ hãy tưởng tượng mảng đó trong một lưới 3x3.

Bạn cần trả về hàng xóm số đó có chỉ mục của mảng.

0 | 1 | 2

3 | 4 | 5

6 | 7 | số 8

Quy tắc:

  • Đó là mã golf, vì vậy câu trả lời ngắn nhất sẽ thắng.
  • Chỉ mục của mảng giả vờ có thể bắt đầu từ 0 hoặc 1. (tất cả các ví dụ sử dụng 0)
  • Chỉ cần trả về các giá trị giá trị được tán thành (như if 3: return 046)
  • Việc gửi có thể chỉ là một thủ tục / hàm / phương thức, nhưng một ví dụ sẽ rất hay
  • Giá trị được trả về có thể theo bất kỳ thứ tự nào (như nếu đầu vào bằng 0 thì có thể là 13 hoặc 31)
  • nếu bạn muốn, đầu ra có thể là một danh sách các số, ví dụ [0,4,6]thay vì046
  • các đường chéo không được tính, như các ví dụ đã thấy.

Ví dụ:

đầu vào:

0

đầu ra:

13

đầu vào:

3

đầu ra:

046

đầu vào:

4

đầu ra:

1357


4
Có vẻ như thử thách này có thể được hưởng lợi từ một thời gian trong Sandbox . Bạn có thể đăng thử thách của mình lên đó để người khác có thể xem xét và giúp bạn giải quyết vấn đề đó trước khi đăng lên chính. Từ ví dụ của bạn, tôi đoán bạn không tính đường chéo. Bạn có thể muốn thêm điều này vào chính câu hỏi. Bạn cũng đề cập đến yêu cầu để xuất các chỉ mục của mảng là hàng xóm. Tôi nghĩ rằng điều này chỉ có thể được mã hóa cứng cho lưới 3x3. Nó sẽ có thể tốt hơn để đầu ra hàng xóm?
Chọc

7
Chỉ để bạn biết, nhíu mày thực sự không phải là thứ chúng tôi làm ở đây; mã hóa đầu ra được cho phép hoặc không. Vì thường khá khó để xác định chính xác những gì được tính là mã hóa cứng, cá nhân tôi chỉ cho phép nó hoặc cung cấp kích thước lưới như một đầu vào bổ sung.
Dennis

1
Đầu ra có thể là một danh sách các số, ví dụ [0,4,6]thay vì 046?
Laikoni

@Laikoni Vâng, hơi muộn một chút vì bạn đã trả lời rồi.
hcorion

@Dennis Có, tôi không chắc chắn làm thế nào để đặt nó. Tôi thích cách các câu trả lời của C và python đã làm điều đó, bằng cách cung cấp cả hai, nhưng có câu trả lời không mã hóa là cuối cùng. Tôi muốn khuyến khích các thuật toán thay vì mã hóa cứng, nhưng tôi không chắc liệu nó có khả thi hay không (không có câu trả lời quá dài) và tôi không muốn không có câu trả lời cho câu hỏi của mình.
hcorion

Câu trả lời:


2

Thạch , 16 13 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Trạng thái quy tắc: "Chỉ mục của mảng giả vờ có thể bắt đầu từ 0 hoặc 1." - bạn có thể thả Decrement vào cuối.
steenbergh

@steenbergh Tôi giả sử tôi cũng phải nhận đầu vào dựa trên 1, chi phí sẽ tiết kiệm được nhiều byte.
Dennis

9

MATL , 17 16 byte

9:qWIe1Y6Z+i)BPf

Mảng dựa trên 1, có nghĩa là chứa các số từ 1đến 9.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Hãy xem xét đầu vào 2là một ví dụ.

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
Wat? Làm thế nào bạn đến với điều này?
Robert Fraser

1
@RobertFraser Những thách thức về việc tìm kiếm hàng xóm luôn gợi ý cho tôi một cách tiếp cận tích chập. Nhưng tích chập vốn đã bổ sung các giá trị của hàng xóm, vì vậy tôi cần có thể tách chúng ra ở cuối --- đó là phần mở rộng quyền lực của hai và nhị phân
Luis Mendo

5

Toán học, 32 byte

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

Sử dụng một biểu đồ thay vì một mảng. GridGraph@{3,3}xây dựng một biểu đồ hình lưới 3x3, được hiển thị bên dưới, mà Mathicala gắn nhãn một cách hữu ích với các số 1 L9 cho các đỉnh theo mặc định. Sau đó ~AdjacencyList~#&cho bạn biết hàng xóm của một đỉnh.

Biểu đồ lưới 3x3


Phải yêu những người xây dựng đó ...
Neil

4

Toán học, 40 byte

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

1 chỉ mục. Chỉ cần nhìn lên câu trả lời. Ai đó có thể làm tốt hơn trong Mathicala?


3
Tôi ngạc nhiên rằng không có nội dung nào cho việc này. Giống như tôi mong đợi sẽ có một nội dung để tìm tất cả hàng xóm của một phần tử trong mảng 2D, nhưng tôi không chắc chắn, tôi không biết gì về Mathicala ngoài việc nó có quá nhiều nội dung.
HyperNeutrino

2
Bạn có thể lưu một byte bằng cách sử dụng lập chỉ mục 0 và 31[420,51,...,75][[#]]&.
Martin Ender

1
Bạn có thể sử dụng GridGraph@{3,3}~AdjacencyList~#&cho 32 byte, với chỉ mục 1.
Không phải là một cây

@ lanlock4 Tuyệt vời! Hãy làm cho nó một câu trả lời để tôi có thể nâng cao nó!
Greg Martin

4

Octave, 42 40 39 byte

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

Chỉ số dựa trên 1.

Xác nhận tất cả các trường hợp thử nghiệm.

Giải trình:

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.

Thí dụ: n = 2

x =

   0   0   0
   1   0   0
   0   0   0

(Trong dữ liệu Octave được lưu trữ theo cột.)

d =

   1.00000   1.41421   2.23607
   0.00000   1.00000   2.00000
   1.00000   1.41421   2.23607

chỉ số logic trong đó khoảng cách là 1:

d == 1

 1   0   0
 0   1   0
 1   0   0

find(d ==1)

 1
 3
 5


2

Haskell , 74 71 68 byte

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]

Hãy thử trực tuyến! Sử dụng lưới 1 chỉ mục. Ví dụ sử dụng: f 3trả về [2,6].

Chỉnh sửa: Đã lưu 3 6 byte nhờ Ørjan Johansen!


Đối với 77 75 byte, hàm sau hoạt #động với kích thước lưới tùy ý 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]

Hãy thử trực tuyến! Đối với mỗi ndanh sách [n-m,n-1,n+1,n+m]chứa tất cả bốn hàng xóm. Đối với mỗi mục xtrong danh sách này, chúng tôi kiểm tra -1<xx<m*mđể đảm bảo xkhông nằm trên hoặc dưới lưới, mod n 3>0||n-1/=xđể thực thi đường viền lưới bên trái và mod(n+1)m>0||n+1/=xcho đường viền bên trái.


1
Bạn có thể sử dụng [n-3,n-1..n+3]gcd 3n>1.
Ørjan Johansen

Rất tiếc, đừng bận tâm đến gcdphần đó . Nó nên có được <3, và sau đó phá vỡ cho n==0. Bạn thể sử dụng thủ thuật đó nếu bạn thay đổi mọi thứ thành 1-exexed.
Ørjan Johansen

Oh, và n/=2&&n/=5có thể được thay thế bởi mod x 3>0. (Hoặc gcdphiên bản với reindexing, hiện có thể được sử dụng hai lần.)
Ørjan Johansen

2

Ruby , 51 48 45 byte

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

Hãy thử trực tuyến!

Tạo 2 mảng, với các hàng xóm dọc và ngang, sau đó chọn một hoặc nhiều trong số chúng.

Ruby mã hóa cứng, 44 byte

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

... Không đáng


2

C, 100 92 91 83 78 74 byte

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 chỉ mục. Cảm ơn @Neil vì đã lưu 4 byte.

Hãy thử trực tuyến!

Phiên bản mã hóa cứng, 56 byte

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

Chỉ số 0


2
Trong phiên bản đầu tiên, bạn có thể không viết n>3&&p(n-3)vv để lưu 4 byte không? Trong phiên bản thứ hai, bạn không thể viết l[]=để lưu một byte?
Neil

@Neil Có tôi có thể. Cảm ơn!
Steadybox

Bạn có chắc là mã của bạn hiện đang chính xác? Khi tôi thử các trường hợp thử nghiệm, nó thất bại cho cả ba ..: S Hãy thử ở đây. Có lẽ bạn có thể cung cấp một liên kết TIO hoạt động, có lẽ tôi đang làm gì đó sai?
Kevin Cruijssen

1
@KevinCruijssen Đã thêm liên kết TIO và dường như tôi đã quên chỉnh sửa mã thực tế trong lần chỉnh sửa cuối cùng ... Ồ, tốt. Liên kết của bạn cũng hoạt động chính xác, nhưng lưu ý rằng câu trả lời của tôi là 1 chỉ mục trong khi các trường hợp kiểm tra ví dụ là 0 chỉ mục.
Steadybox

@Steadybox Ah, bạn thực sự đúng. Tôi đã bỏ lỡ phần 1 chỉ mục, xấu của tôi. Cảm ơn đã thêm TIO. +1
Kevin Cruijssen

1

Python 2, 51 byte

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

Dựa trên phiên bản trước của câu trả lời Ruby của tôi , tôi thấy nó thú vị bởi vì nó chủ yếu là cùng một mã, sử dụng một thủ thuật khác và tạo ra kết quả tương tự. Làm cho điều này đúng giúp tôi chơi golf câu trả lời nhiều hơn một chút.

Về cơ bản, ruby ​​có nó ngắn hơn vì chỉ số mảng được bao gồm, python cần một phần +1bù.

Giải trình

Lấy 2 mảng (hàng xóm dọc và ngang), sau đó chọn một hoặc cả hai dựa trên một số tính toán.


1

Java 7, 63 byte (mã hóa cứng)

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

Được lập chỉ mục 0
(Đầu ra thứ tự đảo ngược vì 024046không phải là số nguyên hợp lệ.)
Vẫn hoạt động trên phiên bản không được mã hóa cứng, nhưng tôi có thể đảm bảo với bạn rằng nó sẽ không ngắn hơn ..

Hãy thử nó ở đây.


82 byte

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

1 chỉ mục
dựa trên câu trả lời C của @Steadybox

Hãy thử nó ở đây.


0

JavaScript + lodash, 71 byte

f=a=>_.range(9).filter(b=>a>b?f(b).includes(a):[,1,,1][b-a]&&b%3|a%3<2)

0

Hàng loạt, 116 byte

@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

Chỉ số 0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.