Find smallest period from a >1000 digit number
Regex (.NET flavour), 23 22 bytes
.+?(?=(.*$)(?<=^\1.*))
This will match the required period as a substring.
Test it here.
How does it work?
# 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.
)
)
CJam, 20 16 bytes
Ll:Q{+_Q,*Q#!}=;
Reads from STDIN. Try it online.
The above code will require O(n2) memory, where n is the length of the input. It will work with 216 digits, as long as you have enough memory.
This can be fixed the the cost of five extra bytes:
Ll:Q{+_Q,1$,/)*Q#!}=;
Example run
$ 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
How it works
For input Q, the idea is to repeat the first character len(Q) times and check if the index of Q in the result is 0. If it isn't, repeat the first two characters len(Q) times, etc.
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. ";
Python 60
s
is the string of digits
[s[:i]for i in range(len(s))if(s[:i]*len(s))[:len(s)]==s][0]
eg:
>>> s = '18349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957034571097518349570345710975183495703457109761834957034571097518349570345710975183495703457109751834957034571097518349570345710976183495703457109751834957034571097518349570345710975183495703457109751834957034571097618349570345710975183495703457109751834957'
>>> [s[:i]for i in range(len(s))if(s[:i]*len(s))[:len(s)]==s][0]
'1834957034571097518349570345710975183495703457109751834957034571097518349570345710976'