एक रोको संख्या का पता लगाएं


12

मुझे एक साक्षात्कार में यह सवाल पूछा गया था, लेकिन मैं किसी भी समाधान का पता लगाने में असमर्थ था। मुझे नहीं पता कि सवाल सही था या नहीं। मैंने बहुत कोशिश की लेकिन कोई हल नहीं निकल सका। ईमानदारी से कहूं तो मेरे दिमाग में कुछ नहीं आया।

रोको संख्या

एक धनात्मक पूर्णांक एक रोको संख्या है यदि इसे या रूप में दर्शाया जा सकता है , जहाँ एक अभाज्य संख्या है।nn=p(पी+14)n=पी(पी-14)पी

पहले 10 रोको नंबर हैं:

32,51,95,147,207,275,351,435,527,627

कार्य

आपके कोड को इनपुट के रूप में एक सकारात्मक पूर्णांक को स्वीकार करना चाहिए और निर्धारित करना चाहिए कि क्या यह एक रोको संख्या है या नहीं।

ब्राउनी पोइंट्स

  • एक फ़ंक्शन लिखें जो 1 मिलियन से कम या उसके बराबर रोक्को संख्या की गणना की गणना करता है और प्रिंट करता है।
  • एक फ़ंक्शन लिखें जो बोनस प्रश्न (एक से ऊपर) से रोक्को संख्या की गणना करता है और प्रिंट करता है जो कि प्रमुख हैं।

5
नमस्ते और पीपीसीजी में आपका स्वागत है। हम चुनौतियों का सामना करते हैं (आपके विचार वास्तव में दिलचस्प हैं) जिसमें उद्देश्य स्कोरिंग और जीतने के मानदंड हैं। इसमें शामिल करने के लिए अपने पोस्ट को संपादित करने का प्रयास करें। मैं लक्ष्य के रूप में कोड-गोल्फ की सलाह देता हूं , क्योंकि यह सही पाने के लिए सबसे आसान है। इसके अलावा, आप उन बोनस से बचना चाहते हैं; बस एक स्पष्ट कार्य पर ध्यान केंद्रित करें।
अड्म

3
आउटपुट पूर्णांक होगा : क्या आपके पास बुलियन का मतलब यह नहीं है कि इनपुट एक रोक्को नंबर था या नहीं?
आदम

5
बोनस 2 print 0:। सभी रोक्को संख्या मिश्रित हैं (n*..), इसलिए किसी भी श्रेणी में कोई भी primes नहीं है।
ताफेल्ड

4
"बोनस अंक" केवल हार्डकोड किए गए मान हो सकते हैं, और चुनौती के लिए फायदेमंद नहीं हैं। मैं उन्हें हटाने की सलाह देता हूं।
को आउटगोल्फर

5
मैंने प्रश्न और टैग संपादित किए हैं। यदि आप सहमत नहीं हैं तो या तो रोलबैक करने के लिए स्वतंत्र महसूस करें या आगे संपादित करें। जैसा कि @EriktheOutgolfer ने कहा, मुझे लगता है कि बोनस को हटा दिया जाना चाहिए।
अरनौलड

जवाबों:


10

05AB1E , 8 बाइट्स

1 रिटर्न अगर n एक रोको संख्या है, या 0 अन्यथा।

fDŠ/α14å

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

कैसे?

यह देखते हुए एक सकारात्मक पूर्णांक n , हम परीक्षण एक प्रमुख कारक वहाँ मौजूद है या नहीं पी के n ऐसा है कि:

|पी-nपी|=14

टिप्पणी की गई

fDŠ/α14å  # expects a positive integer n as input       e.g. 2655
f         # push the list of unique prime factors of n  -->  2655, [ 3, 5, 59 ]
 D        # duplicate it                                -->  2655, [ 3, 5, 59 ], [ 3, 5, 59 ]
  Š       # moves the input n between the two lists     -->  [ 3, 5, 59 ], 2655, [ 3, 5, 59 ]
   /      # divide n by each prime factor               -->  [ 3, 5, 59 ], [ 885, 531, 45 ]
    α     # compute the absolute differences
          # between both remaining lists                -->  [ 882, 526, 14 ]
     14å  # does 14 appear in there?                    -->  1

11

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

n=>(g=k=>k>0&&n%--k?g(k):k==1)(n=(49+n)**.5-7)|g(n+=14)

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

कैसे?

एक सकारात्मक पूर्णांक n को देखते हुए , हम एक प्रमुख एक्स तलाश कर रहे हैं जैसे कि एक्स(एक्स+14)=n या एक्स(एक्स-14)=n

