Temukan Tetangga Sel

20

... atau Lingkungan Toroidal Moore

Dengan bilangan bulat positif h, wdan bilangan bulat non-negatif i, kembalikan semua indeks yang ada di sekitarnya i.

Anda harus mengasumsikan matriks yang terdiri dari hderetan welemen, yang dinomori dari terendah, di sudut kiri atas, hingga tertinggi, di sudut kanan bawah, dan mengembalikan, dalam format apa pun yang masuk akal, daftar indeks yang akan mengelilingi indeks i,. Matriks ini adalah torus (peta tanpa batas yang membungkus di setiap tepi).

Misalnya, input h=4dan w=4, akan menghasilkan matriks:

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

tetapi lebih khusus:

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

jadi jika iitu 0, Anda harus kembali 15, 12, 13, 3, 1, 7, 4, 5(berbasis 0).

Contohnya

Berbasis 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

Berbasis 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

Aturan

  • Jawaban Anda mungkin 0 atau 1-diindeks, pilihan Anda, mohon jelaskan.
  • Anda dapat menganggap itu i < h * w(atau i <= h * wuntuk jawaban yang diindeks 1).
  • Anda dapat menganggap itu i >= 0(atau i > 0untuk jawaban yang diindeks 1).
  • Urutan nilai yang dikembalikan tidak penting asalkan hanya delapan nilai yang diinginkan dimasukkan.
  • Celah standar dilarang .
  • Ini adalah sehingga jawaban tersingkat, dalam setiap bahasa, menang!

Terima kasih kepada @Conor O'Brien untuk judul yang terdengar lebih teknis dan @ngm untuk lebih banyak test case!

Dom Hastings
sumber
3
Bisakah kita mengembalikan matriks tetangga 3-kali-3?
Adám
@ Adám Saya lebih suka daftar tidak menyertakan sel tengah jika memungkinkan. Tapi hargai sudah ada jawaban. Apakah cukup mudah untuk memfilter ini?
Dom Hastings
Apakah pesanan itu penting?
Robert Fraser
@RobertFraser Order tidak penting. Saya akan menambahkannya ke aturan.
Dom Hastings
@HomHastings Saya menafsirkan komentar itu sebagai: tidak diperbolehkan untuk mengembalikan 3 oleh 3 matriks atau termasuk sel pusat?
JungHwan Min

Jawaban:

8

JavaScript (ES6), 75 byte

Disimpan 2 byte berkat @KevinCruijssen

Mengharapkan indeks berbasis 0.

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

Cobalah online!

Indeks sekitarnya dikembalikan dalam urutan berikut:

54362701

Bagaimana?

Indeks dari masing-masing sel di sekitarnya pada ( x + d x , y + d y ) diberikan oleh:Idx,dy(x+dx,y+dy)

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

di mana adalah indeks sel target.N=wy+x

Kami menelusuri daftar dan kurangi untuk mendapatkan nilai , yang memberikan:1 d x[1,2,2,2,1,0,0,0]1dx

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

Untuk nilai terkait , kami menggunakan daftar yang sama digeser oleh 2 posisi, yang memberikan:dy

[1,1,0,1,1,1,0,1]
Arnauld
sumber
w*(~~(i/w+h+~-a[j+2&7])%h)untuk ~~(a[j+2&7]-1+i/w+h)%h*wmenyimpan 2 byte dengan menyingkirkan sepasang tanda kurung.
Kevin Cruijssen
@KevinCruijssen Tangkapan yang bagus. Terima kasih!
Arnauld
6

APL (Dyalog Classic) , 27 byte

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

Cobalah online!

{ }adalah fungsi dengan argumen (dimensi h w) dan (indeks i)

⍳3 3adalah matriks dari semua nomor terner 2 digit: 0 0, 0 1, ...,2 2

, mendaftar matriks sebagai vektor

1↓4⌽menghapus elemen tengah 1 1dengan memutar 4 ke kiri ( 4⌽) dan menjatuhkan satu ( 1↓)

1- kurangi dari 1, berikan semua 8 offset tetangga

