क्या इस 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);}
क्या इस 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);}
जवाबों:
59 57 बाइट्स
@ फ़ेर्सम समाधान पर आधारित है, लेकिन प्राइमलिटी चेक को आगे बढ़ाया जा सकता है
for(int p=1,d;d=p++%999;d||printf("%d\n",p))for(;p%d--;);
Runer112 की टिप्पणियों के आधार पर संपादित
d=p++%999। अन्यथा, यह सुंदर वायुरोधी गोल्फ का काम दिखता है!
(मैंने लिखा है कि यह सी में पूर्णांक पर आकार की सीमाओं को साकार नहीं करता है, इसलिए यह कोड को छोटा करने के लिए वास्तव में उपयोगी नहीं है।)
सबसे पहले, एल्गोरिथ्म के बारे में एक शब्द। अपना कोड गोल्फ करने से पहले, आपको परिणाम प्राप्त करने के लिए सबसे अच्छी समग्र रणनीति के बारे में सोचना चाहिए।
आप ट्रायल डिवीजन कर प्राइमलिटी की जाँच कर रहे हैं - प्रत्येक संभावित विभाजक 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 की पहचान करने में विफल रहता है, इसलिए उन लोगों को विशेष-आवरण की आवश्यकता होगी।
क्या ये दृष्टिकोण कम हैं? मुझे पता नहीं है क्योंकि मैं सी में कोड नहीं करता हूं। लेकिन, वे विचार हैं जिन्हें आपको वर्णों को बाहर निकालने के लिए कोड के एक टुकड़े पर बसने से पहले कोशिश करनी चाहिए।
ints 32-बिट हैं। फ़र्म के लिए वही जाता है।
fact(int n, int m) { return (n==0) ? 1 : (n*f(n-1)) % m; }तो परिणाम 32 बिट पूर्णांक को अति महत्वपूर्ण मान भी नहीं सकता है n। ( mमापांक है)
(n*fact(n-1,m)) % m। जो समस्या को उजागर करता है: आप कार्यान्वयन में factहोने वाली पुनरावृत्ति से बच नहीं सकते क्योंकि mबाहरी लूप के प्रत्येक पुनरावृत्ति के लिए अलग होगा।
(बस अन्य भाषाओं में सीखी गई कुछ ट्रिक्स लागू की गई हैं।)
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);}
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);}
इसी तरह के प्रश्न के लिए मेरे जवाब का एक और पुन: उपयोग ।
संपादित करें : स्टैंड-अलोन कोड टुकड़ा, कॉल करने के लिए कोई फ़ंक्शन नहीं।
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++);}
अल्छमिस्ट के समाधान से प्रेरित:
int i=1,p;for(;i++<1e3;p-i||printf("%d\n",i)){p=1;while(i%++p);}