DEBUG = False DEBUG_PREFIX = "" def debug(message, *args, **kwargs): if DEBUG: print(f"{DEBUG_PREFIX} {message}", *args, **kwargs) def main(): from string import digits DIGITS_SPELLED = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] with open("input01.txt", "r") as file: input_lines = file.readlines() # The calibration value of each line is the first and last digit # in each line, in order, combined to make a two-digit number. calibrations = [] for line in input_lines: line = line.strip() if line == "": continue first = "" last = "" spelled_digits = {} first_spelled = len(line) + 1 last_spelled = -1 for digit in DIGITS_SPELLED: position = 0 while position < len(line): debug(f"{position=}", end=" ") if digit in line[position:]: new_index = line[position:].index(digit) spelled_digits[new_index + position] = str(DIGITS_SPELLED.index(digit)) position += new_index + 1 else: position = len(line) if len(spelled_digits) > 0: first_spelled = min(spelled_digits.keys()) last_spelled = max(spelled_digits.keys()) debug(spelled_digits, first_spelled, last_spelled) for i, char in enumerate(line): if char in digits: if i < first_spelled: debug(f"Found first digit in {line} at position {i}: {char}") first = char break else: debug(f"Found first digit in {line} at position {first_spelled}: {spelled_digits[first_spelled]}") first = spelled_digits[first_spelled] break for i, char in enumerate(line[::-1]): if char in digits: if (len(line) - i) > last_spelled: debug(f"Found last digit in {line} at position {len(line) - i}: {char}") last = char break else: debug(f"Found last digit in {line} at position {last_spelled}: {spelled_digits[last_spelled]}") last = spelled_digits[last_spelled] break calibrations.append(int(first + last)) debug(calibrations) # The total calibration value is the sum of the individual # calibration values. print(f"Total calibration value: {sum(calibrations)}") if __name__ == "__main__": main()