> 1000 अंकों की संख्या से सबसे छोटी अवधि ज्ञात कीजिए


10

आपका काम इस नंबर को इनपुट के रूप में लेना है (हालांकि इसे किसी अन्य नंबर के साथ भी काम करना चाहिए):

18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957

और सबसे छोटी अवधि ज्ञात करें, जो इस मामले में है:

1834957034571097518349570345710975183495703457109751834957034571097518349570345710976

गुड लक और मजा करें!


स्पष्टीकरण :

  • इनपुट नंबर में न्यूनतम एक अवधि और एक आंशिक अवधि होती है
  • अवधि हमेशा इनपुट नंबर की शुरुआत में शुरू होती है
  • अवधि का अर्थ है इस मामले में संख्याओं का एक क्रम जो खुद को दोहराता है।

इनपुट संख्या का अधिकतम आकार क्या है? यदि आपका मतलब 1000 अधिकतम आकार है, तो आपका >गलत तरीका है।
लेवल रिवर सेंट

@steveverrill: नहीं, प्रति से अधिक इनपुट संख्या का कोई आकार नहीं है, लेकिन इसे 2 ^ 16 अंकों तक सीमित करें (क्योंकि आपने पूछा था)।
माइकल बोल्ली

3
एक अवधि क्या है?
फ्यूजएक्सएक्सएल

@FUZxxl इस मामले में: संख्याओं का एक क्रम जो खुद को दोहराता है।
माइकल बोल्ली

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

जवाबों:


4

सीजेएम, 20 16 बाइट्स

Ll:Q{+_Q,*Q#!}=;

STDIN से पढ़ता है। इसे ऑनलाइन आज़माएं।

उपरोक्त कोड को O (n 2 ) मेमोरी की आवश्यकता होगी , जहां n इनपुट की लंबाई है। यह 2 16 अंकों के साथ काम करेगा , जब तक आपके पास पर्याप्त मेमोरी है।

यह पांच अतिरिक्त बाइट्स की लागत तय की जा सकती है:

Ll:Q{+_Q,1$,/)*Q#!}=;

उदाहरण चलाते हैं

$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957; echo
1834957034571097518349570345710975183495703457109751834957034571097518349570345710976
$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 12345123451; echo
12345
$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 1234512345; echo
12345
$ cjam <(echo 'Ll:Q{+_Q,*Q#!}=;') <<< 123451; echo
12345

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

इनपुट Q के लिए, विचार यह है कि पहले वर्ण len (Q) बार दोहराएं और जांचें कि क्या परिणाम में Q का सूचकांक 0. है। यदि ऐसा नहीं है, तो पहले दो वर्ण len (Q) बार दोहराएं , आदि।

L                   " Push L := [].                                                       ";
 l:Q                " Read one line from STDIN and save the result in Q.                  ";
    {        }=     " Find the first element q ∊ Q that yields a truthy value:            ";
     +              "   Execute L += [q].                                                 ";
      _Q,*Q#        "   Push (L * len(Q)).index(Q).                                       ";
            !       "   Compute the logical NOT of the index.                             ";
               ;    " Discard the last q. This leaves L on the stack.                     ";

8

रेगेक्स (.NET फ्लेवर), 23 22 बाइट्स

.+?(?=(.*$)(?<=^\1.*))

यह एक विकल्प के रूप में आवश्यक अवधि से मेल खाएगा।

इसका परीक्षण यहां करें।

यह कैसे काम करता है?

# The regex will always find a match, so there's no need to anchor it to
# the beginning of the string - the match will start there anyway.
.+?        # Try matching periods from shortest to longest
(?=        # Lookahead to ensure that what we've matched is actually
           # a period. By using a lookahead, we ensure that this is
           # not part of the match.
  (.*$)    # Match and capture the remainder of the input in group 1.
  (?<=     # Use a lookahead to ensure that this remainder is the same
           # as the beginning of the input. .NET lookaheads are best
           # read from right to left (because that's how they are matched)
           # so you might want to read the next three lines from the 
           # bottom up.
    ^      # Make sure we can reach the beginning of the string.
    \1     # Match group 1.
    .*     # Skip some characters, because the capture won't cover the
           # entire string.
  )
)

1
यह तभी काम करता है जब अवधि स्ट्रिंग की शुरुआत में शुरू होती है, हालांकि। यहाँ ऐसा ही होता है, लेकिन मैं इसे ऐनक में नहीं देखता। सही?
टिम पीटरज़ेकर

1
@TimPietzcker ओपी की टिप्पणी देखें / प्रश्न पर संपादित करें: अवधि हमेशा स्ट्रिंग की शुरुआत में शुरू होती है।
मार्टिन एंडर

Regex Storm .Net को .NET के रूप में अच्छी तरह से संभालना लगता है, और इसके लिए सिल्वरलाइट (अधिकांश प्लेटफार्मों पर अनुपलब्ध) की आवश्यकता नहीं होती है।
डेनिस

@ डेनिस धन्यवाद, मुझे नहीं पता था कि एक!
मार्टिन एंडर

1
@ टोलोस ऐसा इसलिए है क्योंकि आप यह सुनिश्चित नहीं करते हैं कि आप इस तरह से स्ट्रिंग के अंत तक पहुँच सकते हैं। इसलिए यह केवल पहली चीज का उपयोग करेगा जो सभी को दोहराता है। एग aabaabaabशायद मैच करेगा aक्योंकि यह दोहराता है। मुझे अभी तक इसे PCRE में हल करने का कोई तरीका नहीं मिला है। डेनिस ने अब हटाए गए उत्तर में कोशिश की, लेकिन वह पूरी तरह से काम नहीं किया। Btw, आप की जरूरत नहीं है g
मार्टिन एंडर

3

अजगर 60

s अंकों का तार है

[s[:i]for i in range(len(s))if(s[:i]*len(s))[:len(s)]==s][0]

उदाहरण के लिए:

>>> s = '18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957'
>>> [s[:i]for i in range(len(s))if(s[:i]*len(s))[:len(s)]==s][0]
'1834957034571097518349570345710975183495703457109751834957034571097518349570345710976'

1

अजगर , 14 वर्ण

hf}z*lzTm<zdUz

