input = open("input") part1 = 0 part2 = 0 shift = [0] + [10**i for i in range(12)] for line in input: digits = list(line.strip()) # max[n] is the value of the maximal n digit subsequence max = [0] * 13 # iterate over the digits in least-significant to most-significant order. # k is the number of digits already processed. for (k,c) in enumerate(reversed(digits)): c = int(c) # the maximal n-digit subsequence we can make that starts with the # current digit (c) is equal to the concatenation of c and the # maximal (n-1)-digit subsequence. # if that's more than the best value we've seen so far, update max[n]. # we have to update max in reverse order in order to avoid reusing digits. for i in reversed(range(1,min(k+2,len(max)))): joltage = c*shift[i] + max[i-1] if joltage > max[i]: max[i] = joltage #print(max[12]) part1 += int(max[2]) part2 += int(max[12]) print(part1) print(part2)