( menerapkan fungsi train dalam tanda kurung untuk setiap offset

⍺⊤⍵adalah basis- pengkodean - koordinat dalam matriks

(⍺⊤⍵)-⊢ kurangi offset saat ini, berikan koordinat tetangga

⍺|mod auntuk membungkus koordinat dan tetap dalam matriks

⍺⊥ menerjemahkan dari basis

ngn
sumber
5

APL (Dyalog Unicode) , 40 byte SBCS

Fungsi infiks anonim. Dibawa h wsebagai argumen kiri dan isebagai argumen kanan.

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

Cobalah online!

{... } "dfn"; argumen kiri (dimensi) dan argumen kanan (indeks).

×/⍺ produk (pengurangan perkalian) dari dimensi

 yang pertama banyak indeks

⍺⍴ menggunakan dimensi untuk r eshape bahwa

 lampirkan (untuk memperlakukannya sebagai elemen tunggal)

(... ), tambahkan yang berikut:

  ⍺⊤⍵ encode indeks dalam mixed-radix h w(ini memberi kita koordinat indeks)

  ¯1+ tambahkan negatif ke koordinat tersebut

⊖∘⍉/ kurangi dengan rotate-the-transpose
  ini sama dengan y⊖⍉x⊖⍉... yang setara dengan y⊖x⌽... yang berputar ke kiri sebanyak langkah idiimbangi ke kanan (kurang satu), dan berputar ke atas sebanyak langkah seperti idiimbangi ke bawah (kurang satu), menyebabkan matriks 3-oleh-3 yang kami cari berada di sudut kiri atas

 mengungkapkan (karena pengurangan mengurangi vektor menjadi skalar dengan melampirkan)

⍪⍨⍣2 tumpukan di atas itu sendiri dua kali (kita hanya perlu tiga kali untuk matriks baris tunggal)

,⍨⍣2 tambahkan sendiri dua kali (kita hanya perlu tiga kali untuk matriks satu kolom)

3 3↑ ambil tiga baris pertama dari tiga kolom pertama

Dua langkah selanjutnya dapat dihilangkan jika mengembalikan matriks 3-oleh-3 dapat diterima:

, ravel (meratakan)

4⌽ putar empat langkah ke kiri (bawa elemen tengah ke depan)

1↓ drop elemen pertama

Adm
sumber
@ Adm perbaiki yang di atas dan persingkat:, {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}saya tidak yakin apakah Anda juga harus menghapus elemen tengah: {4⌽1↓4⌽...}
ngn
@ ngn Uh, itu cukup orisinal. Anda memposting itu!
Adám
@ Adám ok
ngn
Saya tidak berpikir output diharapkan memiliki elemen pusat di dalamnya.
JungHwan Min
1
Kasing uji terakhir masih memiliki 8 elemen. Saya pikir output yang dimaksudkan adalah untuk mencetak tetangga di posisi relatif[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
JungHwan Min
4

Python 2 , 79 69 66 byte

lambda h,w,i:[(i+q%3-1)%w+(i/w+q/3-1)%h*w for q in range(9)if q-4]

Cobalah online!

3 byte diberikan oleh Neil mencatat itu (x*w)%(h*w)==((x)%h)*w==(x)%h*w.

Solusi 0-diindeks.

Chas Brown
sumber
%h*w menghemat 3 byte lebih *w%(h*w).
Neil
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]

Cobalah online!

14 dan 8 byte yang di-golf dengan @JayCe dan @Mark.

Input [w, h], ikarena R mengisi kolom array terlebih dahulu.

Membuat array dan kemudian "tiga kali lipat" menjadi baris dan kolom. Kemudian cari idi array asli dan temukan lingkungan itu. Keluaran tanpa i.

ngm
sumber
1
Anda dapat menghemat 14 byte . Saya tidak tahu apa yang memiliki argumen arr.ind, belajar sesuatu hari ini!
JayCe
Anda dapat menyimpan 8 byte dengan menggantinya seq()dengan1:
Mark
3

PHP , 165 byte

Ini adalah "berbasis 0". Pasti ada solusi yang lebih baik di PHP, tetapi ini adalah titik awal!

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

Untuk menjalankannya:

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

Contoh:

php -n cell_neighbours.php 4 5 1

Atau Coba online!

Night2
sumber
3

K (ngn / k) , 27 24 byte

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

Cobalah online!

{ }adalah fungsi dengan argumen x(dimensi h w) dan y(indeks i)

(!9)^4adalah 0 1 2 3 4 5 6 7 8tanpa4

3\ mengkodekan dalam ternary: (0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)

1-kurangi dari 1, berikan offset tetangga:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)

x\yadalah basis- xpengkodean y- koordinat ydalam matriks

- kurangi setiap offset, beri kami 8 pasang koordinat tetangga

x!''mod xuntuk setiap - bungkus koordinat agar tetap berada dalam matriks

x/decode dari basis x- mengubah pasangan koordinat menjadi bilangan bulat tunggal

