प्रोग्राम जो अगले प्राइम नंबर को खोजेगा


15

परिचय:


आपने गलती से मज़े के लिए बनाए गए उपकरण के साथ समय के प्रवाह को दूषित कर दिया, जो कि टाइम मशीन बन गया। नतीजतन, आप दूर भविष्य के लिए धकेल दिया गया। आपको एहसास हुआ कि कंप्यूटिंग, प्रसंस्करण शक्ति और सामान्य रूप से कंप्यूटर एक बड़ी राशि द्वारा विकसित किए गए हैं, सटीक होने के लिए एक अनंत राशि है । तो आप अपने आप को अनंत स्मृति और प्रसंस्करण शक्ति के साथ एक कंप्यूटर पकड़ो। आपको पता नहीं है कि इसमें अनंत स्मृति और अनंत प्रसंस्करण शक्ति कैसे हो सकती है, लेकिन आप इसे स्वीकार करते हैं और वर्तमान में लौट आते हैं।

चुनौती:


आपने सुना है कि वर्तमान में सबसे बड़ी प्राइम की खोज करने वाले व्यक्ति को 2^74,207,281 − 1$ 100.000 भुगतान किया गया था। आप एक प्रोग्राम बनाने का निर्णय लेते हैं जो अगले प्राइम को पाता है, क्योंकि आप कंप्यूटर के लिए खर्च किए गए धन को वापस पाना चाहते हैं। आप एक नंबर का इनपुट लेते हैं, और अगला प्राइम नंबर ढूंढते हैं, या तो ब्रूटफोरिंग या किसी अन्य तरीके से।

