Tugas Anda, jika Anda memilih untuk menerimanya, adalah menulis program / fungsi yang menerima bilangan bulat N sebagai input. Program / fungsi harus menampilkan / mengembalikan daftar bilangan prima N pertama . Tapi inilah intinya: Anda tidak diperbolehkan menggunakan karakter utama dalam kode Anda. Karakter utama adalah karakter yang titik kode Unicode-nya adalah bilangan prima. Dalam rentang ASCII yang dapat dicetak, ini adalah:
%)+/5;=CGIOSYaegkmq
Tetapi aturan ini juga berlaku untuk karakter non-ASCII jika kode Anda menggunakannya.
- Input yang valid adalah bilangan bulat N di mana 0 <N <= T , di mana Anda dapat memilih T , tetapi harus lebih besar dari atau sama dengan 10000. T tidak harus terbatas.
- Untuk input yang tidak valid (bukan bilangan bulat, bilangan bulat di luar kisaran), lempar pengecualian atau hasilkan / tidak menghasilkan apa-apa / null.
- Integer dengan spasi spasi awal / akhir sebagai input dianggap tidak valid.
- Integer dengan
+
karakter tanda sebagai input dianggap tidak valid. - Integer dengan nol di depan karena input dianggap valid.
- Jika bahasa Anda memungkinkan Anda untuk meneruskan bilangan bulat yang sudah diuraikan sebagai input, aturan penguraian di atas (kecuali rentang yang) tidak berlaku, karena int sudah diuraikan.
- Masukan selalu basis-10.
- Penggunaan generator prima dan penguji primitif bawaan (ini mencakup fungsi faktorisasi prima) tidak diizinkan.
- Pembatasan sumber dikenakan pada karakter Unicode, tetapi penghitungan byte untuk skor dapat dalam pengkodean lain jika diinginkan.
- Outputnya bisa berisi satu baris baru, tetapi ini tidak diperlukan.
- Jika Anda menampilkan / mengembalikan daftar bilangan prima sebagai string, maka setiap bilangan prima harus dibatasi oleh satu atau beberapa karakter non-digit. Anda dapat memilih pembatas yang Anda gunakan.
- Ini adalah tantangan kode-golf , kode terpendek dalam byte menang.
Stack Snippet untuk memverifikasi kode Anda
Anda dapat menggunakan Cuplikan Stack di bawah ini untuk memverifikasi bahwa kode Anda tidak mengandung karakter utama:
var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) { var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join("")); }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>
code-golf
restricted-source
primes
ProgramFOX
sumber
sumber
;
kebetulan dilarang ...+
, sepertinya mengecewakan diharuskan untuk membuangnya secara manual.Jawaban:
CJam,
191830343319172120 byteCobalah online.
Ini mungkin salah satu algoritma yang paling tidak efisien yang pernah saya terapkan. Tapi saya melakukannya untuk ukuran!
Jawaban saya terdiri dari blok kode, yang bertindak seperti fungsi anonim di CJam. Jalankan dengan integer segera sebelum itu di stack, dan daftar yang dihasilkan dibuang ke stack. Saya memperlakukan batas atas pada input sebagai tidak terbatas sehingga saya tidak perlu memeriksa batas itu.
Algoritme saya mulai dengan menaikkan 3
input
pangkat ke - th, yang dijamin memberikan angka lebih besar dariinput
-th prima jika inputnya valid. Kemudian daftar bilangan bulat dari 2 ke angka ini dikurangi satu yang dihasilkan, yang merupakan petak yang cukup besar untuk memuat semua bilangan prima yang kita inginkan. Untuk menghilangkan angka komposit ... huh ... kami membuat daftar setiap produk berpasangan, yang akan menghasilkan semua angka komposit dari 4 hingga nilai yang sangat besar, cukup besar untuk keperluan kita. Maka itu hanya masalah menghapus setiap elemen dari daftar asli yang ada di daftar komposit ini, memangkasnya keinput
elemen pertama , dan bergabung dengan elemen dengan karakter baris baru.Algoritme harus bekerja untuk input apa pun. Namun, apakah penerjemah / komputer memiliki cukup memori atau waktu adalah pertanyaan lain, karena persyaratan waktu dan ruang bersifat eksponensial sehubungan dengan input. Jadi jika input lebih besar dari sekitar 5 untuk penerjemah online atau sekitar 8 untuk yang offline, maka jawaban untuk pertanyaan itu mungkin tidak.
sumber
S*
?S
karakter utama?Jawa. 474 byte
Mengambil input melalui argumen fungsi, output melalui pengecualian yang dibuang.
Bertakuk:
Karakter yang dihapus dihapus:
Penjelasan:
Solusi asli saya menggunakan
return
pernyataan. Setelah mengajukan pertanyaan ini pada StackOverflow, regettman cukup berbaik hati untuk menyediakan cara untuk output / kembali tanpa menggunakan huruf utama.Seperti biasa, saran dipersilahkan :)
sumber
Ruby, 74
Penjelasan:
*o
menginisialisasi array output kosong. sampai memilikin
item, kami menemukan angka terkecil> = 2 yang tidak membagi item apa pun saat inio
, kemudian menambahkannya keo
. Untuk menguji pembagian, ya. Semua operator yang baik tidak diizinkan, dan saya bahkan tidak bisa menggunakannyadivmod
. Yang terbaik yang bisa saya lihat adalah menggunakanx.div y
, yang mengambil x dibagi dengan y dan dibulatkan, lalu kalikan dengan y lagi. Jika sama dengan x, tidak ada pembulatan, jadi y membagi x.1.>x.^
adalah tes kesetaraan, memeriksa apakah hasil xor adalah 0..
Sebelum setiap operator adalah karena Anda tidak dapat mencampur.
panggilan operator-bebas dan metode bebas kurung.Sunting: Spesifikasi pengecekan jangkauan ditambahkan setelah saya memposting ini, saya kira. Untuk mematuhi diperlukan 79 karakter:
sumber
CJam,
383730 byteCoba di sini
Saya pikir ini harus mematuhi semua aturan dan bekerja untuk N non-negatif (yaitu T tidak terbatas). Ini sangat tidak efisien, jadi jangan mencobanya untuk jumlah yang besar.
Ini adalah blok - hal yang paling dekat dengan fungsi (tanpa nama) - yang mengharapkan integer pada stack, mencetak semua bilangan prima dan meninggalkan stack tanpa inputnya. Untuk semua input yang tidak valid, ia akan melakukan kesalahan atau tidak mencetak apa pun.
Sebagian besar kode adalah validasi input, diikuti oleh saringan Eratosthenes. Saya hanya perlu mengatasi batasan input di 3 tempat:
)
adalah kenaikan di CJam. Aku membutuhkannya sekali, tetapi bisa menggantinya dengan~
(bitwise komplemen) karena saya mengkuadratkan angka setelahnya.%
adalah modulo. saya menggunakan37c~
sebagai gantinya, yang pertama menciptakan karakter%
dan kemudian mengevaluasi itu. Ini membuat kode jauh lebih lambat.;
muncul dan membuang elemen dari stack. Saya perlu melakukan ini di akhir. Alih-alih saya menggunakan'<(~
yang mendorong karakter<
, mengurangi dan mengevaluasi itu.sumber
Bash + coreutils, 227 byte
Ini cukup sulit. Beberapa hal yang saya temui:
while
danuntil
) tidak dapat digunakan karena mereka paling dekat dengandone
yang merupakan kata kunci shell dan tidak dapat menjadi hasil dari ekspansi variabel (kecualieval
digunakan, tetapi itu juga keluar). Satu-satunya loop yang dapat digunakan adalahfor
/in
yang memungkinkan{
/}
bukando
/done
.for (( ; ; ))
juga tidak bisa digunakan.=
keluar, jadi kita perlu cara lain untuk menetapkan variabel.printf -v
bagus untuk ini.jot
menghasilkan daftar faktor potensial di loop dalam. Jika faktor potensial membagi prime potensial, maka itu tidak prima dan kami keluar lebih awalbreak
adalah shell builtin dan bukan kata kunci, jadi dapat dihasilkan sebagai hasil dari ekspansi.dc
mengkonversi nomor base 13 menjadi bytestreameak
./
atau%
shell. Jadi ini diserahkan kepadadc
s~
operator, yang mendorong bagi dan sisa ke stack.-lt
- kurang dari - adalah satu-satunya operator perbandingan shell yang dapat digunakan.echo
tidak ada gunanya untuk output.printf
bekerja meskipun selama kita hindari%
Mendapatkan validasi input dengan benar sedikit menyebalkan. Ini tidak mengembalikan apa pun jika input tidak valid.
Keluaran:
sumber
Haskell, 90 byte
Ini adalah fungsi anonim yang mengambil integer
n
sebagai input.Cara kerjanya:
[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]]
(contoh pertama dari prime-liner nomor satu di wiki Haskell tetapi denganelem
fungsi diganti) membuat daftar bilangan prima yang tak terbatas.zip
dengan angka dari1
hinggan
untuk membuat daftar(prime, seq. number)
pasangan. Hapus seq. nomor lagi. Hasilnya adalah daftar bilangan prima panjangn
.sumber
Rust, 64897 byte
(kode terpotong karena batas karakter, solusi lengkap di sini )
Fitur karat berikut menjadi tidak tersedia karena batasan utama:
Apa yang secara teknis dapat Anda gunakan:
Saya tidak bisa membuat apa pun Turing-lengkap dengan alat-alat ini. Maafkan saya. Yang tersisa hanyalah memasukkan 10.000 primes pertama penuh, dibersihkan dari 5's. Setidaknya Anda dapat mengirisnya dan memiliki solusi yang valid, dalam arti sesempit mungkin.
Saya sangat ingin para pakar Turing tarpit diving (atau di Rust!) Memberi tahu saya jika saya bisa melakukan sesuatu yang lebih baik!
sumber
GNU APL,
75 68 67 65 59 5655 karakter⎕IO
harus1
.Saya kembali pada bulan ini kemudian menyadari bahwa saya memiliki ruang ekstra!
sumber
Pyth - 12 byte
Gunakan fungsi faktorisasi utama pyth untuk melihat apakah # adalah prima.
!tPT
Trik penggunaan menyarankan saya pada jawaban saya untuk primes di bawah jutaan masalah.Karena filter hanya berfungsi untuk bilangan prima di bawah n dan bukan yang pertama, saya hanya mencari kebalikan dari pi (x) untuk 10.000 dan mendapatkan 104.000 jadi saya menggunakan bilangan prima di bawah 10⁶ dan mendapatkan n pertama. Ini tidak benar-benar menjalankan, sehingga Anda harus menguji dengan mengganti
^T6
dengan^T3
dan membatasi n ke bawah 1000. Masukan dari stdin dan output ke stdout.sumber