Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3
- [d, d+1, d+2, d+3]
- 1 2 3 4 5 6 7 8 9
- [d, x, d+1, x]
- [x,y,d,x,y,d+1]
- >>> import itertools
- >>> g = (digit for number in itertools.count(1) for digit in map(int, str(number)))
- >>> digits = 2, 2, 3, 2, 4
- >>> i=9+(22-10)*2 + 1; list(itertools.islice(g, i, i+len(digits)))
- [2, 2, 3, 2, 4]
- def find_min_index(number):
- digits = get_digits(number)
- # find minimal n and start,end such that
- # digits = get_digits(n)[start:] + get_digits(n+1) +...+ get_digits(n+m)[:end]
- # brute force approach
- for ndigits_in_n in range(1, len(digits)): # m=ceil(len(digits)/ndigits_in_n)
- for start in range(ndigits_in_n):
- i = ndigits_in_n - start # where (n+1) starts in *digits*
- # is10pow = (10**ndigits_in_n == (n+1))
- is10pow = (digits[i:i + ndigits_in_n + 1] == [1] + [0] * ndigits_in_n)
- # get_digits(n+1) == digits[i:i+ndigits_in_n+is10pow]
- n = digits2number(digits[i:i+ndigits_in_n+is10pow]) - 1
- if matched_n(digits, n, start):
- return get_index(n) + start
- return get_index(number) # m == 0
- >>> find_min_index(22324)
- 34 # верно
- def get_digits(number):
- """
- >>> get_digits(22324)
- [2, 2, 3, 2, 4]
- """
- return list(map(int, str(number))) # NOTE: O(k**2) in CPython
- import functools
- def digits2number(digits):
- """
- >>> digits2number([1,2,3])
- 123
- """
- return functools.reduce(lambda number, digit: 10 * number + digit, digits)
Add Comment
Please, Sign In to add comment