Problem:
Paper Fortune If you visit Aizu Akabeko shrine, you will find a unique paper fortune on which a number with more than one digit is written. Each digit ranges from 1 to 9 (zero is avoided because it is considered a bad omen in this shrine). Using this string of numeric values, you can predict how many years it will take before your dream comes true. Cut up the string into more than one segment and compare their values. The difference between the largest and smallest value will give you the number of years before your wish will be fulfilled. Therefore, the result varies depending on the way you cut up the string. For example, if you are given a string 11121314 and divide it into segments, say, as 1,11,21,3,14, then the difference between the largest and smallest is 21 - 1 = 20. Another division 11,12,13,14 produces 3 (i.e. 14 - 11) years. Any random division produces a game of luck. However, you can search the minimum number of years using a program. Given a string of numerical characters, write a program to search the minimum years before your wish will be fulfilled. Input The input is given in the following format.  n  An integer n is given. Its number of digits is from 2 to 100,000, and each digit ranges from 1 to 9. Output Output the minimum number of years before your wish will be fulfilled. Sample Input 1 11121314 Sample Output 1 3 Sample Input 2 123125129 Sample Output 2 6 Sample Input 3 119138 Sample Output 3 5

Solution (Python):
n = input()
length = len(n)
ans = 10


lst = []
ind = 0
while ind < length:
  if n[ind] == "1" and ind + 1 <= length - 1:
    lst.append(int(n[ind:ind + 2]))
    ind += 2
  else:
    lst.append(int(n[ind]))
    ind += 1
if len(lst) >= 2:
  ans = min(ans, max(lst) - min(lst))


divisors = []
for i in range(1, length // 2 + 1):
  if length % i == 0:
    divisors.append(i)

for i in divisors:
  lst = []
  for j in range(0, length, i):
    lst.append(int(n[j:j + i]))
  ans = min(ans, max(lst) - min(lst))

print(ans)

Solution (Python):
def sub(maxs, mins):
    for i in range(len(maxs)):
        if maxs[i] != mins[i]:
            if i == len(maxs)-1:
                return int(maxs[i]) - int(mins[i])
            if i == len(maxs)-2:
                return int(maxs[i:i+2]) - int(mins[i:i+2])
            return 10
    return 0

def checkEqual(S):
    ans = 8
    for k in range(1, len(S)):
        if len(S)%k != 0: continue
        mins = maxs = S[0:k]
        for s in range(0, len(S), k):
            maxs = max(maxs, S[s:s+k])
            mins = min(mins, S[s:s+k])
        ans = min(ans, sub(maxs, mins))

    return ans

def check12(S):
    maxv = 0
    minv = 10
    p = 0
    while p < len(S):
        v = int(S[p])
        if  S[p] == '1' and p+1 < len(S):
            v = 10 + int(S[p+1])
            p += 1
        maxv = max(maxv, v)
        minv = min(minv, v)
        p += 1
    return maxv - minv

S = input()
print(min(checkEqual(S), check12(S)))