परिक्षण परीक्षण सूत्र


30

आपका लक्ष्य यह निर्धारित करना है कि क्या दी गई संख्या nसबसे कम बाइट्स में प्रमुख है। लेकिन, आपका कोड एकल पायथन 2 का होना चाहिए जिसमें केवल संख्याएँ हों

  • ऑपरेटरों
  • इनपुट चर n
  • पूर्णांक स्थिरांक
  • कोष्टक

कोई लूप नहीं, कोई असाइनमेंट नहीं, कोई बिल्ट-इन फ़ंक्शंस नहीं है, जो केवल ऊपर सूचीबद्ध है। हाँ, यह मुमकिन है।

ऑपरेटर्स

यहां पायथन 2 में सभी ऑपरेटरों की सूची दी गई है , जिसमें अंकगणित, बिटवाइज़ और लॉजिकल ऑपरेटर शामिल हैं:

+    adddition
-    minus or unary negation
*    multiplication
**   exponentiation, only with non-negative exponent
/    floor division
%    modulo
<<   bit shift left
>>   bit shift right
&    bitwise and
|    bitwise or
^    bitwise xor
~    bitwise not
<    less than
>    greater than
<=   less than or equals
>=   greater than or equals
==   equals
!=   does not equal

सभी मध्यवर्ती मान पूर्णांक (या गलत / सत्य) हैं, जो स्पष्ट रूप से 0 और 1 के बराबर हैं। नकारात्मक घातांक के साथ घातांक का उपयोग नहीं किया जा सकता है, क्योंकि यह तैरने का उत्पादन कर सकता है। ध्यान दें कि /पायथन 3 के विपरीत, फर्श-विभाजन करता है, इसलिए //इसकी आवश्यकता नहीं है।

यहां तक ​​कि अगर आप पायथन से परिचित नहीं हैं, तो ऑपरेटरों को बहुत सहज होना चाहिए। ऑपरेटर वरीयता और इस अनुभाग के लिए और व्याकरण के विस्तृत विनिर्देशन के लिए इस तालिका को देखें । आप पायथन 2 को टीआईओ पर चला सकते हैं

आई / ओ

इनपुट: एक सकारात्मक पूर्णांक nजो कम से कम 2 है।

आउटपुट: 1 यदि nप्रधान है, और 0 अन्यथा। Trueऔर Falseभी इस्तेमाल किया जा सकता है। सबसे कम बाइट्स जीतता है।

चूंकि आपका कोड एक अभिव्यक्ति है, यह एक स्निपेट होगा, जो कि इनपुट मूल्य को संग्रहीत करने की अपेक्षा करता है n, और वांछित आउटपुट का मूल्यांकन करता है।

आपका कोड nमनमाने ढंग से बड़े, सिस्टम सीमा के लिए काम करना चाहिए । चूंकि पायथन की पूरी-संख्या प्रकार अनबाउंड है, इसलिए ऑपरेटरों पर कोई सीमा नहीं है। आपके कोड को चलने में लंबा समय लग सकता है।


शायद यह अजगर टैग होना चाहिए?
f --n 19:tɪk

जवाबों:


35

43 बाइट्स

(4**n+1)**n%4**n**2/n&2**(2*n*n+n)/-~2**n<1

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

विधि डेनिस के दूसरे (हटाए गए) उत्तर के समान है, लेकिन यह उत्तर सही साबित होना आसान है।

प्रमाण

संक्षिप्त रूप

का सबसे महत्वपूर्ण अंकों (4**n+1)**n%4**n**2आधार में कि से विभाज्य नहीं है n में अगले (कम महत्वपूर्ण) अंकों कर देगा अशून्य (यदि है कि "अगले अंकों" आंशिक भाग में नहीं है), तो एक बिटमास्क साथ जांच करने के लिए मार डाला जाता है यदि विषम स्थिति में कोई अंक गैर-शून्य है।2nn(4**n+1)**n%4**n**2/n&2**(2*n*n+n)/-~2**n

लंबा फार्म

चलो है कि आधार होने नंबर हो प्रतिनिधित्व, यानी, एक एन बी एन + + एक 1 1 + एक 0 बी 0 , और एक मैं पर अंकों हो " स्थिति " मैं बेस बी प्रतिनिधित्व में।[an,,a1,a0]bbanbn++a1b1+a0b0aiib

  • 2**(2*n*n+n)/-~2**n=2(2n+1)n1+2n=4n2×2n1+2n=(4n21)×2n1+2n+2n1+2n

क्योंकि (के साथएन2n-1रों) एक पूर्णांक है, और2n2n×4n211+2n=2n(2n1)×(4n)n14n1=[2n1,0,2n1,0,2n1,0]2nn 2n1, =[2n-1,0,2n-1,0,2n-1,0]2n2n1+2n=02**(2*n*n+n)/-~2**n[2n1,0,2n1,0,2n1,0]2n

अगला, विचार करें