इसलिए निम्नलिखित द्विघात समीकरण:

(1)एक्स2+14एक्स-n=0
(2)एक्स2-14एक्स-n=0

की सकारात्मक जड़ (1) है:

एक्स0=49+n-7

और (2) की सकारात्मक जड़ है:

एक्स1=49+n+7

इसलिए, समस्या परीक्षण के बराबर है कि क्या एक्स0 या एक्स1 अभाज्य है।

ऐसा करने के लिए, हम यह सुनिश्चित करने के लिए एक अतिरिक्त परीक्षण के साथ कि हम इसे इनपुट के रूप में एक अपरिमेय संख्या दिए गए हैं, यह सुनिश्चित करने के लिए कि हम एक अतिरिक्त परीक्षण के साथ क्लासिक पुनरावर्ती प्राइमलिटी टेस्ट फ़ंक्शन का उपयोग करते हैं।

g = k =>    // k = explicit input; this is the divisor
            // we assume that the implicit input n is equal to k on the initial call
  k > 0 &&  // abort if k is negative, which may happen if n is irrational
  n % --k ? // decrement k; if k is not a divisor of n:
    g(k)    //   do a recursive call
  :         // else:
    k == 1  //   returns true if k is equal to 1 (n is prime)
            //   or false otherwise (n is either irrational or a composite integer)

मुख्य आवरण समारोह:

n => g(n = (49 + n) ** .5 - 7) | g(n += 14)


6

रेगेक्स (ECMAScript), 64 62 बाइट्स

+14n=(+14)+14

यह मेरे प्रचुर संख्या में regex पोस्ट के एक पैराग्राफ में संक्षेप में वर्णित गुणा एल्गोरिथ्म के एक संस्करण का उपयोग करता है । यह एक स्पॉइलर है । तो आगे पढ़िए नहीं अगर आप नहीं चाहते कि आपके लिए कुछ उन्नत यूरीज़ रेगेक्स मैजिक खराब हो जाए । यदि आप स्वयं इस जादू का पता लगाने के लिए एक शॉट लेना चाहते हैं, तो मैं अत्यधिक सलाह देता हूं कि इस पहले की पोस्ट में लगातार बिगड़ा-टैग की गई अनुशंसित समस्याओं की सूची में कुछ समस्याओं को हल करके शुरू करें , और स्वतंत्र रूप से गणितीय अंतर्दृष्टि के साथ आने की कोशिश करें।

गुणन एल्गोरिथ्म को यहां अलग तरीके से लागू किया गया है क्योंकि हम यह बता रहे हैं कि दो ज्ञात मूल्यों को एक साथ एक और ज्ञात मूल्य के बराबर गुणा किया जाता है (जैसा कि इस पोस्ट में रेगेक्स के वैकल्पिक संस्करण में भी किया गया है , एक नंबर के लिए परीक्षण करने के लिए एक आदर्श वर्ग है)। अब तक के मेरे अन्य पोस्ट किए गए रेगेक्स उत्तरों में, गुणा को गणना के रूप में लागू किया गया है (न कि एक वैचारिक, वैचारिक रूप से बोलते हुए) जहां लक्ष्य दो ज्ञात संख्याओं के उत्पाद को खोजना है। दोनों तरीके दोनों परिस्थितियों में काम करते हैं, लेकिन गोल्फ-वार, एक-दूसरे का काम करने में खराब होते हैं।

^(?=(x((x{14})(x+)))(?=(\1*)\4\2*$)(\1*$\5))\6\3?(?!(xx+)\7+$)

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


 # For the purposes of these comments, the input number = N.
 ^
 # Find two numbers A and A+14 such that A*(A+14)==N.
 (?=
     (x((x{14})(x+)))   # \1 = A+14; \2 = \1-1; \3 = 14; \4 = A-1; tail -= \1
     (?=                # Assert that \1 * (\4+1) == N.
         (\1*)\4\2*$    # We are asserting that N is the smallest number satisfying
                        # two moduli, thus proving it is the product of A and A+14
                        # via the Chinese Remainder Theorem. The (\1*) has the effect
                        # of testing every value that satisfies the "≡0 mod \1"
                        # modulus, starting with the smallest (zero), against "\4\2*$",
                        # to see if it also satisfies the "≡\4 mod \2" modulus; if any
                        # smaller number satisfied both moduli, (\1*) would capture a
                        # nonzero value in \5. Note that this actually finds the
                        # product of \4*\1, not (\4+1)*\1 which what we actually want,
                        # but this is fine, because we already subtracted \1 and thus
                        # \4*\1 is the value of tail at the start of this lookahead.
                        # This implementation of multiplication is very efficient
                        # golf-wise, but slow, because if the number being tested is
                        # not even divisible by \1, the entire test done inside this
                        # lookahead is invalid, and the "\1*$" test below will only
                        # fail after this useless test has finished.
     )
     (\1*$\5)           # Assert that the above test proved \1*(\4+1)==N, by
                        # asserting that tail is divisible by \1 and that \5==0;
                        # \6 = tool to make tail = \1
 )
 # Assert that either A or A+14 is prime.
 \6                     # tail = \1 == A+14
 \3?                    # optionally make tail = A
 (?!(xx+)\7+$)          # Assert tail is prime. We don't need to exclude treating
                        # 1 as prime, because the potential false positive of N==15
                        # is already excluded by requiring \4 >= 1.
 


