Tìm hàng xóm của tế bào


20

... hoặc Vùng lân cận Moore hình xuyến

Với số nguyên dương h, wvà một số nguyên không âm i, quay trở lại tất cả các chỉ số xung quanh i.

Bạn phải giả sử một ma trận bao gồm các hhàng của wcác phần tử, được đánh số từ thấp nhất, ở góc trên bên trái, đến cao nhất, ở góc dưới bên phải và trả về, ở bất kỳ định dạng hợp lý nào, một danh sách các chỉ mục sẽ bao quanh chỉ số , i. Ma trận này là một hình xuyến (một bản đồ vô hạn bao bọc xung quanh mỗi cạnh).

Ví dụ: đầu vào h=4w=4, sẽ dẫn đến ma trận:

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

nhưng cụ thể hơn:

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

để nếu iđược 0, bạn cần quay lại 15, 12, 13, 3, 1, 7, 4, 5(dựa trên 0).

Ví dụ

Dựa trên 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

Dựa trên 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

Quy tắc

  • Câu trả lời của bạn có thể là 0 hoặc 1 chỉ mục, sự lựa chọn của bạn, vui lòng ghi rõ.
  • Bạn có thể giả sử rằng i < h * w(hoặc i <= h * wcho câu trả lời 1 chỉ mục).
  • Bạn có thể giả sử rằng i >= 0(hoặc i > 0cho câu trả lời 1 chỉ mục).
  • Thứ tự của các giá trị được trả về không quan trọng miễn là chỉ bao gồm tám giá trị mong muốn.
  • Sơ hở tiêu chuẩn bị cấm .
  • Đây là vì vậy câu trả lời ngắn nhất, trong mỗi ngôn ngữ, sẽ thắng!

Cảm ơn @Conor O'Brien cho tiêu đề âm thanh kỹ thuật hơn và @ngm cho nhiều trường hợp thử nghiệm hơn!


3
Chúng tôi có thể trả lại ma trận 3 nhân 3 của hàng xóm không?
Adám

@ Adám Tôi muốn danh sách này không bao gồm ô trung tâm nếu có thể. Nhưng đánh giá cao đã có câu trả lời. Có đủ dễ dàng để lọc ra điều này?
Dom Hastings

Có vấn đề gì không?
Robert Fraser

@RobertFraser Đặt hàng không quan trọng. Tôi sẽ thêm nó vào các quy tắc.
Dom Hastings

@DomHastings Tôi diễn giải nhận xét đó là: không được phép trả về ma trận 3 nhân 3 hay bao gồm ô trung tâm?
JungHwan Min

Câu trả lời:


8

JavaScript (ES6), 75 byte

Đã lưu 2 byte nhờ @KevinCruijssen

Mong đợi một chỉ số dựa trên 0.

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

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

Các chỉ số xung quanh được trả về theo thứ tự sau:

54362701

Làm sao?

Các chỉ số của mỗi ô xung quanh tại được cho bởi: ( x + d x , y + d y )tôidx,dy(x+dx,y+dy)

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

Trong đó là chỉ số của ô đích.N=wy+x

Chúng tôi đi qua danh sách và trừ đi để nhận giá trị của , điều này mang lại:1 d x[1,2,2,2,1,0,0,0]1dx

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

Đối với các giá trị tương ứng của , chúng tôi sử dụng cùng một danh sách được dịch chuyển bởi 2 vị trí, cung cấp cho: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*wtiết kiệm 2 byte bằng cách loại bỏ một cặp dấu ngoặc đơn.
Kevin Cruijssen

@KevinCruijssen Bắt đẹp. Cảm ơn!
Arnauld

6

APL (Dyalog Classic) , 27 byte

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

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

{ }là một hàm với các đối số (kích thước h w) và (chỉ mục i)

⍳3 3là một ma trận của tất cả các số ternary 2 chữ số: 0 0, 0 1, ...,2 2

, mở rộng ma trận như một vector

1↓4⌽loại bỏ phần tử trung tâm 1 1bằng cách xoay 4 sang trái ( 4⌽) và thả một ( 1↓)

1- trừ đi 1, cho tất cả 8 lần bù trừ hàng xóm