स्पष्टता: आपके पास एक काल्पनिक मशीन है जिसमें अनंत मेमोरी और प्रोसेसिंग पावर है। आपका कार्यक्रम नहीं करना चाहिए सीमित हो (जैसे: से सी # के पूर्णांक के स्टोर कर सकते हैं -2,147,483,648करने के लिए 2,147,483,647), अच्छी तरह से अपने कार्यक्रम और किसी भी आकार के किसी भी संख्या के साथ काम करने की दुकान में सक्षम होना चाहिए। आपके पास अनंत संसाधन हैं, इसलिए आपको ध्यान रखना चाहिए कि क्या आप स्मृति से बाहर निकलेंगे यदि आपने अनुमति दी है।

उदाहरण I / O:
इनपुट: वर्तमान में सबसे बड़ी खोज 22,338,618 अंकों के साथ की गई।
आउटपुट: बिल्कुल अगले प्राइम

जाहिर है, आपको यह साबित करने की ज़रूरत नहीं है कि यह काम करता है, क्योंकि यह एक भौतिक मशीन में गणना करने में एक टन का समय लगेगा। लेकिन अगर आप अपने प्रोग्राम को अनंत प्रोसेसिंग पावर / मेमोरी वाले काल्पनिक मशीन में स्थानांतरित कर देते हैं, तो इसे तुरंत गणना करनी चाहिए।


अगले प्राइम को खोजना और जांचना कि क्या कोई संख्या एक प्राइम है, दो पूरी तरह से अलग चीजें हैं


1
क्या इसे विशेष रूप से अगला प्रमुख होना चाहिए ? बड़े प्राइम के लिए बहुत सारे प्राइम सर्चिंग एल्गोरिदम केवल कुछ प्रकार की संख्याएँ खोजते हैं और इसलिए कभी-कभी प्राइम मिस कर देते हैं ...
FlipTack

10
मुझे लगता है कि आपको कुछ गंभीर परीक्षण मामलों को जोड़ना चाहिए।
FlipTack

3
" आपका कार्यक्रम सीमित नहीं होना चाहिए " लेकिन उदाहरण के आधार पर मुझे संदेह है कि अस्तित्व में हर एक भाषा सीमित है क्योंकि स्मृति को संबोधित करने के लिए एक सीमित प्रकार का उपयोग करने के अलावा कोई अन्य कारण फिट नहीं है।
पीटर टेलर


2
@ mbomb007 क्यों? बिलियन को छोड़कर सभी के जवाब केवल एक अतिरिक्त आवरण जोड़ने के लिए देखे गए।
पोस्ट रॉक गार्फ हंटर

जवाबों:



8

अजगर ३ , 45 बाइट्स

f=lambda n,k=1,m=1:m%k*k>n or-~f(n,k+1,m*k*k)

इसे ऑनलाइन आज़माएं!


3
मेरा मानना ​​है कि यह विल्सन का प्रमेय है। kअंतिम परिणाम के बराबर है, mहोता है (k-1)!^2। चूंकि (k-1)! = -1 mod k केवल तभी पकड़ता है जब k अभाज्य है, हमारे पास (k-1)! (K-1) है! = 1 mod k, जो कि k से गुणा करने पर k स्वयं होगा। (K-1) के एकमात्र अपवाद से छुटकारा पाने के लिए आप वर्ग की गणना करते हैं! मिश्रित k के लिए = 0 mod k, जो k = 4. के लिए होता है?
orlp

हां यह सही है।
डेनिस

इसके लिए फेंकता RecursionError: maximum recursion depth exceeded in comparisonहैf(1000)
ovs

5
@ovs प्रश्न कहता है कि हमारे पास असीम स्मृति है। इसलिए हम एक असीम उच्च पुनरावृत्ति गहराई सीमा मान सकते हैं, और इस तरह के बारे में चिंता नहीं करते हैं RecursionError
FlipTack

6

पायथन 2, 78 77 76 74 बाइट्स

def f(n):
 while 1:
    n+=1
    if[i for i in range(1,n)if n%i<1]==[1]:return n

-1 बाइट की बदौलत @KritiiLithos
-1 बाइट की बदौलत @FlipTack
-2 बाइट्स की बदौलत @EPPedro को धन्यवाद


n%i<1की तुलना में कम हैn%i==0
क्रिति लिथोस

उसके बाद आपको व्हाट्सएप की जरूरत नहीं है if
फ्लिपकार्ट

मुझे लगता है कि आपका मतलब है<1
जोनाथन एलन

मुझे लगता है कि आप दूसरे स्तर के संकेत के लिए 2 स्थानों के बजाय एक टैब का उपयोग कर सकते हैं लेकिन मैं फिलहाल परीक्षण नहीं कर सकता।
ElPedro

1
@ElPedro सही है। आप टैब में n+=1और उसके सामने 2 रिक्त स्थान बदल सकते हैं ifऔर 2 बाइट्स बचा सकते हैं



4

बैश + कोरुटिल्स, 52 बाइट्स

for((n=$1,n++;`factor $n|wc -w`-2;n++)){ :;};echo $n

इसे ऑनलाइन आज़माएं!

बैश और कारक के लिए प्रलेखन अधिकतम पूर्णांक मान निर्दिष्ट नहीं करता है जिसे वे संभाल सकते हैं (हालांकि, व्यवहार में, प्रत्येक कार्यान्वयन में अधिकतम पूर्णांक मान होता है)। संभवतः, आपके असीम रूप से बड़ी मशीनों पर भविष्य के GNU में, बैश और कारक में असीमित आकार के पूर्णांक होंगे।


वास्तव में डॉक्स फ़ैक्टर के लिए निर्दिष्ट करते हैं कि अगर ग्नू एमपी के बिना बनाया गया है तो केवल एकल-परिशुद्धता समर्थित है।
दानी_ल

1
@ डैनी_ल वेल, बैश के लिए आदमी की प्रविष्टि केवल यह कहती है: "मूल्यांकन तयशुदा-चौड़ाई पूर्णांक में किया जाता है, जिसमें अतिप्रवाह के लिए कोई जांच नहीं होती है, हालांकि 0 से विभाजन फंस जाता है और एक त्रुटि के रूप में चिह्नित किया जाता है।" यह चौड़ाई निर्दिष्ट नहीं करता है। (जैसा कि मुझे याद है, मेरी मशीनों पर बैश का स्टॉक कार्यान्वयन 64-बिट हस्ताक्षरित पूर्णांक का उपयोग करता है, लेकिन मैं अभी जांच नहीं कर सकता।) कारक के रूप में, यह निश्चित रूप से अपडेट किया जाएगा: अनंत संसाधनों वाले ओपी के भविष्य के कंप्यूटरों में कारक होगा असीमित सटीकता पाने के लिए gnu_up के साथ संकलित :)।
मिशेल स्पेक्टर

3

मैक्सिमा, 10 बाइट्स

next_prime