स्पष्टीकरण:

implicit:      z = input()
h              head(
 f                  filter(lambda T:
  }z                                z in
    *lz                                  len(z) * 
       T                                          T,
  m                        map(lambda d:
   <zd                                  z[:d],
   Uz                                   range(len(d)))))

अनिवार्य रूप से, यह इनपुट के सभी प्रारंभिक अनुक्रम उत्पन्न करता है, प्रत्येक एक len(z)बार दोहराता है , और देखता है कि क्या z, परिणामी स्ट्रिंग के भीतर इनपुट निहित है या नहीं ।


यह एक मान्य उत्तर नहीं है, लेकिन हाल ही में Pyth में एक फीचर जोड़ा गया था, सवाल पूछे जाने के बाद, यह 12 वर्ण समाधान की अनुमति देता है:

<zf}z*lz<zT1

यह पूर्णांक सुविधा पर फ़िल्टर का उपयोग करता है।


0

जाप , 8 बाइट्स

å+ æ@¶îX

कोशिश करो

-2 बाइट्स शैगी को धन्यवाद!

ट्रांसपोंड जेएस समझाया:

// U is the input string representation of the number
U
 // cumulative reduce using the '+' operator
 // the result is an array of strings length 1, 2, ..., N
 // all substrings start with the first character from input
 .å("+")
 // find the first match
 .æ(function(X, Y, Z) {
  // repeat the substring until it is as long as the input
  // and compare it to the input
  return U === U.î(X)
 })

1
8 बाइट्स:å+ æ@¶îX
शैगी

बहुत बढ़िया :) मैंने पहले एक ऑपरेटर को कम फ़ंक्शन में फेंकते देखा है, लेकिन इसके बारे में भूल गया।
दाना

0

जावा 8, 125 बाइट्स

इनपुट को एक स्ट्रिंग के रूप में लेता है क्योंकि जावा में एक स्ट्रिंग के अलावा 1000+ अंकों की संख्या का प्रतिनिधित्व करने के लिए कोई उचित तरीका नहीं है (कोई बिगइंटरनेट प्लीज नहीं)।

s->{String o="";for(int i=0;java.util.Arrays.stream(s.split(o+=s.charAt(i++))).filter(b->!b.isEmpty()).count()>1;);return o;}

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


आप Stringvar से बदल सकते हैं । -3 बाइट्स
एडम

@ अदम जावा 8 हालांकि
बेंजामिन अर्कहार्ट

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