3

ब्रेकीलॉग , 13 12 बाइट्स

ṗ;14{+|-};?×

कमांड-लाइन तर्क के रूप में उम्मीदवार संख्या दर्ज करें। आउटपुट trueया falseइसे ऑनलाइन आज़माएं!

व्याख्या

कोड एक विधेय है जिसका इनपुट अप्रतिबंधित है और जिसका आउटपुट वह संख्या है जिसका हम परीक्षण कर रहे हैं।

ṗ             Let the input ? be a prime number
 ;14          Pair it with 14, yielding the list [?, 14]
    {+|-}     Either add or subtract, yielding ?+14 or ?-14
         ;?   Pair the result with the input, yielding [?+14, ?] or [?-14, ?]
           ×  Multiply; the result must match the candidate number

(सुझावों का स्वागत है। यह {+|-}अभी भी स्पष्ट है।)


3

ब्रेकीलॉग , 9 बाइट्स

अलग दृष्टिकोण तो DLosc का जवाब

Ċ-14&∋ṗ&×

N को आउटपुट के रूप में लेता है, इनपुट के माध्यम से [P, P-14] या [P + 14, P] वापस देता है (सबसे बड़ी संख्या पहले)

व्याख्या

Ċ              # The 'input' is a pair of numbers
 -14           #   where the 2nd is 14 smaller then the first
    &∋ṗ        #   and the pair contains a prime
       &×      #   and the numbers multiplied give the output (N)

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


2

पायथ, 22 20 बाइट्स

}Qsm*Ld+Ld_B14fP_TSh

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

}Qsm*Ld+Ld_B14fP_TShQ   Implicit: Q=eval(input())
                        Trailing Q inferred
                  ShQ   Range [1-(Q+1)]
              fP_T      Filter the above to keep primes
   m                    Map the elements of the above, as d, using:
          _B14            [14, -14]
       +Ld                Add d to each
    *Ld                   Multiply each by d
  s                     Flatten result of map
}Q                      Is Q in the above? Implicit print

संपादित करें: इनपुट के रूप में सहेजे गए 3 बाइट्स हमेशा सकारात्मक रहेंगे, इसलिए सूची से नकारात्मक मानों को फ़िल्टर करने की कोई आवश्यकता नहीं है। इनपुट के लिए एक बग भी तय किया 1और 2, 1 बाइट की लागत। पुराना वर्जन:}Qsm*Ld>#0+Ld_B14fP_TU


2

05AB1E , 16 15 14 बाइट्स

के बजाय 14 के साथ गणना करके 1 बाइट को सहेजा गया žvÍ(केंट का मानना ​​है कि मैंने पहली बार में ऐसा नहीं सोचा था)।

Emigna के लिए 1 बाइट का धन्यवाद सहेजा गया

ÅPε7·D(‚+y*Q}Z

इसे ऑनलाइन आज़माएं! या सभी इनपुट का परीक्षण करें

व्याख्या

                 # Implicit input n
ÅP               # Push a list of primes up to n
  ε         }    # For each prime in the list...
   7·            # Push 14 (by doubling 7)
     D(‚         # Push -14 and pair them together to get [14,-14]
        +        # Add [14,-14] to the prime
         y*      # Multiply the prime to compute p(p-14) and p(p+14)
           Q     # Check if the (implicit) input is equal to each element
             Z   # Take the maximum

1
आप को बदलने के द्वारा एक बाइट बचा सकते हैं }˜såकरने के लिए Q}Zअंतर्निहित इनपुट का उपयोग। अपने टेस्ट-सूट को कुछ इस तरह से बदलना होगा ताकि इसे काम करने के लिए प्राप्त किया जा सके। इसके अलावा, लेखन का एक और अधिक स्पष्ट तरीका žvÍया होगा 14;)
एमिग्ना