(4**n+1)**n=(4n+1)n=(n0)40n+(n1)41n++(nn)4n2=[(nn),0,,0,(n1),0,(n0)]2n

, इसलिएसंख्या को 2 n अंतिम अंकों में विभाजित कर देगा - जो n ( n) को बाहर करता है4n2=(2n)2n%4**n**22n (जो 1 है) लेकिन अन्य सभी द्विपद गुणांक शामिल हैं।(nn)

के बारे में /n:

  • यदि एक अभाज्य है, तो परिणाम [ ( n) होगाn। विषम स्थिति में सभी अंक शून्य हैं।[(nn1)/n,0,,0,(n1)/n,0,0]2n

  • यदि एक अभाज्य नहीं है:n

    चलो सबसे बड़ा पूर्णांक ऐसा है कि हो सकता है n ( na (n>a>0)। लाभांश को फिर से लिखेंn(na)n>a>0

    [(nn1),0,(nn2),0,,(na+1),0,0,0,,0,0,0]2n+[(na),0,(na1),0,,(n0)]2n

    पहले सारांश में द्वारा विभाज्य सभी अंक हैं , और अंक 2 पर स्थिति a - 1 शून्य है।n2a1

    दूसरा योज्य (कम से स्थिति सबसे महत्वपूर्ण अंकों है ) विभाज्य द्वारा नहीं n और (आधार) 2 n > n जब विभाजित है कि द्वारा, तो भागफल n स्थिति में अंकों के लिए होता है 2 एक - 1 अशून्य।2an2n>nn2a1

    इसलिए, अंतिम परिणाम ( (4**n+1)**n%4**n**2/n) अंकों (आधार होना चाहिए , ज़ाहिर है) की स्थिति में 2 एक + 1 अशून्य।2n2a+1

अंत में, बिटवाइज़ और ( &) एक vectorized बिटवाइज़ और आधार में अंकों पर प्रदर्शन (क्योंकि आधार 2 की एक शक्ति है), और क्योंकि एक और 0 = 0 , एक और ( 2 n - 1 ) = एक सब के लिए 0 एक < 2 n , शून्य iff है पहले के सारे अंक n जो के बराबर है - अजीब पदों शून्य n प्रधानमंत्री जा रहा है।2na&0=0,a&(2n1)=a0a<2n(4**n+1)**n%4**n**2/n&2**(2*n*n+n)/-~2**n(4**n+1)**n%4**n**2/nnn


2
चाहेंगे (4**n+1)**n%2**n**2/n&2**n**2/-~2**n<1काम करते हैं?
डेनिस

11
यदि सही साबित करना आसान है, तो क्या आप उत्तर में प्रमाण शामिल कर सकते हैं? हमारे पास अब MathJax है, इसलिए प्रमाणों को सुपाठ्य बनाना अपेक्षाकृत आसान है, और मैं nअंकों के आधार के बीच अवांछित बातचीत न करने के लिए विभाजन का एक स्पष्ट कारण नहीं देख सकता 4**n
पीटर टेलर

3
"मुझे इस उत्तर का वास्तव में उल्लेखनीय प्रमाण मिला है, जो इस टिप्पणी को शामिल करने के लिए बहुत छोटा है ..."
डिजिटल ट्रॉमा

1
प्रमाण को छोटा करने के सुझावों का स्वागत है।
user202729

1
अच्छी तरह से किया! यह वही समाधान है जिसके साथ मैं आया था। मैंने पाया कि कुछ बाइट्स के साथ काटा जा सकता है (4**n+1)**n%4**n**2/n<<n&4**n**2/-~2**n<1। मैं उत्सुक हूँ अगर यह चुनौती बिटवाइज़ ऑपरेटरों के बिना संभव है।
xnor

6

पायथन 2 , 56 बाइट्स

n**(n*n-n)/(((2**n**n+1)**n**n>>n**n*~-n)%2**n**n)%n>n-2

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

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

हालांकि, समाधान बेहद धीमी गति से है, और मैं चलाने के लिए सक्षम नहीं किया गया है `, जैसे दो स्तर एक्स्पोनेंट्स करने के लिए धन्यवाद 2 n nn=62nn

मुख्य विचार फैक्टरियल लिए एक अभिव्यक्ति बनाना है ! , जो हमें एक विल्सन प्रमेय परीक्षण ( n - 1 ) करने देता है ! % n > n - 2 जहां % modulo ऑपरेटर है।n!(n1)!%n>n2%

हम द्विपदीय गुणांक के लिए एक अभिव्यक्ति कर सकते हैं , जो गुटों से बना है

(mn) =m!n!(mn)!

लेकिन यह स्पष्ट नहीं है कि इन सभी गुटों में से एक को कैसे निकाला जाए। चाल को अलग करने के लिए है ! मी वास्तव में बहुत बड़ा बनाकर ।n!m

(mn) =m(m1)(mn+1)n!=mnn!(11m)(12m)(1n1m)

इसलिए, यदि हम को उत्पाद बनाते हैं ( 1 - 1)c, हमारे पास है(11m)(12m)(1n1m)

n!=mn(mn)c

अगर हम सिर्फ अनदेखी कर सकते हैं , तो हम करेंगे। इस पोस्ट के बाकी की तलाश में है कितना बड़ा हम बनाने की जरूरत मीटर यह करने के लिए सक्षम होने के लिए।cm

ध्यान दें कि दृष्टिकोण 1 के नीचे से के रूप में मीटर । हम सिर्फ बनाने की जरूरत मीटर बड़ा पर्याप्त है कि छोड़ते हुए हमारे साथ पूर्णांक भाग एक मूल्य देता है n ! ताकि हम गणना कर सकेंc1mmcn!

n!=mn(mn)

इसके लिए, यह अगले पूर्णांक n पास करने वाले अनुपात से बचने के लिए ! + 11c<1/n!n!+1

निरीक्षण करें कि n शब्दों का एक उत्पाद है , जिसमें सबसे छोटा ( 1 - n - 1) हैcn। तो हमारे पास(1n1m)

c>(1n1m)n>1n1mn>1n2m,

जिसका अर्थ है । चूंकि हम1-c<1/n लग रहे हैं! , यह लेने के लिए पर्याप्त होतामीटरn! एन1c<n2m1c<1/n!mn!n2

कोड में, हम उपयोग करते हैं । चूंकि विल्सन का प्रमेय उपयोग करता है ( n - 1 ) ! , हम वास्तव में केवल जरूरत मीटर ( n - 1 ) ! ( n - 1 ) 2 । यह देखने के लिए इतना आसान है मीटर = n n संतुष्ट छोटे मानों के लिए और जल्दी से दाहिने हाथ की ओर outgrows asymptotically ही, साथ कह स्टर्लिंग के सन्निकटनm=nn(n1)!m(n1)!(n1)2m=nn


3

यह उत्तर किसी भी संख्या-सिद्धांतवादी चतुराई का उपयोग नहीं करता है। यह पायथन के बिटवाइज ऑपरेटरों को "लूप के लिए" मैनुअल बनाने के लिए, सभी जोड़े देखने के लिए जाँच करता है कि क्या i × j = n है1i,j<ni×j=n

अजगर 2, वैसे भी कई बाइट्स (278 टिप्पणियों में जो राजा के लिए धन्यवाद!)

((((((2**(n*n)/(2**n-1)**2)*(2**((n**2)*n)/(2**(n**2)-1)**2))^((n*((2**(n*n-n)/(2**n-1))*(2**((n**2)*(n-1))/(2**n**2-1))))))-((2**(n*n-n)/(2**n-1))*(2**((n**2)*(n-1))/(2**(n**2)-1))))&(((2**(n*(n-1))/(2**n-1))*(2**((n**2)*(n-1))/(2**(n**2)-1)))*(2**(n-1)))==0))|((1<n<6)&(n!=4))

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

यह अन्य उत्तरों की तुलना में बहुत अधिक बाइट्स है, इसलिए मैं इसे अभी के लिए अधूरा छोड़ रहा हूं। नीचे दिए गए कोड स्निपेट में स्पष्टता के लिए फ़ंक्शंस और वैरिएबल असाइनमेंट हैं, लेकिन प्रतिस्थापन एक पिथन अभिव्यक्ति में isPrime (n) है।

def count(k, spacing):
    return 2**(spacing*(k+1))/(2**spacing - 1)**2
def ones(k, spacing):
    return 2**(spacing*k)/(2**spacing - 1)

def isPrime(n):
    x = count(n-1, n)
    y = count(n-1, n**2)
    onebits = ones(n-1, n) * ones(n-1, n**2)
    comparison = n*onebits
    difference = (x*y) ^ (comparison)
    differenceMinusOne = difference - onebits
    checkbits = onebits*(2**(n-1))
    return (differenceMinusOne & checkbits == 0 and n>1)or 1<n<6 and n!=4

यह काम क्यों करता है?

मैं यहाँ बाइनरी के बजाय बेस 10 में एक ही एल्गोरिदम करूँगा। इस साफ अंश को देखें:

1.09992=1.002003004005

1015/(9992)=10020030041,2,3,4

मान लें कि हम शून्य की अलग-अलग स्पेसिंग के साथ दो संख्याओं को इस तरह से गुणा करते हैं। मैं उत्पाद में अल्पकालिक रूप से अल्पविराम लगाऊंगा।

1002003004×1000000000002000000000003000000000004=
1002003004,002004006008,003006009012,004008012016

005

005005005005001001001001d005999d

d900900900900


1
अभिव्यक्ति का एक त्वरित प्रिंट 278 बाइट्स पर डालता है (हालांकि मुझे यकीन है कि बहुत सारे कोष्ठक आवश्यक नहीं हैं)
जो किंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.