एक फ़ंक्शन अपने तर्क की तुलना में सबसे छोटा प्रधान लौटाता है।



3

सिम्पी के साथ अजगर, 28 बाइट्स

import sympy
sympy.nextprime

sympy.nextprimeएक कार्य है जो टिन पर यह कहता है। सभी झांकियों के लिए काम करता है।

repl.it


पायथन, 66 59 बाइट्स

-4 बाइट्स लिन के लिए धन्यवाद (उपयोग -~)
-3 बाइट्स फ्लिपकैक के लिए धन्यवाद (उपयोग andऔर or, ...==1एक ...-1शर्त पर स्विच करने की अनुमति देता है ।)

f=lambda n:sum(-~n%-~i<1for i in range(n))-1and f(n+1)or-~n

repl.it

एक पुनरावर्ती कार्य जो nतब तक गिनता है जब तक कि एक प्रमुख परीक्षण से नहीं मिलता है कि केवल एक संख्या तक मौजूद हैn-1 जो इसे विभाजित करता है (यानी 1)। सभी पूर्णांकों के लिए काम करता है, फ़्लोट के लिए एक त्रुटि उठाता है।

2.7.8 और 3.5.2 पर काम करता है, 3.3.3 पर काम नहीं करता है (बीच में जगह की कमी के कारण सिंटैक्स त्रुटि ) ==1औरelse


(n+1)%(i+1)-~n%-~iमुझे लगता है ,
लिन

यह है, धन्यवाद ... मैं विल्सन के प्रमेय का उपयोग करके एक छोटा करने की कोशिश कर रहा था।
जोनाथन एलन

क्या छोटी-मोटी परिक्रमा and/ orकाम, जैसे f=lambda n:sum(-~n%-~i<1for i in range(n))==1and-~n or f(n+1)?
FlipTack

वास्तव में, कि ^ f=lambda n:sum(-~n%-~i<1for i in range(n))-1and f(n+1)or-~n
FlipTack

@ फीलटैक मैं मूल रूप से उनसे बचता था ताकि यह शून्य से गुजर सके, लेकिन यह काम करेगा - यह एक तीन बाइट बचा है!
जोनाथन एलन

2

पायथन, 114 83 बाइट्स

def g(b):
 while 1:
  b+=1
  for i in range(2,b):
   if b%i<1:break
  else:return b

बिना किसी निर्माण के, यदि कोई हो।

-30 सफेद स्थान को निकाल और -1 को बदल कर b%i==0करने के लिएb%i<1


3
यह अगले प्रधानमंत्री नहीं मिलेगा अगर आप में डाल1
FlipTack

अब यह मानता है कि b> 2
sagiksp

आप केवल अपने नियम नहीं बना सकते हैं ... आपको चुनौती विनिर्देश का पालन करने की आवश्यकता है। कहीं यह नहीं कहता कि आप इनपुट की सीमा को मान सकते हैं।
फ्लिपकार्ट

यहां तक ​​कि उस धारणा के साथ, यह सभी मूल्यवान आदानों के लिए भी विफल रहता है।
११

मैं एक बेवकूफ हूं, मैंने इसे गलत समझा। ठीक कर दिया। @ फीलटैक
१२

2

पर्ल 6 , 25 बाइट्स

{first *.is-prime,$_^..*}

यह काम किस प्रकार करता है

{                       }  # A lambda.
                  $_ ..*   # Range from the lambda argument to infinity,
                    ^      # not including the start point.
 first           ,         # Iterate the range and return the first number which
       *.is-prime          # is prime.

पर्ल 6 , 32 बाइट्स

{first {all $_ X%2..^$_},$_^..*}

अकुशल कस्टम मौलिकता परीक्षण के साथ।

यह काम किस प्रकार करता है

बाहरी संरचना ऊपर की तरह ही है, लेकिन यह firstतय करने के लिए पारित किया गया (यह तय करने के लिए कि क्या एक दी गई संख्या प्रमुख है), अब है:

{               }  # A lambda.
     $_            # Lambda argument (number to be tested).
          2..^$_   # Range from 2 to the argument, excluding the end-point.
        X          # Cartesian product of the two,
         %         # with the modulo operator applied to each pair.
 all               # Return True if all the modulo results are truthy (i.e. non-0).

