यह एक प्रमुख है? w / o गणित [बंद]


14

किसी भी भाषा में एक प्रोग्राम या फ़ंक्शन लिखें जो बताता है कि इनपुट एक प्रमुख संख्या है।

  • इनपुट एक स्ट्रिंग है जो आधार -10 में एक प्राकृतिक संख्या का प्रतिनिधित्व करता है।
  • आउटपुट दो स्ट्रिंग्स में से एक है "प्राइम" या "नॉट !!" जो इनपुट की सही पहचान करता है।
  • अंकगणित ऑपरेटर, बिट-बुद्धिमान ऑपरेटर, संख्यात्मक चर और स्थिरांक, सामान्य रूप से "गणित-सामान" आदि ... आपके कार्यक्रम में कहीं भी अनुमति नहीं है। आपको सभी आवश्यक "गणना" करने के लिए स्ट्रिंग ऑपरेशन का उपयोग करना चाहिए ।
  • यदि आप नहीं करते हैं तो आप स्ट्रिंग की लंबाई (जो संख्याएँ हैं) - लेकिन -10 की तुलना अपने स्कोर से कर सकते हैं।
  • आपके कार्यक्रम को किसी भी लंबाई के इनपुट (पर्याप्त मेमोरी और समय को देखते हुए) पर काम करना चाहिए।
  • सबसे कम बाइट काउंट (UTF-8) जीतता है।

संख्या पर सीमा क्या है? क्या यह नकारात्मक हो सकता है? शून्य? क्या इसमें दशमलव बिंदु हो सकता है?
जस्टिन

यदि इसके बोनस अंक हैं, तो यह कोड-गोल्फ नहीं है
पीटर टेलर

इनपुट पर सीमा निर्दिष्ट करने के लिए "प्राकृतिक" जोड़ा गया।
वैली

मैं कुछ पागल स्पष्ट स्ट्रिंग हेरफेर के साथ आश्चर्यचकित होने की उम्मीद कर रहा था (मैं व्यक्तिगत रूप से एक स्ट्रिंग "डिक्रीमेंट" के लिए कोड लिखने के बारे में सोच रहा था ताकि मैं लूप कर सकूं - और मैं स्ट्रिंग लंबे विभाजन और बार-बार स्ट्रिंग घटाव के बीच फटा था ...), इसके बजाय मैं उस शांत छोटे रेगेक्स के साथ आश्चर्यचकित था मुख्य प्राइमरी! शायद मुझे यह पूछने की आवश्यकता है कि क्या मैं और भी बढ़िया सामान देख सकता हूँ? लेकिन मुझे नहीं लगता कि कुछ भी उस रेगेक्स की संक्षिप्तता के करीब आ पाएगा।
वैली

"अधिक अद्भुत सामान" पाने के लिए शायद आप इसे लोकप्रियता-प्रतियोगिता बनाने की कोशिश कर सकते हैं । प्रश्न को बदलना आम तौर पर यद्यपि पर आधारित होता है। और मुझे यकीन नहीं है कि आपको एक नया प्रश्न बनाना चाहिए या कुछ भी बदलना चाहिए क्योंकि कोई व्यक्ति ऐसा कुछ लेकर आया है जिसके बारे में आपने नहीं सोचा था - मुझे लगता है कि यहां अक्सर ऐसा होता है। इसके अलावा, नियम झुकना खेल का हिस्सा है :)
दानियो

जवाबों:


7

रूबी, 64 - 10 = 54

