Ulam's spiral adalah topik matematika yang benar - benar menarik, namun membingungkan. Cara kerjanya secara detail dapat ditemukan di sini , tetapi ringkasan singkat dapat dijelaskan sebagai berikut:
Saya mulai dengan menulis satu, lalu saya menulis dua di sebelah kanannya. Di atas keduanya, saya menulis tiga, dan di sebelah kiri saya menulis empat. Saya melanjutkan pola berputar-putar ini di sekitar 1 (dan angka apa pun di antara saya dan 1) tanpa batas (atau sampai disuruh berhenti), membentuk pola spiral. (lihat contoh di bawah)
Objektif
Buatlah program yang menerima n (akan selalu menjadi angka ganjil lebih besar dari nol) sebagai input yang berkorelasi dengan jumlah baris, lalu cetak nilai-nilai bilangan prima demi baris spiral Ulam. Format dapat berupa mode apa pun, tetapi harus dapat dibaca dan jelas oleh manusia.
Misalnya, mengingat input 3, program Anda harus menampilkan 5,3,2,7
, karena 3 baris menghasilkan spiral berikut:
5 4 3 <-- first row has the primes 5 and 3
6 1 2 <-- second row has the prime 2
7 8 9 <-- third row has the prime 7
Karena ini adalah kode golf, jawaban dengan byte paling sedikit menang (tidak peduli seberapa tidak efisien)! Celah standar tidak dapat diterima.
Jawaban:
Pyth, 20 byte
Cobalah online: Demonstrasi
Kode ini menghasilkan spiral Ulam sepenuhnya, menghubungkan semua garis dan filter untuk bilangan prima.
Penjelasan:
sumber
MATLAB, 48
Pada dasarnya ini menciptakan spiral dengan ukuran yang diperlukan (diminta dari pengguna), kemudian mengaturnya sehingga muncul dalam urutan baris yang benar. Ini disimpan dalam a. Selanjutnya ini menampilkan semua nilai yang prima.
Seperti yang Anda katakan format yang dapat dibaca, saya menyimpan byte dan pergi untuk output default disp () yang (dalam kasus pengujian Anda, n = 3):
Sebagai bonus tambahan, ini bekerja untuk n> 0, termasuk angka genap. Sebagai contoh, output untuk n = 10 adalah:
sumber
spiral
fungsi ituCJam,
4233 byteCobalah online
Versi terbaru mencakup peningkatan substansial yang disarankan oleh @Martin.
Metode untuk membangun spiral adalah, pada setiap langkah, memutar matriks yang kita miliki sejauh ini sejauh 90 derajat, dan menambahkan baris dengan angka tambahan. Ini berulang
(n / 2) * 4
kali.Nilai-nilai dalam matriks yang dihasilkan kemudian disaring untuk dijadikan bilangan prima.
Penjelasan:
sumber
2/4*
diganti oleh2*
, atau Anda sengaja membiarkannya seperti itu?(2*
harus benar.Mathematica 223
Ini sesuai dengan kode Kuba untuk spiral Ulam. Itu sebabnya saya mengirimkannya sebagai wiki komunitas. Saya hanya bermain golf dan memilih bilangan prima, yang terdaftar pada baris di mana mereka tinggal.
Contoh
Untuk meningkatkan tampilan:
sumber
Mathematica, 118 byte
Ini menghasilkan Ulam spiral dalam bentuk linier dengan mencatat bahwa posisi setiap angka selanjutnya dapat diakumulasikan sebagai
yaitu mulai dari pusat, lalu gerakkan 1 ke kanan, 1 ke atas, 2 ke kiri, 2 ke bawah, 3 ke kanan, 3 ke atas, ...
Keluaran:
sumber
Javascript,
516363304276243240 BytesSolusi saya tidak membuat matriks padat dengan Spiral, melainkan mengembalikan indeks yang sesuai dengan angka yang diberikan dalam Matriks Ulam dari urutan yang diberikan. Jadi iterasi melalui angka antara 2 dan M * M dan menciptakan array bilangan prima dengan idx yang diberikan oleh fn ulamIdx
Bentuk yang diperkecil seperti ini:
Untuk input 15 outputnya adalah:
,,,,,,,,,,,,,,,, 197 ,,,, 193,, 191 ,,,,,,,,,,,,,,,, 139,, 137 ,,,,, , 199,, 101 ,,,, 97 ,,,,,,,, 181 ,,,,,,,, 61,, 59 ,,, 131 ,, ,,, 103,, 37 ,,,,,, 31,, 89,, 179,, 149,, 67,, 17 ,,, 13 ,,,,,,,,,,, 5,, 3,, 29 ,,,,,, 151 ,,, , 19 ,,, 2,11,, 53,, 127 ,,,, 107,, 41,, 7 ,,,,,,,,,,,,71 ,,,, 23 ,,,,,,, ,,, 109,, 43 ,,,, 47 ,,, 83,, 173 ,,,, 73 ,,,,,, 79 ,,,,,,,,,, 113 ,,,,,,, ,,,,, 157 ,,,,,, 163 ,,,, 167 ,,,, 211 ,,,,,,,,,,,, 223
sumber