diff --git a/2025/10/p2.py b/2025/10/p2.py new file mode 100644 index 0000000..e142191 --- /dev/null +++ b/2025/10/p2.py @@ -0,0 +1,75 @@ +import pulp +import numpy as np +from scipy.optimize import minimize + + +# pretty chatgpt'd +def solve_linear_program(A, B): + """ + Solve the integer linear programming problem to minimize the sum of variables + given a matrix A (coefficients) and a vector B (right-hand side). + """ + # Number of variables (columns in A) + num_variables = A.shape[1] + + # Define the problem as a minimization problem + prob = pulp.LpProblem("Minimize_Sum_of_Variables", pulp.LpMinimize) + + # Define variables (all non-negative integers) + variables = [pulp.LpVariable(f'x{i}', lowBound=0, cat='Integer') for i in range(num_variables)] + + # Objective function: Minimize the sum of the variables + prob += pulp.lpSum(variables), "Minimize sum" + + # Add the constraints based on A * X = B + for i in range(A.shape[0]): # Iterate over each equation (row of A) + prob += pulp.lpSum(A[i, j] * variables[j] for j in range(num_variables)) == B[i] + + # Solve the problem + prob.solve(pulp.PULP_CBC_CMD(msg=False)) + + # Get the results + if pulp.LpStatus[prob.status] == 'Optimal': + solution = [v.varValue for v in variables] + return solution, sum(solution) + else: + return None, None + + + +def parse_buttons(bts): + return list(map(lambda bt: list(map(int, bt[1:-1].split(","))), bts)) + +def make_btn(len, bt): + btn = [0] * len + for idx in bt: + btn[idx] = 1 + return btn + +def parse_ln(ln): + ln = ln.strip() + ln = ln.split(" ") + + coefs = list(map(int, ln[-1][1:-1].split(","))) + return list(map(lambda bt: + make_btn(len(coefs), bt) + , parse_buttons(ln[1:-1]))), coefs + + +total = 0 +with open("input.txt", "r") as file: + for line in file: + coefs, terms = parse_ln(line) + A = np.transpose(np.array(coefs)) + b = np.array(terms) + + solution, min_sum = solve_linear_program(A, b) + + if solution is not None: + total += min_sum + # print(f"Optimal solution: {solution}") + # print(f"Minimum sum: {min_sum}") + else: + print("No solution found.") + +print(f"total is {total}")