puts ('1
'..gets).map{?1}*''=~/^1?$|^(11+?)\1+$/?'Not!!': :Prime

यह स्ट्रिंग '1' (प्लस एक नई लाइन) से इनपुट स्ट्रिंग तक पुनरावृत्त करता है, रूबी की निर्मित स्ट्रिंग स्ट्रिंग विधि का उपयोग करता है जो कि 1 जोड़ने जैसा एक बहुत कुछ दिखता है, लेकिन जो तकनीकी रूप से किसी भी बिंदु पर उच्च-स्तरीय संख्यात्मक चर नहीं बनाता है । यह इस तथ्य का उपयोग करता है कि एन-लंबाई स्ट्रिंग बनाने के लिए एन के इनपुट के लिए एन पुनरावृत्तियों होंगे, फिर यह निर्धारित करने के लिए एक नियमित अभिव्यक्ति का उपयोग करता है कि क्या स्ट्रिंग समान समरूपता में वर्गीकृत किया जा सकता है।


क्या "1" "मैप {{1}" में एक फिक्सनम है? - यदि हां, तो आपको इसे "मानचित्र ('1') में बदलना पड़ सकता है; मुझे अभिव्यक्ति पर कोई दस्तावेज नहीं मिल सकता है। 1 कुछ संकेतों के अलावा कि रूबी के पुराने संस्करणों में इसने ASCII कोड लौटा दिए हैं और अब यह एक स्ट्रिंग लौटाता है। ।
वैली

? 1 '1' के समान है, यह 1-वर्ण स्ट्रिंग शाब्दिक है। मैं 1 के सभी उदाहरणों को बदल सकता था लेकिन किसी अन्य चरित्र के साथ पहला।
हिस्टोक्रेट

ठीक है - मैं अभी उस निर्माण को अच्छी तरह से कहीं भी वर्णित नहीं कर पाया!
वैली

मैं इसे "विजेता" के रूप में चुनता हूं क्योंकि यह गणित के एक संकेत से बचने के रास्ते से बाहर निकल जाता है।
वैली

3
अबीगैल को कोई टोपी नहीं? शर्म की बात है। यह 1998 के पर्ल समाधान का एक सीधा बंदरगाह है: catonmat.net/blog/perl-regex-that-matches-prime-numbers
skibrianski

16

रूबी: 52 - 10 = 42

उस प्रसिद्ध प्राइम-मिलान रेगेक्स की भिन्नता का उपयोग करना।

puts ?_*gets.to_i=~/^(_|(__+?)\2+)$/?"Not!!":"Prime"

बस स्पष्ट होने के लिए: ?_*gets.to_iएक स्ट्रिंग ऑपरेशन है जो "_"खुद को n बार जोड़ता है , जहां n इनपुट संख्या है। जैसा कि मैंने देखा कि कोई स्ट्रिंग लंबाई की तुलना नहीं की जाती है, जिससे कि 10 वर्ण बोनस मानदंड को संतुष्ट करना चाहिए।


1
मैं रूबी से परिचित नहीं हूं, इसलिए अगर मैं गलत हूं, तो मुझे सही करें, लेकिन "to_i" स्ट्रिंग को पूर्णांक में नहीं बदलते हैं? ऐसा नहीं है कि मैं अपरिपक्व में शानदार प्राइम चेकर से प्यार नहीं करता ...
वैली

1
@ मुझे नहीं लगता है कि "कन्वर्ट" सही शब्द नहीं है, लेकिन विधि एक इंट, हाँ देता है। फिर भी, मैं निम्नलिखित में से किसी का उपयोग नहीं करता हूं Arithmetic operators, bit-wise operators, numeric variables and constants, और आप वास्तव में एक विधि को कॉल करने के रूप में वर्गीकृत नहीं कर सकते हैं "math-stuff" in general..?
दानिएरो

@daniero उचित लगता है - शायद कल्पना के किनारे पर।
वैली

3

पर्ल 52-10 = 42

कार्यान्वयन

print((('-'x$ARGV[0])=~/^.$|^(..+?)\1+$/)?Not:Prime)

डेमो

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && perl Prime.pl {} && echo"
1 Not
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not

4
1 वास्तव में एक प्रमुख नहीं है।
elixenide

एक संख्यात्मक सरणी सूचकांक का उपयोग करता है - ताकि कल्पना के किनारे पर।
वैली

का प्रयोग करें popबजाय $ARGV[0],, 4 वर्ण बचाने संख्यात्मक सरणी सूचकांक को दूर
भीड़

1

ECMAScript 6, 159 - 10 = 149

रेगेक्स के लिए एक कार्य की तरह लगता है। आई / ओ के साथ prompt/ alertहमेशा की तरह।

for(s=prompt(u=""); /[^0]/.test(s); )
  s=s.replace(/(.)(0*)$/,(_,d,t)=>u+="x"," 012345678"[d]+t.replace(/0/g,"9"))
alert(/^((xx+)\2+|x?)$/.test(u)?"Not!!":"Prime")

जबकि लूप दशमलव संख्या को शुद्ध रूप से एक-एक पुनरावृत्ति द्वारा घटाता है। अंतिम रेगेक्स एक स्ट्रिंग से मेल खाता है जिसमें एक्स की एक समग्र संख्या होती है, पहले एक कारक के मिलान के बाद, फिर दूसरी स्ट्रिंग के पहले कारक को दोहराकर।


मुझे स्ट्रिंग डिक्रीमेंट फ़ंक्शन पसंद है - स्पष्ट और संक्षिप्त।
वैली

1

जावास्क्रिप्ट 266

function N(a){function b(a){return P.every(function(b){if(n=b,i=a.length,j=b.length,j>i) return;if(j==i) return 1;while(n.length<i)n+=b;return n.length!=i})}if(q=A,A!=a)for(;q.length.toString()!=a;)b(q)&&P.push(q),q+=A;console.log(b(q)?"Prime":"Not!!")}A="0",P=[A+A]

एन नामक एक फ़ंक्शन बनाता है जो वांछित परिणाम प्रिंट करेगा। निर्विवाद संस्करण इस तरह दिखता है। मैंने कुछ चरों को साफ करने के लिए एक हाथ को छोटा किया और फिर बदसूरत के माध्यम से चलाया और फिर से हाथ को छोटा किया।

// A a string of "0" for using to generate long strings
// P is the store for all known primes
A="0", P=[A+A];
function N(val) {
  function _isPrime(str) {
    // go through all the known primes and return true
    // if we don't match on any of them
    return P.every(function(prime) {
      // prime is some known string whose length is a prime number
      tsr = prime, strlen = str.length, primelen = prime.length;
      // if the string we're checking has fewer chars than
      // this then it's not a prime
      if(strlen < primelen) return 0;
      // if the string we're checking has the same number of chars
      // as the the prime we're checking against then it is a prime
      if(primelen == strlen) return 1;
      // Keep incrementing our temporary string with the prime we're
      // checking. we'll break out of the loop once the temporary string
      // is greater than or equal to the string we're testing
      while(tsr.length < strlen) {
        tsr += prime;
      }
      return !(tsr.length == strlen)
    });
  }
  // start with a string of one unit
  nstr = A
  if(A!=val) {
    // keep incrementing the string so that we can compile a list
    // of known primes smaller than this value
    while(nstr.length.toString() !== val) {
      if(_isPrime(nstr)) {
        P.push(nstr);
      }
      nstr += A;
    }
  }
  console.log(_isPrime(nstr) ? "Prime" : "Not!!");
}

इस स्निपेट का उपयोग करके इसका परीक्षण किया गया:

for(var X=0;X<10;X++) {
  console.log('checking: ' + X);
  N(X.toString());
}

1
मुझे यकीन नहीं है कि मैं देखता हूं कि यह कैसे काम करता है, लेकिन मैं एक संख्यात्मक चर (i) और एक अंकगणितीय ऑपरेटर (i ++) देखता हूं।
वैली

ओह, मुझे इस बात का एहसास नहीं था कि मैं लूप के लिए ऐसा नहीं कर सकता .. आज रात फिर से लिखूंगा।
सुगेन्द्रन

मूल रूप से मैं स्ट्रिंग्स की एक सरणी का निर्माण कर रहा हूं जिसकी लंबाई primes हैं। इसलिए जब मुझे एक इनपुट मिलता है तो मैं एक स्ट्रिंग में अक्षरों को जोड़ता रहता हूं जब तक कि स्ट्रिंग के लिए लंबाई मान इनपुट से मेल नहीं खाता। मैं फिर इस तार को लेता हूं और देखता हूं कि क्या मैं इसे किसी भी ज्ञात अपराध से समान रूप से विभाजित कर सकता हूं। अगर मैं नहीं कर सकता तो यह एक प्रमुख होना चाहिए। और विभाजित करके मेरा मतलब है कि मैं ज्ञात प्राइम स्ट्रिंग लेता हूं और इसे अपने आप से जोड़ता रहता हूं स्ट्रिंग की लंबाई या तो प्रश्न में स्ट्रिंग से बराबर या बड़ी है।
सुगेन्द्रन

मैंने कोड को अपडेट कर दिया है, यह वास्तव में वर्णों की संख्या को थोड़ा कम करता है :)
सुगेंद्रन

ठंडा। यह रेगेक्स के समान विचार जैसा दिखता है, लेकिन वास्तविक तर्क को अधिक कुशल और स्पष्ट रूप से दर्शाता है।
वैली

0

बैश 66 - 10 = 56

कार्यान्वयन

[[ -z `printf %$1s|grep -P "^(..+?)\1+$"` ]]&&echo Prime||echo Not

डेमो

$ seq 1 10|xargs -I{} bash -c "echo -n '{} '  && ./Prime.sh {}"
1 Prime
2 Prime
3 Prime
4 Not
5 Prime
6 Not
7 Prime
8 Not
9 Not
10 Not

जैसा कि ऊपर, 1 प्रमुख नहीं है।
वैली

0

पायथन 3, 109-10 = 89

print(['Not','Prime'][(lambda i:not any(' '*i==(' '*u)*v for u in range(i)for v in range(i)))(int(input()])

स्ट्रिंग की लंबाई की तुलना नहीं, लेकिन स्ट्रिंग को शामिल करना। यदि कोई संख्या अंकगणितीय का उपयोग किए बिना अभाज्य है, तो डुप्लिकेट से पोस्ट क्रॉस निर्धारित करें

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