Tujuan dari tantangan ini adalah untuk menggambarkan secara grafis sebuah jalan di pesawat, di mana arah setiap langkah ditentukan oleh keutamaan dan paritas dari ekspansi binernya. Secara khusus,
- Arah awal sudah ditetapkan, katakan Utara.
- Semua langkah memiliki panjang yang sama .
- The arah langkah dapat Utara, Barat, Selatan atau Timur, dan ditentukan sebagai berikut:
- Jika tidak prima, arahnya tidak berubah.
- Jika adalah prima dan ekspansi biner dari memiliki angka genap, belok kanan.
- Jika adalah prima dan ekspansi biner dari memiliki jumlah ganjil, belok kiri.
Sebagai contoh yang berhasil , asumsikan bahwa arah awal adalah Utara. Langkah pertama adalah:
- bukan bilangan prima. Jadi kami bergerak satu langkah ke arah saat ini, yaitu Utara.
- adalah prima, dan ekspansi binernya
10
,, memiliki dan ganjilnya. Jadi kita belok kiri, dan sekarang menghadap ke Barat. Kami bergerak satu langkah ke arah itu. - adalah prima, dan ekspansi binernya
11
,, memiliki dan bahkan sejumlah. Jadi kita belok kanan, dan sekarang menghadap ke Utara. Kami bergerak satu langkah ke arah itu. - tidak prima. Jadi kami bergerak satu langkah ke arah saat ini, yaitu Utara.
Tantangan
Masukan : positif bilangan bulat .
Output : plot jalan -step seperti yang didefinisikan di atas.
Aturan tambahan
- The arah awal dapat dipilih secara bebas (tidak harus Utara), tapi harus sama untuk semua .
- The Aturan memutar dapat menjadi berlawanan dengan yang dijelaskan di atas, yaitu, belok kanan untuk paritas ganjil dan kiri bahkan; tapi itu harus sama untuk semua .
- Outputnya harus berupa penggambaran grafis jalan-jalan. Contohnya:
- Jalan dapat digambar dengan segmen garis.
- Poin yang dikunjungi dapat ditampilkan dengan spidol, seperti titik; dengan atau tanpa menghubungkan segmen garis.
- Gambar raster dua warna dapat disediakan, dengan satu warna yang sesuai dengan titik yang dikunjungi dan yang lain untuk yang tidak dikunjungi.
- Timbangan sumbu horizontal dan vertikal tidak harus sama. Juga label sumbu dan elemen serupa adalah opsional. Selama perjalanan dapat dilihat dengan jelas, alur ceritanya sahih.
- Perhatikan bahwa beberapa titik dikunjungi lebih dari satu kali. Plotnya tidak sensitif terhadap ini. Misalnya, jika segmen garis ditampilkan dalam plot, setiap segmen unit ditampilkan sama tidak peduli berapa kali telah dilalui.
- Kode harus bekerja untuk
N
sumber daya tak terbatas yang diberikan. Dapat diterima jika dalam praktiknya gagal besarN
karena keterbatasan waktu, memori atau tipe data. - Input dan output fleksibel seperti biasa. Secara khusus, salah satu cara standar untuk menghasilkan gambar dapat digunakan.
- Kode terpendek dalam byte menang.
Uji kasus
Plot berikut menggunakan Utara sebagai arah awal; bahkan paritas berbelok ke kanan; dan jalan digambarkan dengan segmen garis.
N = 7
:
N = 3000
:
N = 20000
:
N = 159000
:
N = 1200000
:
N = 11000000
:
code-golf
graphical-output
integer
primes
Luis Mendo
sumber
sumber
[graphical-output]
yang diizinkan? Ada alasan khusus untuk melarang output ASCII, seperti jawaban Arang saya yang sekarang dihapus?Jawaban:
Sledgehammer 0.4 ,
2220 byteDekompresi ke dalam fungsi Bahasa Wolfram ini:
Tidak disatukan
Pertama kita mendefinisikan fungsi yang mengembalikan sudut untuk berbelok di setiap langkah:
ThueMorse
adalah paritas dari jumlah digit biner. Kami menggunakan-1^(...)
alih-alih2*...-1
untuk alasan yang sedikit rumit: Bahasa Wolfram secara otomatis mengubah ekspresi aritmatika menjadi bentuk kanonik, sehingga ekspresi seperti2/x
disimpan sebagaiTimes[2, Power[x, -1]]
. Ini membuat frekuensinyaPower
sangat tinggi, dan dengan demikian mengompresnya menjadi sangat murah.(Mengalikan dengan
Boole@PrimeQ@
sedikit lebih lama, danBoole
casting Boolean secara implisit belum dilaksanakan pada saat tantangan.)Dari sini, Mathematica
AnglePath
danListPlot
lakukan apa yang kita butuhkan:Dalam aplikasi interaktif, output adalah objek Graphics vektor yang dapat didaur ulang.
sumber
MATL ,
252421 byteCobalah di MATL online
Terima kasih @LuisMendo untuk sesi golf yang bagus di chat yang akhirnya mengarah ke versi 21 byte ini, dengan menyarankan
Eq*^
Penjelasan
sumber
C (gcc) , 179 byte
Cobalah online!
0
1
C (gcc) , 219 byte
Cobalah online!
Output yang dipotong untuk 20000:
Kedua versi dimulai dengan barat dan belok kanan ke ganjil, ke kiri genap.
Saya mencoba testcases yang lebih besar dengan keduanya, karena output dengan 20000 ~ 1,5 GB, dan 150000 ~ 90GB. Ini semua disimpan dalam memori saat program dijalankan.
Penjelasan dari yang atas:
sumber
0
atau null pointer dalam kasus C).Bahasa Wolfram (Mathematica) ,
989691777663 byte-14 byte: Terima kasih kepada @lirtosiast karena menunjukkan kepada saya cara menggunakan
AnglePath
...-13 byte: ... dan
ThueMorse
!contoh penggunaan:
Penjelasan langkah demi langkah:
If[PrimeQ@#, 2 ThueMorse@# - 1, 0] &
adalah fungsi yang mengambil langkah indeks dan mengembalikan 0 untuk bilangan prima, -1 untuk bilangan prima bilangan biner, dan +1 untuk bilangan prima bilangan biner.ThueMorse@#
menggantikan solusi sebelumnyaTotal[#~IntegerDigits~2]
(yang sama, modulo 2).Array[Pi/2*%,#]
membuat daftar fungsi ini dengan indeks dari 1 ke argumen fungsi (20000 dalam contoh), dan mengalikan setiap elemen dengan π / 2 untuk membuatnya menjadi sudut perubahan arah (radian). Kami sekarang memiliki 0 untuk bilangan prima non-prima, -π / 2 untuk bilangan prima biner, dan + π / 2 untuk bilangan prima biner ganjil.AnglePath[%]
mengubah daftar ini dari arah perubahan sudut menjadi jalan. Instruksi ini menggantikan penggunaan dua kali solusi sebelumnyaAccumulate
.ListPlot[%]
mengubah daftar posisi menjadi plot titik XY. Jika garis lebih disukai, gunakanListLinePlot
saja. Fungsi-fungsi plot ini memiliki banyak opsi untuk membuat plot terlihat lebih baik.sumber
MATL,
31302826 byte3 Bytes disimpan berkat @LuisMendo
2 Bytes disimpan berkat @Sanchises
Cobalah di MATL Online
Penjelasan
Solusi ini menggunakan bilangan kompleks untuk mewakili komponen X dan Y dari bidang 2D
Pada titik ini, kami memiliki empat titik (
(0, 1), (-1, 0), (0, -1), (1, 0)
) dalam array yang diwakili oleh bilangan kompleks. Ini adalah empat arah mata angin. Sekarang kita ingin menggunakan ini untuk "berjalan".Pada dasarnya cara kerjanya adalah kita mulai menuju ke arah zero'th (elemen ke-0 dari array yang ada
(-1, 0)
). Untuk setiap langkah, kita perlu menentukan perubahan dalam tajuk ini. Kami akan menggunakan bilangan bulat untuk melacak perubahan ini. Jika kita ingin berbelok ke "kanan", kita menambah bilangan bulat ini dengan 1 (merujuk elemen berikutnya dalam array 4-point) dan jika kita ingin pergi "kiri", kita mengurangi bilangan bulat ini dengan 1 (merujuk elemen sebelumnya di 4-point array). Jika kita ingin melanjutkan jalur kita, kita menjaga nilai integer konstan (merujuk elemen yang sama dalam array 4-point).Ini bagian dari kode menciptakan sebuah array dari semua orang
0
,-1
dan1
nilai-nilai.Sekarang kita memiliki array perbedaan antara integer berturut-turut sehingga kita dapat menghitung jumlah kumulatif dari mereka untuk mendapatkan indeks yang kemudian dapat kita gunakan untuk mencari arah pada setiap langkah dalam array 4-elemen asli.
Dengan mudah, MATL memiliki pengindeksan melingkar sedemikian sehingga indeks
5
membungkus ke awal array 4-elemen. Kita dapat menggunakan ini untuk keuntungan kita sehingga kita dapat menambah dan mengurangi bilangan bulat ini tanpa khawatir tentang fakta bahwa array arah referensi hanya 4 elemen.Sekarang kita memiliki berbagai arahan langkah yang diambil, sehingga kita dapat menghitung jumlah kumulatif arahan ini untuk melacak jalur yang telah diambil.
sumber
Perl 6 ,
213182 byte{my @p = [\ +] [\ *] ({{. is-prime ??. base (2) .comb (~ 1)% 2 ?? i !! - i !! 1 + 0i} (+ + $)} ... *) [^ $ _]; {"<svg viewBox = '{. min xx 2, .elems xx 2}' >>. & {" L {.re} {.im} " }} 'fill =' none 'stroke =' black '/> "} (minmax | @p» .reals)}Cobalah online!
(Benar-benar berhasil mengurangi yang satu ini!)
Fungsi ini menghasilkan dalam format SVG.
{ -{ .is-prime * .base(2).comb(~1) R** -1 || i }(++$)i } ... *
adalah urutan perubahan arah tanpa batas untuk setiap langkah, dalam bentuk bilangan kompleks, di mana1
berarti "terus ke arah yang sama,"i
berarti "belok kiri," dan-i
berarti "belok kanan."[^$_]
membatasi urutan itu ke jumlah langkah yang disediakan sebagai argumen fungsi.[\*]
memindai urutan itu dengan perkalian (kompleks), mengubah daftar perubahan arah relatif menjadi daftar arah absolut.[\+]
scan yang urutan dengan (kompleks) Selain itu, menghasilkan daftar koordinat dikunjungi.».reals
mengubah daftar bilangan kompleks menjadi daftar dua elemen dari bagian nyata dan imajinernya.Gambar SVG hanyalah satu
path
elemen tunggal .Output (dikonversi ke PNG) untuk N = 20000:
sumber
C, 321 byte
Cobalah online!
Saya mulai mengerjakan ini sebelum jawaban C yang lain diposting, tetapi saya pikir saya mungkin juga memposting jawaban saya juga. Yang ini jauh lebih lama, tetapi juga memotong gambar output ke dimensi hasil secara otomatis.
Fungsi disebut sebagai
f(n)
, dan output adalah stdout dalam format netpbm.Contoh output untuk n = 1000:
Tes utama pada dasarnya adalah yang digunakan dalam jawaban Lynn untuk tantangan yang berbeda , yang bergantung pada teorema Wilson .
Tes paritas menggunakan adaptasi dari metode penghitungan bit Kernighan .
Karena tes prima sangat lambat, dan algoritma menjalankan kembali fungsi pembuatan jalur keseluruhan untuk setiap piksel yang diambil, setiap input jauh lebih tinggi dari 1000 kali pada TIO.
sumber
LOGO,
177171 byteUntuk menggunakan, lakukan sesuatu seperti ini :
Maaf, tetapi saya tidak dapat menangkap output sampel. Penjelasan:
Ini adalah prosedur rekursif yang berputar 180 ° untuk setiap bit dalam parameternya, yang secara efektif menghitung paritas ekspansi binernya.
Ini adalah tes primality yang sangat mendasar. Setelah casing-1 khusus, prosedur akan kembali lebih awal jika suatu faktor ditemukan. Namun jika nilai saat ini ditemukan prima, belok kanan, dan kemudian menggunakan prosedur di atas untuk mengubahnya menjadi belok kiri yang sesuai.
Ini hanya sebuah loop sederhana untuk menguji semua angka hingga
n
untuk primality dan untuk memindahkan dua piksel setelah masing-masing.sumber
Jelly , 41 byte
Cobalah online!
sumber
JavaScript -
675668660632556534 BytesPertama kali di sini di CodeGolf, awalnya dimulai dengan ~ 1500 Bytes Code. Golf itu
kurang dari setengahhampirlebih dari sepertiga darinya. Jangan ragu untuk terus bermain golf. Bytes Dihitung dengan: alat iniPrinsip:
Menarik ke kanvas ukuran tetap dengan N dan panjang stroke variabel sebagai input.
Suntingan:
-07 Bytes - hapus yang terlewat jika
-08 Bytes - ubah alihkan ke jika / else
-28 Bytes - ubah ke tenary jika / else
-76 Bytes - tes utama lebih pendek (runtime / 3)
-22 Bytes - gunakan fungsi utama ini (runtime * 4)
Kode Golf:
Kode tidak digabungkan dengan spasi putih:
Contoh:
sumber
Merah ,
515480471 byte-1 byte terima kasih kepada Kevin Cruijssen!
Bagian penting dari kode (~ 160 byte) berkaitan dengan normalisasi koordinat sehingga gambar sepenuhnya pas di kanvas terlepas dari ukuran input.
Arah awal: Selatan.
Inilah hasilnya untuk
n = 3000
n = 20000
sumber
if j%(k + 1)
danif j% 2 = 1
, tetapi ada ruang yang diperlukan untuk sebagian besar operator lain (+
,/
, dll). Bisakah ruang juga dihapus di modulo ofpick[-90 90]s% 2
? Sebenarnya, mengapa juga tidak ada ruang yang diperlukanas-pair k/1 - t * c k/2 - v * c
untuk/
?s% 2
, terima kasih! Saya tidak tahu mengapa, tetapi modulo%
adalah satu-satunya operator yang ruang di depannya dapat dijatuhkan, jika didahului oleh sebuah kata (variabel). Dalamas-pair k/1 - t * c k/2 - v * c
garis miring/
melayani tujuan yang sama sekali berbeda - merekapath
s.k
adalah apair
dank/1
merupakan elemen pertama (dapat dipilih juga olehk/x
, ataupick k 1
). Spasi dibutuhkan hampir di mana-mana, pengecualian ada di sekitar()[]{}
, karena tidak ada ambiguitas.word
nama (Red
tidak memilikivariables
, semuanya adalahword
nilai atau (atau beberapa blok sintaks seperti[...]
atau(...)
) .Jadi:a*4: 45
-> kataa*4
diberi nilai 45.%
digunakan sebagai penanda untukfile!
datatype dan mungkin itu sebabnya tidak bisa digunakan dalamword
nama tetapi bisa melanggar aturan untuk operator aritmatika lainnya/
memiliki tujuan yang berbeda di sana dan simbol-simbol dapat digunakan tanpa spasi dalam variabel (atauwords
karena mereka tampaknya dipanggil untuk Red). Terima kasih untuk penjelasannya. :) Dan senang saya bisa (kebanyakan tidak sengaja) menyimpan byte untuks% 2
. :)Memproses, 140+ byte
Mungkin tidak memenuhi terlihat jelas
sumber