Mengingat integer masukan n
, menggambar ular nomor, yaitu, grid mengukur n x n
terdiri dari angka-angka 1
melalui n^2
yang luka sekitar satu sama lain dengan cara sebagai berikut:
Masukan n = 3
:
7 8 9
6 1 2
5 4 3
Masukan n = 4
:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
Masukan n = 5
:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
(Terinspirasi oleh masalah ini dari Project Euler.)
Ini adalah kode-golf , jawaban terpendek dalam byte menang!
4
? Atau nomor genap.Jawaban:
MATL , 3 byte
Cobalah online!
Penjelasan
Built-in ... ¯ \ _ (ツ) _ / ¯
sumber
C #,
203202196193178 bytesMenyimpan satu byte berkat @StefanDelport.
Disimpan 22 byte berkat @FelipeNardiBatista.
Ini bekerja dengan pengamatan berikut bagaimana kotak dibangun:
Seperti yang Anda lihat, setiap bit ditambahkan ke kotak sebelumnya. Untuk bilangan genap kita pergi ke kanan di mana kita berada, turun sampai satu lebih rendah dari tempat persegi itu dan kemudian pergi ke ujung. Angka ganjil pada dasarnya adalah kebalikannya, kita belok kiri, sampai ada satu di atas ketinggian saat ini dan kemudian ke ujung.
Versi Lengkap / Terformat:
sumber
++i<=n;
bisa menjadin>++i
, tidak ada yang bisa saya lihat, +1.n%2<1?2:1
untuk2-x%2
? Saya belum mengujinya dalam C #, tetapi dalam C dan Python itu berhasil.for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....
bermain golf sedikitvar b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
Dyalog APL,
70564541 byteCobalah online!
Bagaimana?
menghitung perbedaan antara indeks;
1
dan¯1
untuk kanan dan kiri,¯⍵
dan⍵
untuk naik turun.1,⊢,¯1,-
datang sebagai1 ⍵ ¯1 ¯⍵
,+⍨⍴
meregangkan array ini ke panjang⍵×2
, sehingga final2/⍳
dapat mengulangi masing-masing, dengan jumlah pengulangan meningkat setiap elemen kedua:kemudian,
menambahkan elemen kiri atas spiral,
batasi ⍵ 2 elemen pertama dari daftar jarak ini,
melakukan jumlah kumulatif,
nilai indeks (
⍵[i] = ⍵[⍵[i]]
), untuk menerjemahkan matriks asli dengan indeks setiap elemen, dan akhirnyabentuk sebagai
⍵×⍵
matriks.sumber
C,
321307295284283282 byteTerima kasih kepada @Zachary T dan @Jonathan Frech karena bermain golf satu byte!
Mengalokasikan array dua dimensi nol, kemudian mulai mengisinya dari suatu tempat di tengah. Terakhir nilai-nilai yang lebih besar dari nol tetapi lebih kecil dari atau sama dengan kuadrat input dicetak.
Cobalah online!
Diformat:
sumber
i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);
dengani,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);
untuk menyimpan byte?k<=n;
dengann>k;
untuk menyimpan byte.PHP , 192 byte
Cobalah online!
Cara yang sama membangun string, bukan array
PHP , 217 byte
Cobalah online!
sumber
[-1,1][$d&1]
->$d&1?:-1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);
. Dan satu lagi:"%$l".d
. Dan satu lagi:$x*$l*$a+$y*$l
->($x*$a+$y)*$l
.$s
ke garis bawah empuk (atau huruf atau digit); karakter itu akan ditimpa..d
pendekatan Anda sendiri untuk menghemat 2 bytePHP,
185 176174 byteJalankan sebagai pipa dengan
-nR
atau uji secara online .kerusakan
sumber
APL (Dyalog Classic) ,
3229 byteCobalah online!
Penggunaan
⎕io←1
. Mulai dengan matriks 0-by-1 (⍪⍬
). 2N kali (⍣2⍣⍵
) menambahkan ketinggian matriks (≢⍵
) ke setiap elemennya, menempatkan1 2...height
di kanannya (,⌸
), dan memutar (⌽⍉
). Ketika selesai, koreksi orientasi hasil (⊖∘⌽⍣⍵⌽
) dan membalikkan angka dengan mengurangi dari N 2 +1 (1+×⍨-
).sumber
Mathematica, 177 byte
sumber
C ++,
245228 byteCobalah online!
Fungsi menghitung dan mencetak nilai setiap angka dari matriks tergantung pada posisi x, y dengan menerapkan logika ini:
Versi yang diformat :
sumber
Python 3 ,
249247 byteSaya menginisialisasi array 2D dan menemukan titik awal, yang merupakan pusat untuk ganjil atau offset (-1, -1) untuk genap n, kemudian skala pola isian / kursor dengan angka 'cincin' saat ini. Saya merasa seperti kehilangan trik untuk menafsirkan arah, tetapi saya belum menemukan sesuatu yang lebih murah.
Cobalah online!
-2 Berkat Zachary T!
sumber
\t
dan\n
sebagai 1 byte dan masih mendapatkan 249 bytelen("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
Bahasa Wolfram (Mathematica) ,
(...)83 byteByte diukur dalam UTF8,
\[LeftFloor]
(⌊
) dan\[RightFloor]
(⌋
) masing-masing biaya 3 byte. Mathematica tidak memiliki rangkaian karakter byte khusus.Cobalah online!
Gunakan formulir tertutup untuk masing-masing dari 4 kasus, kemudian ambil secara maksimal untuk mendapatkan hasil yang diinginkan.
Mengembalikan array bilangan bulat 2D. Saya tidak yakin apakah ini diizinkan, dan meskipun telah ditanyakan dalam komentar , OP tidak menjawab.
sumber
Clojure, 206 byte
Saya kira ini adalah awal yang baik, membangun papan secara berurutan untuk hash-map dan kemudian mem-partisi-nya menjadi
n x n
daftar. Itudefmacro
berakhir menjadi cukup lama, tetapi kode itu masih lebih pendek daripada tanpa. Apakah ada sintaks yang lebih succint untuk menggambarkannya?Massal byte menghitung titik awal, dan membangun logika pencarian kecepatan berikutnya
v
. Mungkin sarangvec
akan lebih baik, tetapi kemudian Anda memiliki dua indeks dan kecepatan untuk dilacak.sumber
J , 41 byte
Cobalah online!
Melakukan hal yang sama dengan pengajuan APL ngn tetapi dimulai dengan matriks 1-per-1 dan mengulangi 2 × N − 2 kali.
sumber
Python 165 (atau 144)
Ini menciptakan array numpy, kemudian memutarnya dan menambahkan sisi sampai ukuran yang benar tercapai. Pertanyaannya tidak menentukan apakah titik awal yang sama perlu digunakan untuk angka genap dan ganjil, jika bukan itu kasusnya maka garis
if n%2==0:a=r(r(a))
dapat dihapus, menghemat 21 byte.sumber
J , 41 byte
pemformatan standar
Pendekatan ini didasarkan pada At Play With J Volutes (APL Uriel menggunakan teknik serupa).
Tidak terduga dan cukup elegan untuk membenarkan jawaban kedua, pikir saya.
Pada dasarnya, kami tidak melakukan apa pun prosedural atau bahkan geometris. Sebagai gantinya, kami secara aritmatika membuat urutan sederhana yang, ketika pemindaian disimpulkan dan dinilai, memberikan urutan yang benar dari angka spiral dari kiri ke kanan, atas ke bawah. Kami kemudian membentuk itu menjadi matriks dan selesai.
Saya akan menambahkan penjelasan yang lebih rinci ketika waktu mengizinkan, tetapi artikel yang ditautkan menjelaskannya secara mendalam.
Cobalah online!
sumber
Python 3 (Stackless) ,
192188179150 byteCobalah online!
Disimpan 4-byte sejak rotasi fasor 90 derajat mudah dilakukan tanpa bilangan kompleks
sumber
R , 183 byte
Cobalah online!
Output adalah ular matriks (atau matriks ular, apa pun). Itu mungkin bukan metode yang paling efisien, dan itu mungkin bisa golf, tapi saya pikir itu layak ditampilkan. Sebenarnya saya agak bangga dengan ini!
Metode membangun matriks dari dalam ke luar, selalu menambahkan jumlah bilangan bulat tambahan yang sama dengan jumlah kolom dalam matriks sebelum menambahkan. Pola yang berikut adalah mengikat dengan kolom atau baris, sementara juga membalikkan beberapa nilai sehingga mereka ditambahkan dalam urutan yang benar.
193 byte
Persis sama seperti di atas, tetapi final
b
adalahCobalah online!
yang memberikan output yang sedikit lebih bersih, tetapi saya tidak melihat kriteria khusus untuk output, jadi jawaban pertama harus bekerja jika saya tidak salah.
sumber