धन्यवाद! जब आप 14 को सबसे जटिल तरीके से धकेल सकते हैं तो इसे आसान क्यों बना सकते हैं :)
विस्लोव


2

रेटिना 0.8.2 , 61 बाइट्स

.+
$*
^((1{14})1(1)+)(?<=(?<!^\4+(..+))\2?)(?<-3>\1)+$(?(3)1)

इसे ऑनलाइन आज़माएं! स्पष्टीकरण:

.+
$*

यूनीरी में बदलें।

^((1{14})1(1)+)

\1दो कारकों में से बड़े को पकड़ता है। \2बाइट को बचाते हुए, लगातार 14 पर कब्जा कर लेता है। \3दो कारकों में से छोटे को दर्शाता है, शून्य से 1. यह भी सुनिश्चित करता है कि दोनों कारक कम से कम 2 हैं।

(?<=(?<!^\4+(..+))\2?)

कम से कम एक को सुनिश्चित करने के लिए दो कारकों की जाँच करें। उपयोग करने का विचार \2?बेशर्मी से @ डेडकोड ​​के उत्तर से चोरी हो गया।

(?<-3>\1)+

दो कारकों के छोटे से एक से कम के बराबर कई बार दो कारकों के बड़े को दोहराएं। जैसा कि हमने पहले ही बड़े कारक पर कब्जा कर लिया है, एक बार यह दो कारकों के उत्पाद को कैप्चर करता है।

$(?(3)1)

सुनिश्चित करें कि उत्पाद दिए गए नंबर के बराबर है।

रेटिना 1 के $*साथ सीधे अनुवाद के साथ बदलने के *1लिए एक ही बाइट काउंट होगा लेकिन एक बाइट को 1एस के साथ सभी एस को बदलने के द्वारा बचाया जा सकता है _और फिर इसके बजाय *1प्रतिस्थापित किया जा सकता *है *_। 68 बाइट्स के लिए पिछला रेटिना 1 उत्तर:

.+
*
Lw$`^(__+)(?=(\1)+$)
$1 _$#2*
Am` (__+)\1+$
(_+) \1

0m`^_{14}$

इसे ऑनलाइन आज़माएं! स्पष्टीकरण:

.+
*

यूनीरी में बदलें।

Lw$`^(__+)(?=(\1)+$)
$1 _$#2*

कारकों के सभी जोड़े खोजें।

Am` (__+)\1+$

सुनिश्चित करें कि एक प्रमुख है।

(_+) \1

पूर्ण अंतर ले लो।

0m`^_{14}$

जांचें कि क्या कोई भी 14 हैं।


1

जावास्क्रिप्ट (बैबल नोड) , 69 बाइट्स

धिक्कार है, हालांकि मैं अर्नुल्ड्स का जवाब देने के लिए जा रहा था, लेकिन नहीं .....: सी

x=>[...Array(x)].some((a,b)=>x/(a=(p=n=>--b-1?n%b&&p(n):n)(b))-a==14)

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

