Kebutuhan yang sangat umum dalam kelas algoritme dan ilmu komputer secara umum adalah untuk mengulangi 4 arah secara grid atau matriks (seperti dalam BFS atau DFS). Ini tampaknya sering menghasilkan banyak kode kikuk dan verbose dengan banyak aritmatika dan perbandingan dalam loop. Saya telah melihat banyak pendekatan berbeda dalam hal ini, tetapi saya tidak dapat menghilangkan perasaan bahwa ada cara yang lebih ringkas untuk melakukan ini.
Tantangannya adalah untuk menulis fungsi murni yang, mengingat lebar dan tinggi bidang hingga yang n, m
berasal dari titik (0,0)
, dan koordinat (x,y)
yang dapat mewakili titik yang valid di dalam bidang itu, mengembalikan objek yang dapat diubah dari semua titik di dalam pesawat yang arahnya 4 arah. berdekatan dengan(x,y)
.
Tujuannya adalah untuk mendefinisikan fungsi itu dalam sesedikit mungkin byte.
Beberapa contoh untuk membantu menggambarkan input / output yang valid:
n = 5 (y-axis), m = 3 (x-axis) (zero-based)
matrix = [
[A, B, C],
[D, E, F],
[G, H, I],
[J, K, L],
[M, N, O],
]
(x, y) => [valid iterable points]
E: (1, 1) => [(1, 0), (2, 1), (1, 2), (0, 1)]
A: (0, 0) => [(1, 0), (0, 1)]
L: (2, 3) => [(2, 2), (2, 4), (1, 3)]
N: (1, 4) => [(1, 3), (2, 4), (0, 4)]
n = 1 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
]
(x, y) => [valid iterable points]
A: (0, 0) => []
n = 2 (y-axis), m = 1 (x-axis) (zero-based)
matrix = [
[A],
[B],
]
(x, y) => [valid iterable points]
A: (0, 0) => [(0, 1)]
B: (0, 1) => [(0, 0)]
Dan inilah contoh (yang ini dengan Python) dari fungsi yang memenuhi persyaratan:
def four_directions(x, y, n, m):
valid_coordinates = []
for xd, yd in [(1, 0), (0, 1), (-1, 0), (0, -1)]:
nx, ny = x + xd, y + yd
if 0 <= nx < m and 0 <= ny < n:
valid_coordinates.append((nx, ny))
return valid_coordinates
Contoh di atas mendefinisikan fungsi bernama, tetapi fungsi anonim juga dapat diterima.
Input n, m, x, y
adalah semua bilangan bulat 32-bit yang tidak ditandatangani dalam rentang berikut:
n > 0
m > 0
0 <= x < m
0 <= y < n
Keluaran harus berbentuk iterable (namun bahasa pilihan Anda menentukan bahwa) dari (x, y) pasangan.
Klarifikasi tambahan:
Bilangan kompleks (dan representasi / serialisasi lainnya) boleh saja selama konsumen iterable dapat mengakses x
dan y
bilangan bulat hanya mengetahui lokasi mereka.
Indeks berbasis non-nol dapat diterima, tetapi hanya jika bahasa pilihan adalah bahasa non-nol-diindeks. Jika bahasa menggunakan campuran sistem penomoran, default ke sistem penomoran struktur data yang paling umum digunakan untuk mewakili sebuah matriks. Jika ini masih semua konsep asing dalam bahasa yang diberikan, indeks awal apa pun dapat diterima.
(x,y)
itu sendiri di dalam kotak, kan?Jawaban:
Python 2 , 66 byte
Cobalah online!
Sebutkan keempat tetangga, kemudian gunakan slicing daftar untuk menghapus yang out-of-bounds.
Python 2 , 71 byte
Cobalah online!
Alih-alih memeriksa yang mana dari empat tetangga yang terikat, kami melakukannya dengan cara yang lebih lambat untuk memeriksa semua poin yang terikat untuk yang bertetangga, yang memiliki jarak Euclidian tepat 1 dari
(x,y)
. Kami juga menggunakan trik div-mod klasik untuk beralih di atas kisi , menghemat kebutuhan untuk menulis dua loop sepertifor i in range(m)for j in range(n)
.Saya mencoba menggunakan aritmatika kompleks untuk menulis kondisi jarak, tetapi ternyata lebih lama untuk menulis
abs((k/n-x)*1j+k%n-y)==1
.Python 2 , 70 byte
Cobalah online!
sumber
Oktaf , 90 byte
Ini menggunakan pendekatan geometris: Pertama kita membuat matriks nol dengan ukuran yang diinginkan, dan mengatur a
1
ke lokasi yang diinginkan. Lalu kami berbelit-belit dengan kernelyang menghasilkan matriks baru dengan ukuran yang sama dengan yang ada di 4-tetangga dari titik aslinya. Kemudian kita
find()
indeks entri bukan nol dari matriks baru ini.Cobalah online!
konvolusi adalah kunci kesuksesan.
sumber
Bahasa Wolfram (Mathematica) , 42 byte
Cobalah online!
1-diindeks (yang mengikuti konvensi Mathematica untuk pengindeksan). Mengambil input sebagai
{x,y}, {m,n}
.untuk 0 / indeks I / O, 45 byte :
Cobalah online!
sumber
JavaScript (ES6), 74 byte
Pendekatan membosankan.
Cobalah online!
JavaScript (Node.js) , 74 byte
Kurang membosankan tapi sama panjangnya. Mengambil input sebagai
([h,w,x,y])
.Cobalah online!
JavaScript (V8) , 67 byte
Jika semua metode keluaran standar diizinkan, kami bisa mencetak koordinat yang valid dengan:
Cobalah online!
sumber
Jelly ,
1312 byteTautan diad menerima daftar dua (0-indeks) bilangan bulat di sebelah kiri
[row, column]
,, dan dua bilangan bulat di sebelah kanan[height, width]
,, yang menghasilkan daftar daftar bilangan bulat[[adjacent_row_1, adjacent_column_1], ...]
,.Cobalah online!
Bagaimana?
sumber
ḶṚƬ
denganṬ€
.2ḶṚƬNƬẎ
kembali[[0, 1], [1, 0], [0, -1], [-1, 0]]
, sementara2Ṭ€NƬẎ
kembali[[1], [0, 1], [-1], [0, -1]]
, dan, karena lajang dibungkus,+
hanya vektorisasi dengan elemen pertama⁸
untuk mereka, sehingga mereka bertindak seolah-olah elemen kedua mereka0
(identitas aditif). Akibatnya, hanya urutan output yang dapat berubah.Perl 6 ,
5649 byte-7 byte terima kasih kepada nwellnhof!
Cobalah online!
Menghapus elemen batas dengan memeriksa jika ketika dibagi dengan batas array itu adalah antara 0 dan 1. Membawa input dan output melalui bilangan kompleks di mana bagian nyata adalah
x
koordinat dan imajiner adalahy
. Anda dapat mengekstrak ini melalui.im
.re
fungsi dan .sumber
div
tampaknya tidak bekerja untukNum
s(*.reals>>.Int Zdiv@^b).none
atau(*.reals Z/@^b)>>.Int.none
akan bekerja tetapi pemain Int tampaknya terlalu mahal.J ,
302928 byteCobalah online!
Bagaimana:
m
xn
arg menjadi kisi-kisi bilangan kompleksj./&i./
j./
1=|@-
#~&,
+.@
sumber
C # (Visual C # Interactive Compiler) , 91 byte
Cobalah online!
Kalau tidak:
Cobalah online!
sumber
Arang , 29 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input dalam urutan x, y, lebar, tinggi. Penjelasan:
Cetak a
#
pada posisi yang disediakan.Lingkari persegi panjang yang diberikan.
Lompat ke posisi saat ini.
Jika ada yang berdekatan
#
maka simpan posisinya.Keluarkan posisi yang ditemukan di akhir loop.
Jawaban membosankan:
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Bekerja dengan menemukan posisi yang berdekatan secara matematis.
sumber
Haskell, 62 byte
Menggunakan
Cobalah online!
Pendekatan membosankan: 81 byte
sumber