( áp dụng đào tạo hàm trong ngoặc đơn cho mỗi offset

⍺⊤⍵mã hóa cơ sở của - tọa độ của trong ma trận

(⍺⊤⍵)-⊢ trừ phần bù hiện tại, cho tọa độ của hàng xóm

⍺|là mod ađể bọc xung quanh tọa độ và nằm trong ma trận

⍺⊥ giải mã từ cơ sở


5

APL (Dyalog Unicode) , 40 byte SBCS

Hàm infix ẩn danh. Đưa ra h wnhư đối số trái và inhư đối số phải.

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

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

{... } "DFN"; là đối số bên trái (kích thước) và là đối số bên phải (chỉ mục).

×/⍺ sản phẩm (nhân-giảm) của kích thước

 đầu tiên mà nhiều chỉ số

⍺⍴ sử dụng kích thước để r eshape mà

 kèm theo nó (để coi nó như là một yếu tố duy nhất)

(... ), thêm vào trước sau:

  ⍺⊤⍵ mã hóa chỉ mục trong hỗn hợp cơ số h w(điều này cho chúng ta tọa độ của chỉ mục)

  ¯1+ thêm một âm vào các tọa độ đó

⊖∘⍉/ giảm bằng cách xoay chuyển,
  điều này tương đương với y⊖⍉x⊖⍉Lv, tương đương với y⊖x⌽Lv, xoay vòng trái nhiều bước như ilệch sang phải (ít hơn một) và xoay lên nhiều bước như iđược bù xuống (ít hơn một), gây ra ma trận 3 nhân 3 mà chúng ta tìm kiếm ở góc trên cùng bên trái

 tiết lộ (vì việc giảm giảm vectơ thành vô hướng bằng cách bao quanh)

⍪⍨⍣2 xếp chồng lên nhau hai lần (chúng ta chỉ thực sự cần ba lần cho ma trận một hàng)

,⍨⍣2 nối vào chính nó hai lần (chúng ta chỉ thực sự cần ba lần cho ma trận một cột)

3 3↑ lấy ba hàng đầu tiên trong ba cột đầu tiên

Hai bước tiếp theo có thể được bỏ qua nếu trả về ma trận 3 nhân 3 là chấp nhận được:

, ravel (làm phẳng)

4⌽ xoay bốn bước còn lại (đưa phần tử trung tâm ra phía trước)

1↓ bỏ yếu tố đầu tiên


@ Adám sửa lỗi trên và rút ngắn nó : {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}, Tôi không chắc bạn có nên xóa phần tử ở giữa không: {4⌽1↓4⌽...}
ngn

@ngn Uh, đó là bản gốc. Bạn đăng bài đó!
Adám

@ Adám ok
ngn 18/07/18

Tôi không nghĩ rằng đầu ra dự kiến ​​sẽ có yếu tố trung tâm trong đó.
JungHwan Min

1
Trường hợp thử nghiệm cuối cùng vẫn có 8 yếu tố. Tôi nghĩ đầu ra dự định là in hàng xóm ở các vị trí tương đối[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
JungHwan Min


4

R , 125 111 108 byte

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]

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

14 và 8 byte được chơi bởi @JayCe và @Mark.

Đầu vào là [w, h], ibởi vì R điền cột mảng trước.

Làm cho mảng và sau đó "gấp ba" nó hàng và cột khôn ngoan. Sau đó xác định vị trí itrong mảng ban đầu và tìm vùng lân cận. Đầu ra không có i.


1
Bạn có thể lưu 14 byte . Tôi không biết rằng trong đó có một đối số Array.ind, đã học được điều gì đó ngày hôm nay!
JayCe

Bạn có thể lưu 8 byte bằng cách thay thế seq()bằng1:
Đánh dấu

3

PHP , 165 byte

Đây là "dựa trên 0". Phải có một giải pháp tốt hơn trong PHP, nhưng đây là điểm khởi đầu!

<?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;

Để chạy nó:

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

Thí dụ:

php -n cell_neighbours.php 4 5 1

Hoặc dùng thử trực tuyến!


3

K (ngn / k) , 27 24 byte

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

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

{ }là một hàm với các đối số x(kích thước h w) và y(chỉ mục i)

(!9)^40 1 2 3 4 5 6 7 8nếu không có sự4

3\ mã hóa trong ternary: (0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)

1-trừ đi 1, cho hàng xóm bù đắp:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)