ngn
sumber
Karena penasaran, apakah varian K Anda memiliki kata keterangan "argumen terbalik", seperti huruf J ~?
Conor O'Brien
1
@ ConorO'Brien Tak satu pun dari ks yang saya tahu (Kx's K, Kona, oK, dan punyaku) memilikinya, yang sangat disayangkan untuk bermain golf. Hanya ada 6 kata keterangan bawaan: / \ '/: \:': dan tidak ada mekanisme untuk itu.
ngn
Tentu saja saya bisa menambahkan kata keterangan selfie, tetapi bermain golf bukanlah tujuan akhir untuk ngn / k, hanya sarana untuk mengumpulkan kasus dan pengalaman pengujian.
ngn
Itu adil. Tentu saja, Anda bisa melihatnya sebagai potensi kekurangan bahasa. Saya telah menggunakan PPCG untuk membantu mengembangkan Attache, dan telah menyadari bahwa Attache tidak memiliki beberapa fungsi yang sangat berguna yang seharusnya tidak saya sertakan. Saya tidak menggunakan K, tapi mungkin ada usecases lain yang mungkin menjamin jenis keterangan itu?
Conor O'Brien
@ ConorO'Brien Saya kenal di APL yang seperti ~di J dan saya yakin utilitasnya, tetapi, Anda tahu, k terbatas pada ASCII yang dapat dicetak dan (hampir) tanpa digraf, jadi, kata keterangan baru berarti pengorbanan dari beberapa primitif bermanfaat lainnya serta lebih banyak ketidakcocokan di antara implementasi. Saya tidak melihat apa yang saya bisa lalui untuk memasukkan ini.
ngn
2

MATL , 24 byte

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

Input h, w, i. Outputnya adalah vektor baris atau vektor kolom dengan angka.

Input idan output berbasis 1.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

*     % 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]
Luis Mendo
sumber
2

Bahasa Wolfram (Mathematica) , 74 byte

Mod[i=#;w=#2;Mod[i+#2,w]+i~Floor~w+w#&@@@{-1,0,1}~Tuples~2~Delete~5,1##2]&

Cobalah online!

Mengambil input secara terbalik ( i, w, h), berbasis 0.

Matriks 3x3 dengan sel tengah di dalamnya, (60 byte)

(Join@@(p=Partition)[Range[#2#]~p~#,a={1,1};3a,a,2a])[[#3]]&

Mengambil ( w, h, i), 1 berbasis.

Cobalah online!

JungHwan Min
sumber
2

Batch, 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.

Diindeks 0. Disimpan 23 byte dengan mencuri Trik modulo 3 @ ChasBrown.

Neil
sumber
2

MATL, 24 byte

X[h3Y6&fh2-+1GX\1Gw!Z}X]

Cobalah di MATL Online

Mengambil input [w h]dan i. 8 byte ini dicuri tanpa malu - malu karena terinspirasi oleh jawaban Luis Mendos, meskipun pendekatan keseluruhannya berbeda.

sundar - Pasang kembali Monica
sumber
1

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

Cobalah online!

Memperlakukan isebagai koordinat (0 <= p < h, 0 <= q < w), dan menghasilkan nilai-nilai elemen yang berdekatan di mana nilainya p'w + q'.

Suram
sumber
1

Jelly , 20 byte

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

Tautan diad menerima daftar dimensi di sebelah kiri [h,w],, dan sel sebagai bilangan bulat di sebelah kanan i,, yang menghasilkan daftar lingkungan.

Catatan: urutannya berbeda dengan yang ada dalam contoh yang diizinkan di OP

Cobalah online!

Bagaimana?

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)
Jonathan Allan
sumber
1

Attache , 66 byte

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

Cobalah online!

Saya masih perlu menerapkan Mooresdan NMoore, tetapi saya masih memiliki Mooreyang berfungsi sebagai fungsi iterasi. Pada dasarnya, Integers@@__2membuat array bentuk integer __2(dua argumen terakhir) dari Prod[__2]integer pertama . Ini memberi kita array target. Kemudian, Mooreiterates fungsi {Push[a,_]}atas setiap lingkungan ukuran Moore 1(argumen tersirat), dengan opsi untuk siklus setiap elemen ( cycle->1). Ini menambahkan setiap lingkungan ke array a. Kemudian, Flat[a@_]ratakan _anggota ke-5 a, yaitu, lingkungan Moore yang berpusat di sekitar _(argumen pertama). [0:3'5:8]dapatkan semua anggota kecuali bagian tengah dari susunan rata ini.

Solusi ini, dengan pembaruan bahasa, akan terlihat seperti ini (49 byte):

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

Kotlin , 88 byte

Menggunakan indeks berbasis nol dan menghasilkan daftar 8 elemen.

{h:Int,w:Int,i:Int->List(9){(w+i+it%3-1)%w+(h+i/w+it/3-1)%h*w}.filterIndexed{i,v->i!=4}}

Cobalah online!

JohnWells
sumber