Tantangan:
Tujuan golf kode ini didasarkan pada nomor 8675309
...
Tujuan Anda adalah untuk mencetak setiap bilangan prima dari 2 hingga 8675309, dimulai dengan angka 2 dan kemudian melewatkan 8 bilangan prima, kemudian melompati 6, kemudian melompati 7, dll. Pada dasarnya, lewati sejumlah bilangan prima yang ditentukan oleh angka berikutnya di urutannya 8675309
. Bersepeda ke 8 setelah mencapai 9.
Keluaran:
2
29
(melewatkan 8 untuk sampai ke prime 10)
59
(melompati 6 untuk sampai ke prime 17)
97
(melompati 7 untuk mencapai prime 25)
Contoh: (PHP-seperti kode semu di mana $prime
array berisi semua bilangan prima.)
$tn=1;
$c=1;
$na=array(8,6,7,5,3,0,9);
l:
output($prime[$tn]);
if ($prime[$tn]>=8675309) {exit(8675309)};
$c+=1;
if ($c>=8) {$c=1};
$tn+=$na[$c];
goto l;
Ketika saya mengatakan lewati 8 bilangan prima, saya bermaksud untuk beralih dari prime # 1, ke prime # 10 (melewatkan 8 di antaranya).
Setiap angka harus berada di baris baru.
Ketika Anda mencapai 0
dalam 8675309
, cukup cetak nomor prima berikutnya tanpa melewatkan apa pun.
Ini adalah kode-golf sehingga kode terpendek (dalam-byte) menang.
sumber
$c
menjadi awal, dan jika kita tidak menekan 8675309 persis (kan?), Itu juga mencetak angka pertama yang melebihi nilai itu.Jawaban:
Mathematica 67 byte
Namun tidak mencapai 8675309 - tidak yakin dengan niat OP tentang ini.
sumber
Bertanya-tanya , 47 byte
Ya ampun, ini semakin lambat seiring berjalannya waktu ...
Penjelasan
Mengambil 582161 (jumlah bilangan prima <= 8675309) item dari daftar bilangan prima tak terbatas
P
dan mendeklarasikan ulang hasilnya sebagaiP
.Secara tak terbatas siklus digit 8675309 dan melakukan takewhile pada daftar yang dihasilkan.
Keluarkan item pertama dalam
P
, dropcycle item + 1
elemen dari P, dan hasil ulang menyatakan sebagaiP
. Operasi iniP
juga bertindak sebagai nilai kebenaran untuk sementara; jika daftar itu kosong / palsu (artinya kita telah mencapai 8675309), maka kita berhenti mengambil dari daftar bersepeda.Implementasi lebih cepat (untuk pengujian)
Masih sangat lambat, tetapi terasa lebih cepat.
sumber
Jelly ,
23 2924 byte+6 byte untuk tambalan sementara untuk memenuhi persyaratan untuk mencetak 8675309.
-5 byte pindah ke pegolf tetapi pendekatan yang lebih lambat untuk mengatasinya.
Sekarang terlalu lambat untuk dijalankan di TryItOnline, tetapi berjalan secara lokal dalam beberapa menit, menghasilkan angka-angka yang ditunjukkan di bawah ini dengan umpan baris di antara (# bilangan prima dilewati yang ditunjukkan di bawah dalam tanda kurung):
* yang terakhir hanya lompatan efektif 4, karena hanya ditambahkan ke daftar.
Klik di sini untuk versi menggunakan 3659 bukannya 8675309, yang memiliki 19 set empat lompatan (daripada 12937 set 7) dan tambahkan 3659 (yang merupakan lompatan efektif 6).
Bagaimana?
sumber
Ruby, 121 byte
Mengejar baris baru di akhir file yang tidak perlu dan tidak disimpan.
Penjelasan:
P
adalah array bilangan prima.c
adalah kandidat utama;s
adalah produk residu modulo setiap perdana yang lebih kecil; jika ada residu seperti itu nol (menunjukkanc
komposit),s
menjadi (dan tetap) nol.Generator bilangan prima lambat. Ini akan membutuhkan waktu lama untuk dijalankan. Pengujian dilakukan dengan mengganti
P
array yang dihasilkan dengan cara yang lebih efisien (khususnya, hubung singkat pada divisi genap, dan juga banyak membantu untuk menghentikan pengujian pada akar kuadrat).sumber
Haskell, 122 byte
Ini mungkin yang diminta:
Saya bisa menghemat beberapa byte dengan menghitung berapa jumlah yang dibutuhkan, dan mengganti
takeWhile
dengantake
. Itu juga akan memungkinkan untuk beradaptasi dengan keputusan apa pun tentang angka terakhir yang akan dikeluarkan. Ini sudah mencetak angka hingga 600000 menggunakan sangat sedikit memori dalam pengujian saya, jadi saya pikir itu bisa berjalan sepanjang jalan.sumber
8675310
dengan8675
, katakanlah. Dan itu berfungsi untuk saya (dikompilasi, dengan optimasi, tidak mencoba tanpa) dalam bentuk aslinya. Mesin yang lebih cepat, mulai lebih awal dari tes pertama, telah mencapai 1.600.000.Haskell, 109 byte
Cobalah online! (terpotong
8675309
ke8675
, jika tidak habis pada Coba online )Pemakaian:
sumber
Perl 6 ,
65 7367 byte(gagal mencetak 8675137 karena hilang:partial
)Dengan menggeser ujung Range,
:partial
dapat dihapus.Cobalah (batas 5 detik ditambahkan) Lihat selesai
Contoh awal dihitung waktunya pada 52 menit 41,464 detik.
Diperluas:
Hasil dari
rotor
panggilan adalah urutan berikutsumber
:partial
kata keterangan pada panggilan untuk.rotor
Befunge, 136 byte
Cobalah online! , tapi ketahuilah bahwa ini akan habis waktu lama sebelum mencapai akhir. Versi kompilasi pada mesin lokal saya selesai dalam waktu kurang dari 10 detik.
Penjelasan
Untuk menguji primality, kita mengulangi rentang 2 hingga sqrt ( n ) dan memeriksa apakah n adalah kelipatan dari salah satu dari nilai-nilai tersebut - jika tidak, itu prima. Proses ini diperumit oleh fakta bahwa nilai yang diulang perlu disimpan dalam "variabel" sementara, dan karena sel memori Befunge terbatas dalam ukuran, penyimpanan itu harus dipecah menjadi dua sel. Untuk menangani bilangan prima yang dilewati, kami menggunakan "tabel" pencarian (yang dapat Anda lihat pada baris 5) untuk melacak rentang berbeda yang perlu dilewati.
Saya tidak akan melakukan analisis rinci kode, karena ada cukup banyak kode interleaving dengan perintah yang dibagi di jalur kode yang berbeda untuk menghemat ruang. Ini membuat hal-hal agak sulit untuk diikuti dan saya tidak berpikir itu akan sangat menarik bagi siapa pun yang belum terbiasa dengan Befunge.
Output Sampel
sumber
Bash (+ coreutils),
98, 94 byteEDIT:
Golf
Uji
Cobalah secara Online! (terbatas pada N <1000, untuk membuatnya berjalan cepat)
Versi lengkap membutuhkan sekitar ~ 15 detik untuk selesai di mesin saya.
sumber