Jika kita mengambil bilangan alami dan menggulungnya dengan jarum jam menjadi spiral, kita akan berakhir dengan spiral tak terbatas berikut ini:
....--57--56
|
36--35--34--33--32--31--30 55
| | |
37 16--15--14--13--12 29 54
| | | | |
38 17 4---3---2 11 28 53
| | | | | | |
39 18 5 0---1 10 27 52
| | | | | |
40 19 6---7---8---9 26 51
| | | |
41 20--21--22--23--24--25 50
| |
42--43--44--45--46--47--48--49
Mengingat beberapa angka dalam spiral itu, tugas Anda adalah menentukan tetangganya - artinya elemen di atas, kiri, kanan, dan di bawahnya.
Contoh
Jika kita melihat 27
kita dapat melihat bahwa ia memiliki tetangga berikut:
- atas:
28
- kiri:
10
- Baik:
52
- di bawah:
26
Jadi hasilnya adalah: [28,10,52,26]
Aturan
- Input akan berupa angka dalam format I / O standar apa pun
- Output akan menjadi daftar / matriks / .. dari 4 tetangga nomor itu dalam urutan (konsisten!) Apa pun
- Anda dapat bekerja dengan spiral yang dimulai dengan 1 bukannya 0, namun Anda harus menentukannya dalam jawaban Anda
Contohnya
Outputnya dalam format [above,left,right,below]
dan menggunakan spiral berbasis 0:
0 -> [3,5,1,7]
1 -> [2,0,10,8]
2 -> [13,3,11,1]
3 -> [14,4,2,0]
6 -> [5,19,7,21]
16 -> [35,37,15,17]
25 -> [26,24,50,48]
27 -> [28,10,52,26]
73 -> [42,72,74,112]
101 -> [100,146,64,102]
2000 -> [1825,1999,2001,2183]
1000000 -> [1004003,1004005,999999,1000001]
Jawaban:
R , 156 byte
Cobalah online!
round
dan menggunakancospi(x)/sinpi(x)
yang lebih tepat daripadacos(x*pi)/sin(x*pi)
dalam kasus setengah angka (0.5
,1.5
dll ...)Penjelasan:
Jika kita melihat koordinat matriks dari nilai-nilai tersebut, dengan mempertimbangkan nilai pertama yang
0
ditempatkanx=0, y=0
, mereka adalah:The
x
koordinat mengikuti urutan A174344 Oei dengan rumus rekursif:Rumus yang sama berlaku untuk
y
koordinat matriks, tetapi dengancos
bukannyasin
dan dinegasikan:Jadi, di R kita bisa menerjemahkan rumus ke fungsi ini, dengan mengambil
sinpi/cospi
sebagai parameter:dan kami menghasilkan dua vektor koordinat (kami tidak meniadakan koordinat y karena kami akan mendapatkan hasil yang sama, hanya dengan tetangga naik / turun terbalik):
Perhatikan bahwa kami telah menghasilkan
(n+2)^2
koordinat, yang lebih dari koordinat minimum yang diperlukan yang mengandung keduanyan
dan tetangganya (batas yang lebih ketat akan(floor(sqrt(n))+2)^2
tetapi sayangnya kurang "golf").Karena itu, sekarang kita memiliki semua koordinat, pertama-tama kita mencari koordinat yang
a,b
sesuai dengan kitan
:akhirnya kami memilih posisi tetangga mereka, yaitu:
where x == a and y == b+1 or b-1
where y == b and x == a+1 or a-1
menggunakan:
sumber
Perl 6 ,
9483 byte{my \ s = 0, | [+] flat ((1, i ... ) Zxx flat (1..Inf Z 1..Inf)); peta {pertama: k, s [$ _] + $ ^ d, s}, i, -1,1, -i}Cobalah online!
s
adalah daftar koordinat spiral yang malas dan tidak terbatas, direpresentasikan sebagai bilangan kompleks. Itu dibangun dari dua daftar tak terbatas lainnya:1, *i ... *
membuat daftar1, i, -1, -i ...
.1, 1.5 ... *
membuat daftar1, 1.5, 2, 2.5, 3, 3.5 ...
. Zipping dua daftar ini bersama-sama dengan daftar replikasi menghasilkan daftar langkah-langkah dari setiap spiral mengkoordinasikan ke yang berikutnya:1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i ...
. (Bagian fraksional dari argumen kanan ke operator replikasi daftar dibuang.) Melakukan pengurangan penambahan segitiga ([\+]
) pada daftar ini (dan menempelkan 0 ke depan) menghasilkan daftar koordinat spiral.Akhirnya, mulai dari bilangan kompleks
s[$_]
($_
menjadi satu-satunya argumen untuk fungsi), kita mencari indeks (first :k
) dalam spiral dari bilangan kompleks yang offset dari jumlah itu dengani
,-1
,1
, dan-i
.sumber
Brain-Flak , 238 byte
Cobalah online!
Output dalam urutan kiri, atas, kanan, bawah.
Penjelasan
sumber
MATL , 15 byte
Input dan output berbasis 1.
Outputnya memberikan tetangga kiri, bawah, atas dan kanan dalam urutan itu.
Cobalah online! Atau verifikasi semua kasus uji kecuali dua yang terakhir, yang waktunya habis pada TIO.
sumber
1YL
- MATLAB memilikispiral
fungsi? Kapan MATLAB berubah menjadi Mathematica ?!R , 172 byte
Cobalah online!
Ini R, jadi jelas jawabannya adalah 0-diindeks.
Sebagian besar pekerjaan adalah membuat matriks. Kode terinspirasi oleh: https://rosettacode.org/wiki/Spiral_matrix#R
sumber
JavaScript (ES6), 165 byte
Mencetak indeks dengan
alert()
.Cobalah online!
Bagaimana?
(diadaptasi dari jawaban ini dari math.stackexchange)
sumber
RangeError: Maximum call stack size exceeded
dan kesalahan pada konsol peramban:InternalError: too much recursion
. Apakah saya melakukan sesuatu yang salah?Python 2 ,
177164146144 byteCobalah online!
Menghitung
u,l,r,d
langsung darin
.sumber
PHP (> = 5.4), 208 byte
Untuk menjalankannya:
Contoh:
Atau Coba online!
Catatan:
-d error_reporting=0
opsi digunakan untuk pemberitahuan tidak keluaran / peringatan.Bagaimana?
Saya menghasilkan spiral dengan versi modifikasi dari jawaban ini dalam array 2 dimensi.
Saya memutuskan ukuran spiral berdasarkan input
n
dengan formula untuk selalu mendapatkan angka putaran tambahan dalam spiral (jaminan untuk keberadaan di atas / di bawah / kiri / kanan). Putaran angka ekstra berarti+2
tinggi dan+2
lebar array 2 dimensi.Jadi jika
n
akan ditempatkan di spiral dengan ukuran maksimum3*3
, maka spiral yang dihasilkan akan5*5
.Ukuran spiral adalah di
c*c
manac = ceil(sqrt(n)) + k
, jikaceil(sqrt(n))
ganjil, makak
adalah 2 dan jikaceil(sqrt(n))
genap, makak
adalah 3.Misalnya, rumus di atas akan menghasilkan ini:
n = 1
ituc = 3
dan ukuran spiral akan3*3
n <= 9
ituc = 5
dan ukuran spiral akan5*5
n <= 25
ituc = 7
dan ukuran spiral akan7*7
n <= 49
ituc = 9
dan ukuran spiral akan9*9
Saat menghasilkan spiral, saya menyimpan
x
dany
darin
dan setelah generasi, saya menampilkan elemen di atas / di bawah / kiri / kanan itu.sumber