अधीर विभाज्यता परीक्षण


14

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

आपके प्रोग्राम को एक पूर्णांक D and 2 और फिर इनपुट के रूप में अंकों की एक श्रृंखला लेनी चाहिए । ये दूसरे पूर्णांक N starting 1 के अंकों का प्रतिनिधित्व करते हैं , जो कम से कम महत्वपूर्ण अंकों से शुरू होता है। पहले बिंदु पर कि एन या तो डी से विभाजित होना चाहिए या नहीं होना चाहिए , आपके कार्यक्रम को उचित जवाब और निकास का उत्पादन करना चाहिए । यदि इनपुट के अंत तक पहुंच गया है, तो यह आउटपुट होना चाहिए कि क्या फुल एन डी द्वारा विभाज्य है ।

यहां एन के लिए स्वीकार्य इनपुट प्रारूपों की एक सूची है (एक टिप्पणी छोड़ें यदि आपको लगता है कि कुछ ऐसा है जिसे शामिल नहीं किया जाना चाहिए):

  • मानक इनपुट : अंक अलग-अलग लाइनों पर दिए जाते हैं; इनपुट का अंत ईओएफ या एक विशेष मूल्य है; बाहर निकलने का मतलब है कि फ़ंक्शन लौटता है या प्रोग्राम बाहर निकलता है।

  • एनालॉग इनपुट : उदाहरण के लिए कीस्ट्रोक्स या प्रत्येक अंक का प्रतिनिधित्व करने वाले दस बटन के माध्यम से; इनपुट का अंत एक विशेष मूल्य है; बाहर निकलने का मतलब है कि फ़ंक्शन लौटता है या प्रोग्राम बाहर निकलता है।

  • वैश्विक स्थिति के साथ कार्य : क्रमिक अंकों के साथ बार-बार कहा जाता है; इनपुट का अंत एक विशेष मूल्य है; निकास का मतलब है कि फ़ंक्शन एक गैर-शून्य मान लौटाता है। ध्यान दें कि यदि आप वैश्विक स्थिति का उपयोग करते हैं, तो इसे लौटाया जाना चाहिए, क्योंकि मान लौटाया जाता है या अन्यथा ऐसे रीसेट किया जाता है कि फ़ंक्शन कई बार काम करता है

  • करी फ़ंक्शन : अगले अंक या मान के साथ बुलाया जाने वाला एक और फ़ंक्शन देता है; इनपुट का अंत एक विशेष मूल्य है या बिना किसी तर्क के फ़ंक्शन को कॉल करना; बाहर निकलने का मतलब है कि फ़ंक्शन दूसरे फ़ंक्शन के बजाय एक उत्तर देता है।

  • GUI संकेत या समान : बार-बार प्रदर्शित; इनपुट का अंत "रद्द" या समकक्ष, या एक विशेष मूल्य है; निकास का मतलब है कि संकेत दिखना बंद हो जाते हैं।

  • Iterator फ़ंक्शन : इनपुट एक स्टेटफुल ऑब्जेक्ट या फ़ंक्शन है जो अगले अंक को रिटर्न करता है जब कॉल किया जाता है, इनपुट का अंत एक अपवाद या विशेष मूल्य है; बाहर निकलने का मतलब है कि पुनरावृत्ति को रोकने वाला कहा जाता है।

डी और आउटपुट के लिए इनपुट किसी भी स्वीकार्य मानक विधि के माध्यम से हो सकता है ।

परीक्षण के मामलों:

2;   6               => true
5;   6               => false
20;  0 3             => false
20;  0 4             => true
100; 1               => false
100; 0 0             => true
100; 0 2             => false
4;   2 4             => false
4;   2 5             => true
4;   2 [eof]         => false
4;   4 [eof]         => true
625; 5 5             => false
625; 5 7 2           => false
625; 5 7 3 6         => false
625; 5 7 3 4         => true
7;   9 3 4 [eof]     => false
7;   9 3 4 5 [eof]   => true
140; 0 3             => false
140; 0 4 5 [eof]     => false
140; 0 4 5 1 [eof]   => true
14;  4 5 1 4 [eof]   => false
14;  4 5 1 4 1 [eof] => true

मुझे लगता है कि हमें यह मान लेना चाहिए कि इनपुट के लिए हमारे समाधान पूछने पर हर बार एक अंक दिया जाएगा, है ना? और, यह एक पूर्ण कार्यक्रम होना चाहिए, क्योंकि यह सुनिश्चित करने का उद्देश्य तरीका है कि इनपुट को अंक द्वारा दिया गया है, नहीं? (चुनौती कहती है "कार्यक्रम या समारोह", हम्म ...)
एरिक आउट द गोल्फर

1
@EriktheOutgolfer इनपुट प्रारूप को प्रश्न में बुलेटेड सूची में विस्तार से बताया गया है।
दरवाज़े

1
मैं सिर्फ इस बारे में सोच रहा था कि उन प्रारूपों का उद्देश्य कितना हो सकता है ... मुझे लगता है कि मैं सिर्फ नाइटपैकिंग छोड़ दूंगा और वास्तव में इसे हल करना शुरू कर दूंगा । :-)
21

