Kami sudah beberapa dari tantangan tentang spiral Ulam. Tapi itu tidak cukup.
Dalam tantangan ini kita akan memplot spiral Ulam segitiga (sebagai lawan dari spiral Ulam persegi). Berikut ini sketsa bentuk spiral itu.
Seperti kita ketahui, spiral Ulam mengatur semua bilangan alami dalam spiral luar, dan hanya menandai yang prima. Jadi dalam sketsa di atas hanya angka yang muncul dalam warna hitam (bilangan prima) yang akan ditampilkan.
Tantangan
Terima angka N sebagai input dan tampilkan spiral Ulam segitiga ke angka itu.
- Input dapat berupa stdin atau argumen fungsi.
- Spiral harus berputar ke arah positif (yaitu, berlawanan arah jarum jam), seperti pada gambar di atas.
- Setiap belokan 120 derajat pada gambar di atas akan valid, dan belokan mungkin berbeda untuk input yang berbeda. Tetapi sisi terendah dari segitiga tersirat harus horisontal, karena satu-satunya belokan yang diizinkan adalah (kelipatan) 120 derajat.
- Kode harus berjalan secara teoritis (diberikan waktu dan memori yang cukup) untuk setiap N hingga apa yang diizinkan oleh perhitungan perantara yang Anda lakukan dengan tipe data default Anda.
double
cukup; tidak perlu untuk tipe integer besar. - Semua fungsi bawaan diizinkan.
- Saya tidak akan menerima jawaban saya sendiri (bukan berarti saya pikir itu akan menjadi yang terpendek ...).
Format output
Pilih salah satu dari yang berikut ini.
Tampilkan grafik dengan marker (titik, lingkaran, silang, apa pun yang Anda inginkan) di bilangan prima, dan tidak ada pada bilangan non-prima. Skala tidak harus sama untuk kedua sumbu. Artinya, segitiga tersirat tidak harus sama sisi. Sumbu, garis kisi, dan label sumbu adalah opsional. Hanya penanda di nomor utama yang diperlukan.
Contoh output untuk N = 12 adalah sebagai berikut (bandingkan dengan sketsa di atas). Plot kedua adalah contoh yang lebih menarik, sesuai dengan N = 10.000.
- Menghasilkan file gambar dengan di atas, dalam format gambar apa pun yang dikenal (seperti png, tiff, bmp).
Tampilkan spiral sebagai seni ASCII , menggunakan satu karakter pilihan Anda untuk bilangan prima dan ruang kosong untuk non-bilangan prima, dengan ruang kosong untuk memisahkan posisi angka di baris yang sama. Ruang terdepan atau tertinggal atau baris baru diizinkan. Sebagai contoh, kasus N = 12 menggunakan
o
karaktero · · · o · o · · · o · o
di mana tentu saja hanya
o
tanda di bilangan prima yang benar-benar akan ditampilkan. Di·
non-prima ditampilkan di sini hanya untuk referensi.
Kriteria kemenangan
Hadiah yang sebenarnya adalah melihat sendiri pola-pola yang luar biasa itu Kode golf, kode menang paling pendek.
sumber
Jawaban:
CJam,
4942 byteInput sebagai bilangan bulat tunggal di STDIN. Output sebagai kisi ASCII dengan
0
untuk bilangan prima. Rotasi spiral tidak konsisten: jumlah terbesar dari spiral akan selalu berada di baris bawah.Uji di sini.
Penjelasan
Ide dasarnya adalah merepresentasikan segitiga sebagai array 2D yang acak saat melakukan perhitungan. Anda mendapatkan array ini dengan membalikkan garis dan meluruskan semua baris ke kiri:
Akan diwakili sebagai
Karena kami telah mencerminkan garis, kami ingin menggulung spiral dengan searah jarum jam . Itu mudah, karena yang perlu kita lakukan adalah memutar segitiga berlawanan arah jarum jam dan menambahkan sublist berikutnya secara berurutan. Kita dapat memutar array yang rusak dengan membalik semua garis dan mentransposnya:
Jadi ini kodenya. Satu detail yang ingin saya perhatikan adalah bit terakhir yang menciptakan tata letak segitiga. Saya pikir itu agak bagus. :)
sumber
MATL ,
4836 byteMenggunakan rilis saat ini (9.3.0) .
Cobalah online!
Tidak tahu bagaimana kompiler online berhasil menerjemahkan output grafis ke ASCII, tetapi itumenghasilkan perkiraan plot ASCII berkat fitur Octave yang didukung oleh kompiler online!Edit (4 April 2016): fungsi
Y[
telah diubah namanyak
sejak rilis 13.0.0. Tautan ke kompiler online menyertakan perubahan ini, sehingga kode dapat diuji.Contoh
menghasilkan output grafis (versi MATLAB ditampilkan):
Penjelasan
Kode menggunakan bilangan kompleks untuk melacak jalur yang diikuti oleh spiral. Seperti yang dapat dilihat dari gambar pertama dalam tantangan, setiap kaki lurus dari spiral adalah segmen dengan peningkatan panjang 1, 2, 3, 4 ... dan secara siklikatif meningkatkan orientasi 120 derajat, 240 derajat, 0 degress, 120 degress. ..
Kode pertama menghasilkan perpindahan kompleks individu dari setiap nomor bilangan bulat ke yang berikutnya. Perpindahan kompleks ini memiliki magnitudo 1 dan sudut
2*pi/3
,4*pi/3
atau0
(dalam radian). Dengan demikian mereka dapat dengan mudah dihasilkan sebagai eksponensial imajiner. Untuk itu, urutan bilangan bulat 0,1,2,2,3,3,3,4,4,4,4 ... digunakan terlebih dahulu.Urutan bilangan bulat ini hampir seperti urutan "n muncul n kali" ( OEIS A002024 ), dan dapat diperoleh di
floor(sqrt(2*n)+.5)
manan
0,1,2,3, .... Mengalikan dengan2j*pi/3
, di manaj
unit imajiner, menghasilkan perpindahan kompleks yang diinginkan.Perpindahan diakumulasikan untuk menghitung posisi yang sesuai dengan bilangan bulat dalam spiral. Angka integer pertama dalam spiral, yaitu
1
, secara acak terletak pada posisi1
di bidang kompleks.Akhirnya, posisi yang berhubungan dengan bilangan non-prima dibuang, dan sisanya diplot pada bidang kompleks.
sumber
.png
file yang akan ditampilkan oleh halaman web @AlexAplot(1:5)
) dan menghasilkan output teks-grafis !! matl.tryitonline.net/#code=NTpYRw&input= @AlexA. Bagaimana dengan ini??Menggambar harus dilakukan dengan
LaTeX / PGF, 527
594byte527 byte adalah dokumen lengkap seperti di atas, yaitu termasuk pembukaan dan parameter (di sini 4000, jadi ~ 523 tanpa parameter). Menghasilkan file PDF.
Ide dasarnya: yah, gambar saja. Menggunakan transformasi matriks untuk kisi segitiga. Satu-satunya masalah adalah bahwa titik-titik juga dipengaruhi (dan direntangkan) oleh transformasi. Jadi saya memilih untuk ellipse spidol :) apa yang saya maksud dengan itu jelas pada gambar kedua (n = 250, 5pt).
Peringatan lain: hanya dapat menangani hingga kurang dari 5000 karena ukuran tumpukan maksimum TeX. Gambar pertama adalah untuk n = 4000. Rupanya mungkin untuk meningkatkan ukuran tumpukan , saya tidak mencobanya.
Menggunakan PGF
isprime()
.Tidak Disatukan:
sumber
lualatex
atau kompiler pengalokasian dinamis lainnya harus membiarkan Anda memotong ukuran tumpukan, jika saya memahami komentar terkait Anda dengan benar. Jadi itu bukan batasan jawaban Anda, hanya sebagian besar implementasi di mana Anda menjalankannya.Mathematica, 94 byte
Hasil
sumber
Python, 263 byte
Menjadi orang baru di Python, pasti ada ruang untuk perbaikan :)
Contoh:
sumber
s=[];X=[];Y=[];i=1;x=0;y=0
menjadis=X=Y=[];i=1;x=y=0;
x=y=0
.R, 137 byte
Hanya menggunakan fungsi bawaan, bahkan untuk bilangan prima. Mengingat pendekatan vektornya alih-alih iteratif, ia cepat, tetapi tidak dapat menangani jumlah yang besar.
Golf:
Tidak Disatukan:
Contoh:
sumber