#!/bin/python3 import sys, time ,re from pprint import pprint sys.path.insert(0, '../../') from fred import list2int,get_re,nprint,lprint start_time = time.time() input_f = 'input' part = 2 ######################################### # # # Part 1 # # # ######################################### def loadFile(input_f): # For some reason, when this is a dict {} # and i use instructions[int(a[0])] = list2int(b) # the line with 360: 8 3 7 4 1 is not used in the # for loop that runs through all the instructions. # This is because two items are 360 and dicts need # distinct keys. instructions = [] with open(input_f) as file: for line in file: a = line.rstrip().split(': ') b = a[1].split(' ') instructions.append([int(a[0]),list2int(b)]) return instructions if part == 1: def calculateResult(a:int,b:list,result:int): if not b: return result if result == a else 0 add = calculateResult(a,b[1:],b[0]+result) mul = calculateResult(a,b[1:],b[0]*result) return add or mul instructions = loadFile(input_f) result = 0 for idx,i in enumerate(instructions): result += calculateResult(instructions[idx][0],instructions[idx][1],0) print(result) ######################################### # # # Part 2 # # # ######################################### if part == 2: def calculateResult2(a:int,b:list,result:int): if result > a: # If the current result is more than out goal, return 0 return 0 if not b: return result if result == a else 0 add = calculateResult2(a,b[1:],b[0]+result) mul = calculateResult2(a,b[1:],b[0]*result) # Issues happened when i did b[0]||result. Reversing it # gave me the right result. con = calculateResult2(a,b[1:],int(str(result)+str(b[0]))) return add or mul or con instructions = loadFile(input_f) result = 0 for idx,i in enumerate(instructions): #print('Line',(idx+1),i) result += calculateResult2(instructions[idx][0],instructions[idx][1],0) print(result) print("--- %s seconds ---" % (time.time() - start_time))