मैं छुटकारा चाहता हूं x=>[...Array(x)].some( पुनरावृत्ति का उपयोग करके भाग ताकि समय के साथ यह कम हो सके

व्याख्या

x=>[...Array(x)]                                                              Creates a range from 0 to x-1 and map:

                .some((a,b)=>                                                 Returns True if any of the following values is true
                             x/                                              Input number divided by
                                (a=(p=n=>--b-1?n%b&&p(n):n)(b))               recursive helper function. Receives a number (mapped value) as parameters and returns 
                                                                              the same number if it is prime, otherwise returns 1. Take this value
                                                                              and assign to variable a
                                                               -a            Subtract a from the result  
                                                                     ==14    Compare result equal to 14

यह सूत्र का उपयोग करता है

n/पी-पी==14




1

एपीएल (एनएआरएस) 16 चार्ट, 32 बाइट्स

{14=∣r-⍵÷r←↑⌽π⍵}

{find} इसके तर्क का गुणनखंड ज्ञात करेंगे और हम मानते हैं कि इसके परिणाम का अंतिम तत्व (n के विभाजकों की सूची) n का अधिकतम प्रधान भाजक है; यहाँ हम मानते हैं कि रोक्को संख्या की एक समान परिभाषा है: n एक रोक्को संख्या है <=> n का अधिकतम कारक n: r ऐसा है कि यह सत्य है 14 = nrn [r [C pseudocode के लिए 14 == abs (rn) / r) रोक्को संख्या की यह परिभाषा 1..1000000] की सीमा में ठीक है; ठीक मूल्य की सीमा 1..maxInt होगी; परीक्षा:

 f←{14=∣r-⍵÷r←↑⌽π⍵}
 {⍞←{1=f ⍵:' ',⍵⋄⍬}⍵⋄⍬}¨1..10000
32  51  95  147  207  275  351  435  527  627  851  1107  1247  1395  1551  1887  2067  2255  2451  2655  2867  3551  4047  4307  4575  5135  5427  5727  6035  6351  6675  7347  8051  8787  9167  9951   

1

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 99 बाइट्स

n=>Enumerable.Range(2,n).Any(p=>Enumerable.Range(2,p).All(y=>y>=p|p%y>0)&(n==p*(p+14)|n==p*(p-14)))

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

Enumerable.Range हमले फिर से :) पागल संकलक झंडे का उपयोग करना, आप चीजों को काफी कम कर सकते हैं, हालांकि मैं वेनिला समाधान के एक प्रशंसक की तरह हूं।

सी # (विज़ुअल सी # इंटरएक्टिव कंपाइलर) + /u:System.Linq.Enumerable, 77 बाइट्स

n=>Range(2,n).Any(p=>Range(2,p).All(y=>y>=p|p%y>0)&(n==p*(p+14)|n==p*(p-14)))

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

नीचे अर्नुल्ड के समाधान का एक बंदरगाह है जो बहुत अच्छा लग रहा था। यह वर्तमान में सबसे लंबा है, लेकिन यह शायद कुछ गोल्फ हो सकता है।

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 101 बाइट्स

n=>{bool g(int k)=>--k<2?n>1:n%k>0&g(k);var d=Math.Sqrt(n+49)-7;return(n=(int)d)==d&(g(n)|g(n+=14));}

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


0

एपीएल (एनएआरएस) 30 चार्ट, 60 बाइट्स

{∨/{0=1∣⍵:0π⍵⋄0}¨(7,¯7)+√49+⍵}

यहाँ 0 Here फ़ंक्शन का कहना है कि क्या एक नंबर एक प्राइम, टेस्ट है:

 f←{∨/{0=1∣⍵:0π⍵⋄0}¨(7,¯7)+√49+⍵}
 {⍞←{1=f ⍵:' ',⍵⋄⍬}⍵⋄⍬}¨0..700
32  51  95  147  207  275  351  435  527  627

0

एफ #, 2 उत्तर (नॉन कमेटिंग)

मुझे @Arnauld के जवाब बहुत पसंद आए, इसलिए मैंने उनका अनुवाद किया।

जावास्क्रिप्ट जवाब के आधार पर 123 बाइट्स

fun n->let t=int<|sqrt(float n+49.)in Seq.map(fun n->Seq.filter(fun i->n%i=0)[1..n]|>Seq.length=2)[t-7;t+7]|>Seq.reduce(||)

स्पष्टीकरण:

fun n->let t=int<|sqrt(float n+49.)in Seq.map(fun n->Seq.filter(fun i->n%i=0)[1..n]|>Seq.length=2)[t-7;t+7]|>Seq.reduce(||) //Lambda which takes an integer, n
       let t=int<|sqrt(float n+49.)                                                                                         //let t be n, converted to float, add 49 and get square root, converted back to int (F# type restrictions)
                                   in                                                                                       //in the following...
                                                                                                  [t-7;t+7]                 //Subtract and add 7 to t in a list of 2 results (Lists and Seqs can be interchanged various places)
                                      Seq.map(fun n->Seq.filter(fun i->n%i=0)[1..n]|>Seq.length=2)                          //See if either are prime (here, if either result has 2 and only 2 divisors)
                                                                                                           |>Seq.reduce(||) //And logically OR the resulting sequence

05AB1E उत्तर के आधार पर 125 बाइट्स

fun n->let l=Seq.filter(fun i->n%i=0)[2..n-1]in let m=Seq.map(fun i->n/i)l in Seq.map2(fun a b->abs(a-b))l m|>Seq.contains 14

स्पष्टीकरण:

fun n->let l=Seq.filter(fun i->n%i=0)[2..n-1]in let m=Seq.map(fun i->n/i)l in Seq.map2(fun a b->abs(a-b))l m|>Seq.contains 14  //Lambda which takes an integer, n
       let l=Seq.filter(fun i->n%i=0)[2..n-1]                                                                                  //let l be the list of n's primes 
                                             in                                                                                //in...
                                                let m=Seq.map(fun i->n/i)l                                                     //m, which is n divided by each of l's contents
                                                                           in                                                  //and then...
                                                                              Seq.map2(fun a b->abs(a-b))l m                   //take the absolute difference between each pair of items in the two sequences to make a new sequence
                                                                                                            |>Seq.contains 14  //and does the resulting sequence contain the number 14?

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