Apakah kita perlu mempertahankan algoritme, atau hanya hasil akhirnya?
John Dvorak
Saya akan mulai saya di 2 menjadi sangat akurat, karena ini mencetak 0 dan 1.
histokrat
apakah Anda mencoba membuat kode dieksekusi lebih cepat atau mencoba menggunakan lebih sedikit karakter dalam kode sumber?
user3629249
1
Karena Anda meminta bantuan dengan golf, akan sangat membantu untuk memasukkan jumlah karakter dari solusi Anda saat ini di pos Anda (saya jadikan sebagai 89).
Mark Reed
Jawaban:
7
59 57 byte
Berdasarkan pada solusi @feersum tetapi pemeriksaan awal dapat dilakukan golf lebih lanjut
(Saya menulis ini tanpa menyadari batasan ukuran pada bilangan bulat di C, jadi sepertinya tidak berguna untuk memperpendek kode.)
Pertama, kata tentang algoritma. Sebelum bermain golf kode Anda, Anda harus memikirkan strategi keseluruhan terbaik untuk mendapatkan hasilnya.
Anda sedang memeriksa primality dengan melakukan pembagian trial - pengujian setiap potensi pembagi pdari i. Itu mahal dalam karakter karena butuh dua loop. Jadi, menguji keutamaan tanpa loop kemungkinan akan menyimpan karakter.
Pendekatan yang sering lebih pendek adalah dengan menggunakan Teorema Wilson : angkanya nprima jika dan hanya jika
fact(n-1)%n == n-1
di mana factfungsi faktorial. Karena Anda menguji semua kemungkinan ndari 1hingga 1000, mudah untuk menghindari penerapan faktorial dengan melacak produk yang sedang berjalan Pdan memperbaruinya dengan P*=nsetelah setiap loop. Inilah implementasi Python dari strategi ini untuk mencetak bilangan prima hingga satu juta.
Atau, fakta bahwa program Anda hanya memiliki hingga 1000 membuka strategi lain: tes primitif Fermat . Bagi sebagian orang a, setiap perdana nmemuaskan
pow(a,n-1)%n == 1
Sayangnya, beberapa komposit njuga lulus tes ini a. Ini disebut pseudoprim Fermat . Tetapi, a=2dan a=3jangan gagal bersama sampai n=1105, jadi cukuplah untuk tujuan Anda memeriksa bilangan prima sampai 1000. (Jika 1000 bukan 100, Anda hanya bisa menggunakan a=2.) Jadi, kami memeriksa primality dengan (kode ungolfed)
pow(2,n-1)%n == 1 and pow(3,n-1)%n == 1
Ini juga gagal mengenali bilangan prima 2 dan 3, jadi mereka harus menggunakan casing khusus.
Apakah pendekatan ini lebih pendek? Saya tidak tahu karena saya tidak kode dalam C. Tapi, itu adalah ide yang harus Anda coba sebelum Anda menyelesaikan sepotong kode untuk mulai menambah karakter.
Teorema Wilson tidak berguna dalam C karena ints adalah 32-bit. Hal yang sama berlaku untuk Fermat.
feersum
@feersum Oh, tembak. Itu masalah bagi faktorial juga. Apakah ada tipe big-int?
xnor
@ xnor Tidak terintegrasi.
Martin Ender
1
jika seseorang mendefinisikan fact(int n, int m) { return (n==0) ? 1 : (n*f(n-1)) % m; }maka hasilnya tidak akan meluap integer 32 bit untuk nilai yang bahkan cukup besar n. ( mis the modulus)
apnorton
@orton, saya pikir maksud Anda (n*fact(n-1,m)) % m. Yang menyoroti masalah: Anda tidak dapat menghindari rekursi dalam implementasi factkarena makan berbeda untuk setiap iterasi dari loop luar.
hvd
4
78 77 karakter
(Hanya menerapkan beberapa trik yang dipelajari dalam bahasa lain.)
int i=0,p,c;for(;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}
Jawaban:
5957 byteBerdasarkan pada solusi @feersum tetapi pemeriksaan awal dapat dilakukan golf lebih lanjut
Diedit berdasarkan komentar Runer112
sumber
d=p++%999
. Kalau tidak, ini pekerjaan golf terlihat cukup kedap udara!67 byte
Di C tidak ada alternatif nyata untuk divisi percobaan, tetapi tentu saja bisa sedikit golf.
Membutuhkan deklarasi awal C99, yang menghemat 1 byte.
sumber
(Saya menulis ini tanpa menyadari batasan ukuran pada bilangan bulat di C, jadi sepertinya tidak berguna untuk memperpendek kode.)
Pertama, kata tentang algoritma. Sebelum bermain golf kode Anda, Anda harus memikirkan strategi keseluruhan terbaik untuk mendapatkan hasilnya.
Anda sedang memeriksa primality dengan melakukan pembagian trial - pengujian setiap potensi pembagi
p
darii
. Itu mahal dalam karakter karena butuh dua loop. Jadi, menguji keutamaan tanpa loop kemungkinan akan menyimpan karakter.Pendekatan yang sering lebih pendek adalah dengan menggunakan Teorema Wilson : angkanya
n
prima jika dan hanya jikadi mana
fact
fungsi faktorial. Karena Anda menguji semua kemungkinann
dari1
hingga1000
, mudah untuk menghindari penerapan faktorial dengan melacak produk yang sedang berjalanP
dan memperbaruinya denganP*=n
setelah setiap loop. Inilah implementasi Python dari strategi ini untuk mencetak bilangan prima hingga satu juta.Atau, fakta bahwa program Anda hanya memiliki hingga 1000 membuka strategi lain: tes primitif Fermat . Bagi sebagian orang
a
, setiap perdanan
memuaskanSayangnya, beberapa komposit
n
juga lulus tes inia
. Ini disebut pseudoprim Fermat . Tetapi,a=2
dana=3
jangan gagal bersama sampain=1105
, jadi cukuplah untuk tujuan Anda memeriksa bilangan prima sampai 1000. (Jika 1000 bukan 100, Anda hanya bisa menggunakana=2
.) Jadi, kami memeriksa primality dengan (kode ungolfed)Ini juga gagal mengenali bilangan prima 2 dan 3, jadi mereka harus menggunakan casing khusus.
Apakah pendekatan ini lebih pendek? Saya tidak tahu karena saya tidak kode dalam C. Tapi, itu adalah ide yang harus Anda coba sebelum Anda menyelesaikan sepotong kode untuk mulai menambah karakter.
sumber
int
s adalah 32-bit. Hal yang sama berlaku untuk Fermat.fact(int n, int m) { return (n==0) ? 1 : (n*f(n-1)) % m; }
maka hasilnya tidak akan meluap integer 32 bit untuk nilai yang bahkan cukup besarn
. (m
is the modulus)(n*fact(n-1,m)) % m
. Yang menyoroti masalah: Anda tidak dapat menghindari rekursi dalam implementasifact
karenam
akan berbeda untuk setiap iterasi dari loop luar.7877 karakter(Hanya menerapkan beberapa trik yang dipelajari dalam bahasa lain.)
76 karakter dalam mode C99
sumber
58 karakter (atau 61 untuk program lengkap)
Penggunaan kembali jawaban saya untuk pertanyaan serupa .
EDIT : sepotong kode yang berdiri sendiri, tidak ada fungsi untuk memanggil.
Program lengkap:
sumber
6764 byteTerinspirasi oleh solusi Alchymist:
sumber