1
क्या digitsईओएफ के लिए एक विशेष मूल्य वाले इनपुट के रूप में सिर्फ एक सूची लेने के साथ कुछ भी गलत है ?
जोनाथन एलन

1
@ EriktheOutgolfer अगर EOF मान नहीं है, जब तक कि मैंने कुछ गलत नहीं किया है। उदाहरण के जाने के लिए मान लीजिए कि पूरे मूल्य 132 है और संभावित भाजक 4 तो है []और [2]बदले में कुछ भी अन्य की तुलना में falseया true(समारोह अपने आप में आदि ... सहित) है, जबकि [2,3], [2,3,1]और [2,3,1,EOF]वापसी true। यह मुझे वैश्विक राज्य विकल्प के करीब पहुंचता है।
जोनाथन एलन

जवाबों:


9

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

इनपुट प्रारूप: करी फ़ंक्शन

एक फ़ंक्शन जो विभाजक लेता है और एक ऐसा फ़ंक्शन देता है जो EOF के लिए प्रत्येक अंक या लेता है । दूसरा फ़ंक्शन (गलत), (सत्य) या स्वयं (कोई उत्तर नहीं) देता है।101

p=>(q='',g=(d,t=k=z=!~d||(q=d+q,p))=>k--?g(d,t-=(k+q)%p<1):t?t-z&&g:1)

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

कैसे?

दशमलव अंकों से युक्त एक भाजक और एक लाभांश को देखते हुए , हम सभी लिए निम्नलिखित अभिव्यक्ति की गणना करते हैं :क्यू एन 0 कश्मीर < ppqn0k<p

(1)k×10n+q(modp)

किसी भी के लिए वहां मौजूद और ऐसी है कि , को प्रेरित किया:xpm10k<px=mp+k

x×10n+q(modp)=(mp+k)×10n+q(modp)=(mp×10n(modp))+(k×10n+q(modp))(modp)=0+(k×10n+q(modp))(modp)=k×10n+q(modp)

इसलिए, यदि के बराबर है सभी के लिए , यह भी बराबर होगा किसी के लिए और जवाब है सच(1)00k<p0kp

इसी कारण से, यदि सभी लिए से अधिक है , तो उत्तर गलत है(1)00k<p

यदि के परिणामों को मिलाया जाता है, तो हम अभी तय नहीं कर सकते हैं और या ईओएफ अधिसूचना के अधिक अंकों की आवश्यकता है ।(1)q

टिप्पणी की गई

p => (                       // p = divisor
  q = '',                    // q = dividend stored as a string, initially empty
  g = (                      // g() = curried function taking:
    d,                       //   d = next digit
    t =                      //   t = number of iterations yielding a non-zero value
    k =                      //   k = total number of iterations to process
    z =                      //   z = copy of k
      !~d ||                 //   if d == -1 (meaning EOF), use only 1 iteration
                             //   so that we simply test the current value of q
      (q = d + q, p)         //   otherwise, prepend d to q and use p iterations
  ) =>                       //
    k-- ?                    //   decrement k; if it was not equal to zero:
      g(                     //     do a recursive call to g():
        d,                   //       pass the current value of d (will be ignored anyway)
        t -= (k + q) % p < 1 //       test (k + q) % p and update t accordingly
      )                      //     end of recursive call
    :                        //   else:
      t ?                    //     if t is greater than 0:
        t - z && g           //       return 0 if t == z, or g otherwise
      :                      //     else:
        1                    //       return 1
)                            //

2

बैच, 177 169 बाइट्स

@set n=
@set g=1
:l
@set/ps=
@if %s%==- goto g
@set n=%s%%n%
@set/ae=%1/g,g*=2-e%%2,g*=1+4*!(e%%5),r=n%%g
@if %g% neq %1 if %r%==0 goto l
:g
@cmd/cset/a!(n%%%1)

dएक कमांड-लाइन पैरामीटर के रूप में लेता है और EOF मार्कर के nसाथ अलग-अलग लाइनों पर अंकों को पढ़ता -है। 1विभाज्य के लिए आउटपुट , 0यदि नहीं। स्पष्टीकरण:

@set n=

nखाली स्ट्रिंग के लिए प्रारंभिक ।

@set g=1

g है gcd(d, 10**len(n))

:l

एक लूप पढ़ना अंक शुरू करें।

@set/ps=

अगला अंक पढ़ें।

@if %s%==- goto g

EOF पर प्रसंस्करण बंद करो।

@set n=%s%%n%

अगले अंक को पूर्व निर्धारित करें n

@set/ae=%1/g,g*=2-e%%2,g*=1+4*!(e%%5),r=n%%g

gअब अपडेट करें कि len(n)वृद्धि हुई है और गणना करें n%g

@if %g% neq %1 if %r%==0 goto l

यदि rगैर-शून्य है, तो dनिश्चित रूप से विभाजित नहीं होता है n, क्योंकि g, का एक कारक d, नहीं करता है। तो rशून्य है तो हम केवल जान सकते हैं कि dविभाजित nकरता है, तो gबराबर dहै, इसलिए यदि यह नहीं है, पाश जारी है।

:g

ईओएफ पर अंक-पठन लूप से बाहर निकलें।

@cmd/cset/a!(n%%%1)

गणना करें और परिणाम को स्पष्ट रूप से बताएं।

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