Yang ini terinspirasi oleh tantangan tabel perkalian terbaru Calvin Hobbies .
Tulis fungsi atau program yang mengambil integer N
sebagai input dan mencetak atau mengembalikan spiral multiplikasi unik N-by-N. Kode harus (dalam teori) bekerja untuk N antara 0 dan 1000 (mengeluarkan ini bisa jadi sulit). Output harus setara dengan tabel yang dihasilkan oleh prosedur berikut:
Isi tabel perkalian N-by-N. Misalnya untuk N = 3:
1 2 3 2 4 6 3 6 9
Ikuti spiral searah jarum jam dari sudut kiri atas, perhatikan angka yang Anda kunjungi. Ketika Anda mengunjungi nomor yang sudah Anda kunjungi, gantilah dengan 0.
Beberapa contoh mungkin membuatnya lebih jelas:
n = 0:
0
n = 1:
1
n = 2: // Spiral order:
1 2 // 1 2
0 4 // 4 3
n = 3:
1 2 3 // 1 2 3
0 4 6 // 8 9 4
0 0 9 // 7 6 5
n = 4:
1 2 3 4 // 1 2 3 4
0 0 6 8 // 12 13 14 5
0 0 9 12 // 11 16 15 6
0 0 0 16 // 10 9 8 7
n = 5:
1 2 3 4 5
0 0 6 8 10
0 0 9 12 15
0 0 0 16 20
0 0 0 0 25
n = 10:
1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 12 14 16 18 20
0 0 0 0 15 0 21 24 27 30
0 0 0 0 0 0 28 32 36 40
0 0 0 0 25 0 35 0 45 50
0 0 0 0 0 0 42 48 54 60
0 0 0 0 0 0 49 56 63 70
0 0 0 0 0 0 0 64 72 80
0 0 0 0 0 0 0 0 81 90
0 0 0 0 0 0 0 0 0 100
Jumlahnya ditemukan seperti ini:
Setiap format output yang masuk akal diterima, tetapi harus berupa matriks N-by-N, tidak bisa hanya daftar. Format seperti yang di bawah ini diterima, karena ada N kolom 1-by-N yang mudah dibedakan, atau baris N-by-1:
[[1 2 3][0 4 6][0 0 9]] <-- OK
[[1 0 0][2 4 0][3 6 9]] <-- OK
ans = <-- OK
1 2 3
0 4 6
0 0 9
Kode terpendek dalam byte menang.
sumber
n=0
mana tidak ada nol dalam tabel perkalian. Saya bisa mengertin=1
akan menghasilkan 1, tetapi mengapa termasuk nol?n=0
harus berupa matriks 0-by-0, atau pertanyaannya tidak konsisten.Jawaban:
J, 22 byte
Ini menghasilkan 0-by-0 matrix untuk
n=0
.sumber
Mathematica
123 122 117 98 9873 byteDengan 24 byte disimpan berkat LegionMammal978 dan 19 by alephalpha!
Anehnya, dalam tabel ini, beberapa contoh dari bilangan bulat mana pun
n
akan memiliki urutan relatif yang sama dalam spiral seperti yang mereka lakukan dalam tabel itu sendiri! Penampilan pertama suatu angkan
terletak pada sel di mana angka itu muncul pertama kali dalam tabel (ketika seseorang mengisi baris demi baris tabel). Ini berarti bahwa pendekatan tersebut dapat mengabaikan kendala spiral sama sekali, karena tidak ada hubungannya dengan hasilnya. (Lihat penjelasan di bawah.)Contoh
Penjelasan
Kami mengeksploitasi fakta bahwa urutan spiral dari posisi digit mana pun, n, sama dengan urutan posisi row-col yang dikembalikan oleh fungsi
Positions
,!Lokasi kemunculan pertama setiap angka (apakah satu pesanan oleh spiral atau oleh posisi tabel) akan menjadi elemen pertama yang dikembalikan oleh
Position
. Sel yang muncul pertama kali akan dibiarkan apa adanya. Contoh jumlah yang tersisa diganti dengan 0.Mari kita lihat bagaimana ini bekerja, memeriksa kasus
n==18
. Idenya adalah mulai dengan tabel perkalian:dan cari posisi baris-col dari setiap nomor. Misalnya, 18 terletak di Baris 2, Kol 9 (contoh pertama); Baris 3, Kol 6; Baris 6, Kolom 3; dan Baris 9, Kol 2. Ini memiliki posisi urutan spiral masing-masing {44, 58, 68, 82}.
seperti yang ditunjukkan tabel berikut.
3 contoh terakhir dari 18 harus diganti dengan 0. (Kami akan menggunakan nol biru tebal besar sehingga mudah dilihat.)
sumber
Function
?ReplacePart[t=1##&~Array~{#,#},Join@@(Rest[t~Position~#]&/@Union@@t)->0]&
Python,
99 95 90 89 8781 byteKode golf:
Tidak Disatukan:
Keluaran:
sumber
MATLAB,
96 88 87 8679 byteIni adalah kode 79 byte, yang mengikuti contoh output (untuk n = 0 khusus)
Yang ini adalah 75 byte, memiliki perilaku yang sama kecuali untuk n = 0 yang akan menghasilkan array kosong sesuai dengan implikasi dari pertanyaan (N oleh N array = 0 oleh 0 = array kosong).
Ini juga berfungsi dengan Oktaf . Anda dapat mencobanya online di sini . Kode sudah ditambahkan sebagai file bernama 'multspiral.m'. Jadi pada prompt Oktaf, ketik
multspiral
dan tekan enter. Anda kemudian harus memasukkan ukuran tabel (mis. 4). Output kemudian akan dicetak.Bagaimana cara kerjanya?
Pertama-tama ini mengambil nomor input sesuai kebutuhan (misalnya 6, 4, dll.)
Kemudian kami menangani kasus untuk
n=0
dann=1
- ini diberi perlakuan khusus karena mereka adalah dua yang tidak mengikuti aturan yang saya gunakan untuk menghasilkan array - sebenarnya ini bisa menjadi 5 byte lebih pendek jika bukan untukn=0
kasus yang tidak jelas .Kemudian untuk semua nilai
n>2
, kita melakukan perulangan sampai matriks tumbuh ke ukuran yang benar.Sebenarnya hanya ada tiga perbedaan sederhana antara
n
dann+1
untuk semuan>=2
. Ini adalah:Kolom baru ditambahkan paling kanan di array yang berisi angka-angka
n(1:n)
. Ini mudah dihitung dengan:Setiap elemen yang akan ditambahkan dalam kolom baru harus dihapus dari matriks yang ada (set ke nol) karena mereka akan selalu datang kemudian di spiral daripada kolom baru. Ini dihapus menggunakan nestled for loop untuk mengatur semua elemen dalam matriks saat ini yang ada di kolom baru menjadi nol.
Ada paling bawah baris baru di mana setiap elemen kecuali yang ada di kolom baru akan menjadi nol. Ketika kolom baru ditambahkan, karena indeks di luar batas yang telah sengaja dibuat diisi secara otomatis dengan 0. Salah satu fitur kuat MATLAB adalah dapat menumbuhkan array tanpa penanganan khusus, sehingga kita dapat menambahkan baris dan kolom baru dengan mudah dengan:
Akhirnya kita memiliki akhir dari for loop - yang setelah tercapai, matriks
m
berisi output kita. Karena Anda fleksibel dengan format output Anda, matriks ditampilkan dengan hanya memilikim
sebagai baris baru tanpa titik komaSebagai contoh, jika kita menjalankan program, masukkan angka 10, kita mendapatkan output berikut:
sumber
Haskell,
10399 byteContoh penggunaan:
f 4
->[[1,2,3,4],[0,0,6,8],[0,0,9,12],[0,0,0,16]]
.Saya baru saja menemukan
Data.Lists
modul yang memiliki fungsi bagus pada daftar (sepertireplace
) dan ekspor ulangData.List
,Data.List.Split
danData.List.Extras
.sumber
Ruby,
676361 byte63 byte
67 byte
Pemakaian:
sumber