0 से 1000 तक सभी primes


9

क्या इस C कोड को छोटा करना संभव है? यह 0 से 1000 तक के सभी प्रिंटों को प्रिंट करता है।

सी, 89 वर्ण

int i,p,c;for(i=2;i<1e3;i++){c=0;for(p=2;p<i;p++)if(i%p==0)c++;if(c==0)printf("%u\n",i);}

6
बस कुछ "हम भाषा-विशिष्ट चुनौतियां नहीं चाहते हैं" को पूर्व-खाली करने के लिए, कुछ कोड को नीचे लाने में मदद के लिए पूछना विषय पर है और चुनौतियों से अलग कहानी है।
मार्टिन एंडर 20

4
क्या हमें एल्गोरिथ्म, या केवल अंतिम परिणाम को संरक्षित करने की आवश्यकता है?
जॉन ड्वोरक 20

मैं 2 पर शुरू करूँगा सख्ती से सटीक होने के लिए, क्योंकि यह प्रिंट 0 और 1.
histocrat

क्या आप कोड को तेज़ी से निष्पादित करने का प्रयास कर रहे हैं या स्रोत कोड में कम वर्णों का उपयोग करने की कोशिश कर रहे हैं?
user3629249

1
चूंकि आप गोल्फ के साथ सहायता के लिए पूछ रहे हैं, इसलिए आपकी वर्तमान समाधान की चरित्र गणना को अपनी पोस्ट में शामिल करना सहायक होगा (मैं इसे 89 के रूप में बनाता हूं)।
मार्क रीड 20

जवाबों:


7

59 57 बाइट्स

@ फ़ेर्सम समाधान पर आधारित है, लेकिन प्राइमलिटी चेक को आगे बढ़ाया जा सकता है

for(int p=1,d;d=p++%999;d||printf("%d\n",p))for(;p%d--;);

Runer112 की टिप्पणियों के आधार पर संपादित


2
बाध्य जांच में थोड़ा और अधिक golfed जा सकता है: d=p++%999। अन्यथा, यह सुंदर वायुरोधी गोल्फ का काम दिखता है!
Runer112

10

67 बाइट्स

सी में ट्रायल डिवीजन के लिए कोई वास्तविक विकल्प नहीं है, लेकिन यह निश्चित रूप से थोड़ा गोल्फ हो सकता है।

for(int p=1,d;p++<999;d&&printf("%d\n",p))for(d=p;--d>1;)d=p%d?d:1;

C99 प्रारंभिक घोषणाओं की आवश्यकता है, जो 1 बाइट बचाता है।


6

(मैंने लिखा है कि यह सी में पूर्णांक पर आकार की सीमाओं को साकार नहीं करता है, इसलिए यह कोड को छोटा करने के लिए वास्तव में उपयोगी नहीं है।)

सबसे पहले, एल्गोरिथ्म के बारे में एक शब्द। अपना कोड गोल्फ करने से पहले, आपको परिणाम प्राप्त करने के लिए सबसे अच्छी समग्र रणनीति के बारे में सोचना चाहिए।

आप ट्रायल डिवीजन कर प्राइमलिटी की जाँच कर रहे हैं - प्रत्येक संभावित विभाजक pका परीक्षण i। यह पात्रों में महंगा है क्योंकि इसमें दो लूप लगते हैं। तो, एक लूप के बिना primality का परीक्षण करने से पात्रों को बचाने की संभावना है।

विल्सन के प्रमेय का उपयोग करने के लिए अक्सर कम दृष्टिकोण होता है : संख्या nप्रधान है यदि और केवल यदि

fact(n-1)%n == n-1

factतथ्यात्मक कार्य कहां है। आप सभी संभावित परीक्षण कर रहे हैं के बाद से nसे 1करने के लिए 1000, इसे चलाने उत्पाद का ट्रैक रखने के द्वारा भाज्य को लागू करने से बचने के लिए आसान है Pऔर द्वारा इसे अपडेट करने P*=nप्रत्येक पाश के बाद। यहां एक लाख तक प्राइम्स छापने की इस रणनीति का पायथन कार्यान्वयन है

वैकल्पिक रूप से, तथ्य यह है कि आपके कार्यक्रम को केवल 1000 तक सही होना है, एक और रणनीति को खोलता है: त्वचा की प्राचीर परीक्षण । कुछ के लिए a, प्रत्येक प्रधान nसंतुष्ट करता है

pow(a,n-1)%n == 1

दुर्भाग्य से, कुछ कंपोजिट कुछ के लिए nभी यह परीक्षा पास करते हैं a। इन्हें Fermat pseudoprimes कहा जाता है । लेकिन, a=2और a=3जब तक n=1105वे एक साथ विफल नहीं होते हैं , इसलिए वे 1000 तक प्रिम्स की जांच करने के आपके उद्देश्य के लिए पर्याप्त हैं। (यदि 1000 के बजाय 100 थे, तो आप केवल उपयोग कर पाएंगे a=2।) तो, हम (ungolfed कोड) के साथ primality की जांच करते हैं ।

pow(2,n-1)%n == 1 and pow(3,n-1)%n == 1

यह भी 2 और 3 की पहचान करने में विफल रहता है, इसलिए उन लोगों को विशेष-आवरण की आवश्यकता होगी।

क्या ये दृष्टिकोण कम हैं? मुझे पता नहीं है क्योंकि मैं सी में कोड नहीं करता हूं। लेकिन, वे विचार हैं जिन्हें आपको वर्णों को बाहर निकालने के लिए कोड के एक टुकड़े पर बसने से पहले कोशिश करनी चाहिए।


1
विल्सन की प्रमेय C में उपयोगी नहीं है क्योंकि ints 32-बिट हैं। फ़र्म के लिए वही जाता है।
फेर्सुम

@ Faersum ओह, शूट करें। यह तथ्य के लिए भी एक समस्या है। क्या कोई बड़ा-इंट-टाइप है?
xnor

@xnor अंतर्निहित नहीं है।
मार्टिन एंडर

1
यदि कोई परिभाषित करता है, fact(int n, int m) { return (n==0) ? 1 : (n*f(n-1)) % m; }तो परिणाम 32 बिट पूर्णांक को अति महत्वपूर्ण मान भी नहीं सकता है n। ( mमापांक है)
एपनॉर्टन

@anorton मुझे लगता है कि आपका मतलब है (n*fact(n-1,m)) % m। जो समस्या को उजागर करता है: आप कार्यान्वयन में factहोने वाली पुनरावृत्ति से बच नहीं सकते क्योंकि mबाहरी लूप के प्रत्येक पुनरावृत्ति के लिए अलग होगा।
hvd

4

78 77 वर्ण

(बस अन्य भाषाओं में सीखी गई कुछ ट्रिक्स लागू की गई हैं।)

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);}

C99 मोड में 76 अक्षर

for(int i=0,p,c;i<1e3;i++){c=0;for(p=2;p<i;)c+=i%p++<1;c||printf("%u\n",i);}

2

58 वर्ण (या एक पूर्ण कार्यक्रम के लिए 61)

इसी तरह के प्रश्न के लिए मेरे जवाब का एक और पुन: उपयोग ।
संपादित करें : स्टैंड-अलोन कोड टुकड़ा, कॉल करने के लिए कोई फ़ंक्शन नहीं।

for(int m,n=2;n<999;m>1?m=n%m--?m:n++:printf("%d\n",m=n));

पूरा कार्यक्रम:

n=2;main(m){n<999&&main(m<2?printf("%d\n",n),n:n%m?m-1:n++);}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.