... atau Lingkungan Toroidal Moore
Dengan bilangan bulat positif h
, w
dan bilangan bulat non-negatif i
, kembalikan semua indeks yang ada di sekitarnya i
.
Anda harus mengasumsikan matriks yang terdiri dari h
deretan w
elemen, 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=4
dan 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 i
itu 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
(ataui <= h * w
untuk jawaban yang diindeks 1). - Anda dapat menganggap itu
i >= 0
(ataui > 0
untuk jawaban yang diindeks 1). - Urutan nilai yang dikembalikan tidak penting asalkan hanya delapan nilai yang diinginkan dimasukkan.
- Celah standar dilarang .
- Ini adalah kode-golf 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!
Jawaban:
JavaScript (ES6), 75 byte
Disimpan 2 byte berkat @KevinCruijssen
Mengharapkan indeks berbasis 0.
Cobalah online!
Indeks sekitarnya dikembalikan dalam urutan berikut:
Bagaimana?
Indeks dari masing-masing sel di sekitarnya pada ( x + d x , y + d y ) diberikan oleh:sayadx , dy ( x + dx , y+ dy)
di mana adalah indeks sel target.N= w y+ x
Kami menelusuri daftar dan kurangi untuk mendapatkan nilai , yang memberikan:1 d x[ 1 , 2 , 2 , 2 , 1 , 0 , 0 , 0 ] 1 dx
Untuk nilai terkait , kami menggunakan daftar yang sama digeser oleh 2 posisi, yang memberikan:dy
sumber
w*(~~(i/w+h+~-a[j+2&7])%h)
untuk~~(a[j+2&7]-1+i/w+h)%h*w
menyimpan 2 byte dengan menyingkirkan sepasang tanda kurung.APL (Dyalog Classic) , 27 byte
Cobalah online!
{
}
adalah fungsi dengan argumen⍺
(dimensih w
) dan⍵
(indeksi
)⍳3 3
adalah matriks dari semua nomor terner 2 digit:0 0
,0 1
, ...,2 2
,
mendaftar matriks sebagai vektor1↓4⌽
menghapus elemen tengah1 1
dengan 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⍺|
moda
untuk membungkus koordinat dan tetap dalam matriks⍺⊥
menerjemahkan dari basis⍺
sumber
APL (Dyalog Unicode) , 40 byte SBCS
Fungsi infiks anonim. Dibawa
h
w
sebagai argumen kiri dani
sebagai argumen kanan.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-radixh
w
(ini memberi kita koordinat indeks)¯1+
tambahkan negatif ke koordinat tersebut⊖∘⍉/
kurangi dengan rotate-the-transposeini sama dengan
y⊖⍉x⊖⍉
... yang setara dengany⊖x⌽
... yang berputar ke kiri sebanyak langkahi
diimbangi ke kanan (kurang satu), dan berputar ke atas sebanyak langkah sepertii
diimbangi 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 pertamaDua 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 pertamasumber
{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}
saya tidak yakin apakah Anda juga harus menghapus elemen tengah:{4⌽1↓4⌽
...}
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
Python 2 ,
796966 byteCobalah online!
3 byte diberikan oleh Neil mencatat itu
(x*w)%(h*w)==((x)%h)*w==(x)%h*w
.Solusi 0-diindeks.
sumber
%h*w
menghemat 3 byte lebih*w%(h*w)
.R ,
125 111108 byteCobalah online!
14 dan 8 byte yang di-golf dengan @JayCe dan @Mark.
Input
[w, h], i
karena R mengisi kolom array terlebih dahulu.Membuat array dan kemudian "tiga kali lipat" menjadi baris dan kolom. Kemudian cari
i
di array asli dan temukan lingkungan itu. Keluaran tanpai
.sumber
seq()
dengan1:
PHP , 165 byte
Ini adalah "berbasis 0". Pasti ada solusi yang lebih baik di PHP, tetapi ini adalah titik awal!
Untuk menjalankannya:
Contoh:
Atau Coba online!
sumber
K (ngn / k) ,
2724 byteCobalah online!
{
}
adalah fungsi dengan argumenx
(dimensih w
) dany
(indeksi
)(!9)^4
adalah0 1 2 3 4 5 6 7 8
tanpa4
3\
mengkodekan dalam ternary:(0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)
1-
kurangi dari1
, berikan offset tetangga:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)
x\y
adalah basis-x
pengkodeany
- koordinaty
dalam matriks-
kurangi setiap offset, beri kami 8 pasang koordinat tetanggax!''
modx
untuk setiap - bungkus koordinat agar tetap berada dalam matriksx/
decode dari basisx
- mengubah pasangan koordinat menjadi bilangan bulat tunggalsumber
~
?⍨
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.MATL , 24 byte
Input
h
,w
,i
. Outputnya adalah vektor baris atau vektor kolom dengan angka.Input
i
dan output berbasis 1.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Bahasa Wolfram (Mathematica) , 74 byte
Cobalah online!
Mengambil input secara terbalik (
i, w, h
), berbasis 0.Matriks 3x3 dengan sel tengah di dalamnya, (60 byte)
Mengambil (
w, h, i
), 1 berbasis.Cobalah online!
sumber
Batch, 105 byte
Diindeks 0. Disimpan 23 byte dengan mencuri Trik modulo 3 @ ChasBrown.
sumber
MATL, 24 byte
Cobalah di MATL Online
Mengambil input
[w h]
dani
. 8 byte inidicuri tanpa malu-malu karenaterinspirasi oleh jawaban Luis Mendos, meskipun pendekatan keseluruhannya berbeda.sumber
Bersih ,
8583 byteCobalah online!
Memperlakukan
i
sebagai koordinat(0 <= p < h, 0 <= q < w)
, dan menghasilkan nilai-nilai elemen yang berdekatan di mana nilainyap'w + q'
.sumber
Jelly , 20 byte
Tautan diad menerima daftar dimensi di sebelah kiri
[h,w]
,, dan sel sebagai bilangan bulat di sebelah kanani
,, yang menghasilkan daftar lingkungan.Catatan: urutannya berbeda dengan yang ada dalam contoh yang diizinkan di OP
Cobalah online!
Bagaimana?
sumber
Attache , 66 byte
Cobalah online!
Saya masih perlu menerapkan
Moores
danNMoore
, tetapi saya masih memilikiMoore
yang berfungsi sebagai fungsi iterasi. Pada dasarnya,Integers@@__2
membuat array bentuk integer__2
(dua argumen terakhir) dariProd[__2]
integer pertama . Ini memberi kita array target. Kemudian,Moore
iterates fungsi{Push[a,_]}
atas setiap lingkungan ukuran Moore1
(argumen tersirat), dengan opsi untuk siklus setiap elemen (cycle->1
). Ini menambahkan setiap lingkungan ke arraya
. Kemudian,Flat[a@_]
ratakan_
anggota ke-5a
, 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):
sumber
Kotlin , 88 byte
Menggunakan indeks berbasis nol dan menghasilkan daftar 8 elemen.
Cobalah online!
sumber