मैं के साथ कुछ कम पाने के लिए उम्मीद कर रही थी पर्ल 5 निर्मित एक हरा लेकिन यह मुश्किल है .is-prime);
ज़ैद

2

Pyke, 8 7 बाइट्स

~p#Q>)h

यहाँ यह कोशिश करो!

4 बाइट्स, नॉनकमेटिंग

(व्याख्याकार ने पोस्ट किए गए चैलेंज के बाद अपडेट किया)

~p<h

यहाँ यह कोशिश करो!

~p   -   primes_iterator()
  <  -  filter(^, input() < i)
   h - ^[0]

दूसरा नॉनकंपेटिंग क्यों? मुझे पर्याप्त समझ नहीं है।
theonlygusti

@Theonlygusti: आमतौर पर, यहां जमा न होने वाले एक अंक को चिह्नित करने का एकमात्र वैध कारण (जैसा कि इसे बिलकुल प्रस्तुत नहीं करने का विरोध किया जाता है) क्योंकि आपने बग को ठीक कर दिया है या कार्यक्रम में लिखित भाषा में एक सुविधा जोड़ दी है, और इससे आपको चुनौती मिली है । (मैं इसे "भाषा पोस्टडेट्स चैलेंज" के रूप में अधिक स्पष्ट होने के लिए

@theonlygusti ने स्पष्ट किया
ब्लू


1

05AB1E , 16 13 बाइट्स (Emigna @ -3 बाइट्स)

2•7£?ÿ•o[>Dp#

इसे ऑनलाइन आज़माएं!

2•7£?ÿ•o        # Push current largest prime.
        [   #    # Until true..
         >Dp    # Increment by 1, store, check primality.
                # After infinite loop, implicitly return next prime.

[>Dp#काम नहीं करेगा ?
एमिग्ना

आप अभी भी 8 और बाइट्स काट सकते हैं क्योंकि प्रोग्राम को इनपुट के रूप में प्राइम लेना चाहिए और अगले प्राइम को आउटपुट करना चाहिए।
इमिग्ना

@ एमिग्ना तो यह प्रश्न एक डुप्लिकेट है।
मैजिक ऑक्टोपस Urn

यह संभव है हाँ।
इमीना

1

पर्ल, 30 बाइट्स (29 +1 -p):

(1x++$_)=~/^(11+?)\1+$/&&redo

प्रयोग

रिटर्न दबाने के बाद नंबर पर इनपुट करें (नीचे उदाहरण में इनपुट 12345, आउटपुट 12347):

$ perl -pe '(1x++$_)=~/^(11+?)\1+$/&&redo'
12345
12347

यह काम किस प्रकार करता है

  • 1लंबाई है ++$_, जहां की एक स्ट्रिंग को परिभाषित करें$_ शुरू में इनपुट मूल्य है की
  • Regex यह देखने के लिए जांचता है कि क्या 1s का स्ट्रिंग नॉन-प्राइम लेंथ है ( यहाँ बताया गया है )।
  • यदि स्ट्रिंग की लंबाई गैर-प्रधान है, तो चेक का अगले पूर्णांक के लिए पुनर्मूल्यांकन किया जाता है (++$_ )
  • यदि स्ट्रिंग की लंबाई प्रधान है, तो निहित whileलूप बाहर निकलता है और -pमूल्य को प्रिंट करता है$_
  • नोट: "1"लंबाई 1 के किनारे के मामले को संभालने की कोई आवश्यकता नहीं है क्योंकि इसका उपयोग 1विनिर्देश के अनुसार मान से कम के लिए कभी नहीं किया जाएगा ।

1

जावा 7, 373 343 334 303 268 बाइट्स

import java.math.*;class M{public static void main(String[]a){BigInteger n,i,o,r=new BigInteger(a[0]);for(r=r.add(o=r.ONE);;r=r.add(o)){for(n=r,i=o.add(o);i.compareTo(n)<0;n=n.mod(i).compareTo(o)<0?r.ZERO:n,i=i.add(o));if(n.compareTo(o)>0)break;}System.out.print(r);}}

-75 बाइट्स धन्यवाद @Poke

Ungolfed:

import java.math.*;
class M{
  public static void main(String[] a){
    BigInteger n,
               i,
               o,
               r = new BigInteger(a[0]);
    for(r = r.add(o = r.ONE); ; r = r.add(o)){
      for(n = r, i = o.add(o); i.compareTo(n) < 0; n = n.mod(i).compareTo(o)< 0
                                                        ? r.ZERO
                                                        : n,
                                                   i = i.add(o));
      if(n.compareTo(o) > 0){
        break;
      }
    }
    System.out.print(r);
  }
}

इसे यहाँ आज़माएँ।

कुछ उदाहरण इनपुट / आउटपुट:

7 -> 11
1609 -> 1613
104723 -> 104729

@ प्रोक मैंने staticक्षेत्र और विधि के लिए जोड़कर एक और 31 बाइट्स गढ़ी हैं p, लेकिन विधि cऔर pपैरामीटर को हटा रहा हूं ।
केविन क्रूज़सेन

0

QBIC , 34 बाइट्स

:{a=a+1[2,a/2|~a%b=0|b=a]]~a<b|_Xa

इस QBIC मौलिकता परीक्षक के आधार पर । स्पष्टीकरण:

:{a=a+1    Read 'a' from the command line, start an infinite loop 
           and at the start of each iteration increment 'a'
[2,a/2|    FOR b = 2, b <= a/2, b++
~a%b=0|    IF b cleanly divides a, we're no prime
b=a]]      so, break out of the FOR loop ( ]] = End if, NEXT )
~a<b|      If the FOR loop completed without breaking
_Xa        then quit, printing the currently tested (prime) number
           The second IF and the DO-loop are implicitly closed by QBIC.

0

जावास्क्रिप्ट (ईएस 7), 61 बाइट्स

a=>{for(;a++;){for(c=0,b=2;b<a;b++)a%b||c++;if(!c)return a;}}

प्रयोग

f=a=>{for(;a++;){for(c=0,b=2;b<a;b++)a%b||c++;if(!c)return a;}}
f(2)

उत्पादन

3

अच्छा है, लेकिन मुझे नहीं लगता कि यह काम करेगा, क्योंकि जावास्क्रिप्ट स्वयं (कंप्यूटर नहीं) केवल 2 ^ 53 के बाद परिशुद्धता खो देगा।
ETHproductions

आप सही हैं, लेकिन मुझे नहीं लगता कि इस सीमा को टाला जा सकता है, भले ही हम किसी सरणी में 32 बिट्स के भाग में संख्या को विभाजित करें, क्योंकि अंततः, संख्या को एक पूरे के रूप में संसाधित करने की आवश्यकता है। यदि आपके पास इसे हल करने के बारे में कोई विचार है, तो कृपया मुझे बताएं।
ल्यूक

1
मनमाने ढंग से सटीक गणित के लिए जेएस लाइब्रेरी हैं - मैंने कुछ बिंदु पर एक भी बनाया है - इसलिए मुझे यकीन है कि यह संभव है। अगली बार जब मैं अपने कंप्यूटर पर जाऊंगा, तो मैं
जाऊंगा

मैंने कुछ गुगली की, और यह दिलचस्प लगता है। मैं इसे भी एक गोली मार देंगे।
ल्यूक

0

MATL, 3 बाइट्स

_Yq 

फ़ंक्शन Yqइनपुट के निरपेक्ष मान का अगला प्रमुख लौटाता है यदि इनपुट नकारात्मक है तो हम इनपुट को गलत तरीके से पकड़ते हैं, इसे नकारते हैं ( _) और अगले प्राइम का उपयोग कर पाते हैं Yq

इसे ऑनलाइन आज़माएं!


0

हास्केल, 42 46 43 बाइट्स

f n=[i|i<-[n..],all((>0).rem i)[2..i-1]]!!1

जानवर बल के लिए सामान्य कोड।

बेशक यह अगले पाता है बाद का सबसे छोटा प्राइम नंबरn । कोई सबसे बड़ा प्राइम नहीं है।

एन के लिए काम करता है > 0 के

संपादित करें: मान लें nकि प्राइम है। @Laikoni की टिप्पणियों में धन्यवाद ।


आप को बदल कर एक बाइट बचा सकता है head[...]के साथ [...]!!0। हालाँकि मुझे लगता है कि कोई भी ऐसा मान सकता है जो nप्रमुख है, इसलिए आप [n..]इसके बजाय उपयोग कर सकते हैं [n+1..]और फिर दूसरे तत्व को ले सकते हैं [...]!!1
लिकोनी

0

SimpleTemplate, 132 बाइट्स

एल्गोरिथ्म भयानक है, क्योंकि मुझे यह जांचने के लिए अपना कोड करना होगा कि कोई नंबर प्राइम है या नहीं।
यह भयानक साबित हुआ, लेकिन काम करता है।

{@setY argv.0}{@setX 1}{@whileX}{@setX}{@set+T Y,-1}{@for_ from2 toT}{@ifY is multiple_}{@incX}{@/}{@/}{@ifX}{@incY}{@/}{@/}{@echoY}

परिणाम को आउटपुट करते हुए, पहले तर्क के रूप में संख्या प्राप्त करता है।


Ungolfed:

{@set number argv.0}
{@set remainder 1}
{@while remainder}
    {@set remainder 0}
    {@set+ tmp number, -1}
    {@for divisor from 2 to tmp}
        {@if number is multiple divisor}
            {@inc by 1 remainder}
        {@/}
    {@/}
    {@if remainder}
        {@inc by 1 number}
    {@/}
{@/}
{@echo number}

उस आखिरी को हटाने के बारे में कोई सुझाव @if?


0

लुआ, 876 बाइट्स

function I(a)a.s=a.s:gsub("(%d)(9*)$",function(n,k)return tostring(tonumber(n)+1)..("0"):rep(#k)end)end function D(a)a.s=a.s:gsub("(%d)(0*)$",function(n,k)return tostring(tonumber(n)-1)..("9"):rep(#k)end):gsub("^0+(%d)","%1")end function m(a,b)local A=K(a)local B=K(b)while V(0,B)do D(A)D(B)end return A end function M(a,b)local A=K(a)local B=K(b)while V(m(B,1),A)do A=m(A,B)end return A end function l(n)return#n.s end function p(a)local A=K(a)local i=K(2)while V(i,A)do if V(M(A,i),1)then return false end I(i)end return true end function V(b,a)A=K(a)B=K(b)if l(A)>l(B)then return true end if l(B)>l(A)then return false end for i=1,l(A)do c=A.s:sub(i,i)j=B.s:sub(i,i)if c>j then return true elseif c<j then return false end end return false end function K(n)if(type(n)=='table')then return{s=n.s}end return{s=tostring(n)}end P=K(io.read("*n"))repeat I(P)until p(P)print(P.s)

कुछ अन्य भाषाओं के विपरीत, लुआ में अधिकतम इंटेगर का आकार होता है। एक बार एक संख्या 2 32 से बड़ी हो जाती है , तो चीजें सही तरीके से काम करना बंद कर देती हैं, और लुआ सटीक मानों के बजाय अनुमान लगाने की कोशिश करना शुरू कर देता है।

जैसे, मुझे संख्याओं को संग्रहीत करने की एक नई विधि को लागू करना था, विशेष रूप से, मैंने उन्हें बेस 10 स्ट्रिंग्स के रूप में संग्रहीत किया है, क्योंकि लूआ में मेमोरी के आकार के अलावा स्ट्रिंग्स पर एक आकार सीमा नहीं है।

मुझे लगता है कि यह उत्तर प्रश्न की आत्मा के लिए बहुत अधिक है, क्योंकि इसमें स्वयं को मनमाने ढंग से सटीक पूर्णांकों को लागू करना है, साथ ही साथ एक प्रमुख परीक्षा भी है।

व्याख्या की

-- String Math
_num = {}

_num.__index = _num

-- Increase a by one.
-- This works by grabbing ([0-9])999...$ from the string.
-- Then, increases the first digit in that match, and changes all the nines to zero.
-- "13", only the "3" is matched, and it increases to 1.
-- "19", firstly the 1 is turned to a 2, and then the 9 is changed to a 0.
-- "9" however, the 9 is the last digit matched, so it changes to "10"
function _num.inc(a)
    a.str = a.str:gsub("(%d)(9*)$",function(num,nines)
            return tostring(tonumber(num)+1)..("0"):rep(#nines)
        end)
end


-- Decrease a by one
-- Much like inc, however, uses ([0-9])0...$ instead.
-- Decrements ([0-9]) by one and sets 0... to 9...
-- "13" only the "3" is matched, and it decreases by one.
-- "10", the "1" is matched by the ([0-9]), and the 0 is matched by the 0..., which gives 09, which is clipped to 9.
function _num.dec(a)
    a.str = a.str:gsub("(%d)(0*)$",function(num,zeros)
        return tostring(tonumber(num)-1)..("9"):rep(#zeros)
    end)         :gsub("^0+(%d)","%1")
end

-- Adds a and b
-- Makes A and B, so that the original values aren't modified.
-- B is then decremented until it hits 0, and A is incremented.
-- A is then returned.
function _num.__add(a,b)
    local A = str_num(a)
    local B = str_num(b)
    while B > 0 do
        A:inc()
        B:dec()
    end
    return A
end

-- Subs b from a
-- Works just like Addition, yet Dec's A instead of Incs.
function _num.__sub(a,b)
    local A = str_num(a)
    local B = str_num(b)
    while B > 0 do
        A:dec()
        B:dec()
    end
    return A
end

-- A % B
-- Makes A and B from a and b
-- Constantly subtracts B from A until A is less than B
function _num.__mod(a,b)
    local A = str_num(a)
    local B = str_num(b)
    while A >= B do
        A = A - B
    end
    return A
end

-- #a
-- Useful for golfiness
function _num.__len(n)
    return #n.str
end

-- Primacy Testing
-- Generates A from a and i from 2.
-- Whilst i is less than A, i is incremented by one, and if A % i == 0, then it's not a prime, and we return false.
-- Once that finishes, we return true.
function _num.isprime(a)
    local A = str_num(a)
    local i = str_num(2)
    while i < A do
        if A%i < 1 then
            return false
        end
        i:inc()
    end
    return true
end

-- b < a
-- A and B are generated from a and b
-- Fristly, if the length of A and B aren't equal, then that result is output.
-- Otherwise, each character is searched from left to right, the moment they are unequal, the difference is output.
-- If all the characters match, then it's equal. Return false.
function _num.__lt(b,a)
    A=str_num(a)
    B=str_num(b)
    if #A > #B then
        return true
    end
    if #B > #A then
        return false
    end
    for i=1, #A.str do
        As = A.str:sub(i,i)
        Bs = B.str:sub(i,i)
        if As > Bs then
            return true
        elseif As < Bs then
            return false
        end
    end
    return false
end


-- b <= a
-- Same as b < a, but returns true on equality.
function _num.__le(b,a)
    A=str_num(a)
    B=str_num(b)
    if #A > #B then
        return true
    end
    if #B > #A then
        return false
    end
    for i=1, #A.str do
        As = A.str:sub(i,i)
        Bs = B.str:sub(i,i)
        if As > Bs then
            return true
        elseif As < Bs then
            return false
        end
    end
    return true
end

-- Just straight up returns it's string component. Endlessly faster than the int equivalent, mostly because it never is anything _but_ the string form.
function _num.__tostring(a)
    return a.str
end

-- Just set up the metatable...
function str_num(n)
    if(type(n)=='table')then
        return setmetatable({str = n.str}, _num)
    end
    return setmetatable({str = tostring(n)}, _num)
end

-- Generate a new str_num from STDIN
Prime = str_num(io.read("*n"))

-- This is handy, because it will call Prime:inc() atleast once, and stop at the next prime number it finds.
-- Basically, if it weren't for all that overhead of making the math possible, that's all this would be.
repeat
    Prime:inc()
until Prime:isprime()
print(Prime)

यद्यपि उपरोक्त मेटाबेबल्स का उपयोग करता है, बजाय वास्तविक उत्तर जैसे नियमित कार्यों के, जो छोटे काम करते थे।


0

रूबी, 28 + 6 = 34 बाइट्स

-rprimeझंडे का उपयोग करता है ।

f=->i{i+=1;i.prime??i :f[i]}

31 + 6 = 37 बाइट्स के लिए गैर-पुनरावर्ती संस्करण:

->i{i+=1;i+=1 while i.prime?;i}

0

पायथन + प्राइमैक , 34 32 बाइट्स

उपयोग करने में उतना छोटा नहीं है sympy(दूसरा उत्तर पहले से उपयोग करता है), लेकिन यह अभी भी बहुत छोटा है, और यह बहुत तेज़ है।

import primefac as p
p.nextprime

इसे ऑनलाइन आज़माएं

2**2000कुछ सेकंड में पूरा होने का इनपुट ।


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