x\yxmã hóa cơ sở của y- tọa độ của ytrong ma trận

- trừ đi mỗi phần bù, cho ta 8 cặp tọa độ lân cận

x!''là mod xcho mỗi tọa độ bao quanh để ở trong ma trận

x/giải mã từ cơ sở x- biến các cặp tọa độ thành các số nguyên đơn


Vì tò mò, biến thể K của bạn có trạng từ "đối số ngược", giống như của J ~không?
Conor O'Brien

1
@ ConorO'Brien Không ai trong số các ks mà tôi biết (Kx's K, Kona, oK, và của tôi) có nó, điều này thật đáng tiếc cho việc chơi golf. Chỉ có 6 trạng từ tích hợp: / \ '/: \:': và không có cơ chế nào do người dùng định nghĩa như vậy.
ngn

Tất nhiên tôi có thể thêm một trạng từ selfie, nhưng chơi golf không phải là kết thúc cho ngn / k, chỉ là một phương tiện để tích lũy các trường hợp thử nghiệm và kinh nghiệm.
ngn

Điều đó công bằng. Tất nhiên, bạn có thể xem nó như một thiếu sót tiềm năng của ngôn ngữ. Tôi đã sử dụng PPCG để giúp phát triển Attache và nhận ra Attache thiếu một số chức năng rất hữu ích mà nếu không tôi sẽ không bao gồm. Tôi không sử dụng K, nhưng có lẽ có những cách sử dụng khác có thể đảm bảo loại trạng từ đó?
Conor O'Brien

@ ConorO'Brien Tôi quen thuộc với APL giống như ~trong J và tôi tin chắc về tiện ích của nó, nhưng, bạn thấy đấy, k bị giới hạn ở ASCII có thể in và (hầu như) không có bản dịch, vì vậy, một trạng từ mới có nghĩa là sự hy sinh của một số nguyên thủy hữu ích khác cũng như không tương thích hơn giữa các triển khai. Tôi không thấy những gì tôi có thể thông qua để đưa cái này vào.
ngn 20/07/18

2

MATL , 24 byte

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

Đầu vào là h, w, i. Đầu ra là một vectơ hàng hoặc vectơ cột với các số.

Đầu vào ivà đầu ra là 1 dựa trên.

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

*     % 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

Mẻ, 105 byte

@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.

Chỉ số 0. Đã lưu 23 byte bằng cách đánh cắp thủ thuật modulo 3 của @ ChasBrown.



1

Sạch , 85 83 byte

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]]

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

Xử lý inhư một tọa độ (0 <= p < h, 0 <= q < w)và tạo ra các giá trị của các phần tử lân cận có giá trị p'w + q'.


1

Thạch , 20 byte

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

Một liên kết dyadic chấp nhận một danh sách các kích thước ở bên trái [h,w]và ô là một số nguyên ở bên phải, itạo ra một danh sách các vùng lân cận.

Lưu ý: thứ tự khác với thứ tự trong các ví dụ được phép trong OP

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

Làm sao?

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

Tùy viên , 66 byte

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

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

Tôi vẫn cần phải thực hiện MooresNMoore, nhưng tôi vẫn có Moorechức năng lặp như một chức năng lặp. Về cơ bản, Integers@@__2tạo ra một mảng số nguyên hình dạng __2(hai đối số cuối cùng) của các Prod[__2]số nguyên đầu tiên . Điều này cho chúng ta mảng mục tiêu. Sau đó, Moorelặp lại hàm {Push[a,_]}trên mỗi vùng lân cận kích thước Moore 1(đối số ngụ ý), với tùy chọn xoay vòng từng phần tử ( cycle->1). Điều này thêm từng khu phố vào mảng a. Sau đó, Flat[a@_]san phẳng _thành viên thứ của a, nghĩa là khu phố Moore tập trung xung quanh _(đối số đầu tiên). [0:3'5:8]có được tất cả các thành viên ngoại trừ trung tâm từ mảng phẳng này.

Giải pháp này, với bản cập nhật cho ngôn ngữ, sẽ trông giống như thế này (49 byte):

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

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.