O décimo terceiro dia do Advent of Code foi ontem 13/12/2024!
Se você caiu aqui hoje pela primeira vez, não deixe de ler os posts sobre o
Dia 1,
Dia 2,
Dia 3,
Dia 4,
Dia 5,
Dia 6,
Dia 7,
Dia 8,
Dia 9,
Dia 10,
Dia 11 e
Dia 12.
Classifiquei o décimo terceiro problema como médio (parte 1) e médio (parte 2).
Dicas
- O programa tem um entrada em várias linhas
- Você pode usar expressões regulares para extrair os valores de cada linha.
- Cada grupo de 4 linhas, trás 4 valores, a entrada para o programa.
- Você pode observar o problema como uma sistema de equações lineares.
- O sistema não tem solução quando a resposta do sistema de equações não é inteira.
- Ache os valores de a e b que satisfaçam a equação. Neste caso, calcule o custo como sendo
3*a + b
.
- Se você utilizar um otimizador como
scipy.optimize.linprog
ou Pulp
você poderá ter problemas com os grandes números da parte 2.
- Modelo no Pulp:
def psolve(ax, ay, bx, by, rx, ry):
model = LpProblem("Minimize Tokens", LpMinimize)
A = LpVariable("A", lowBound=0, cat=LpInteger)
B = LpVariable("B", lowBound=0, cat=LpInteger)
model += 3 * A + B
model += ax * A + bx * B == rx
model += ay * A + by * B == ry
model.solve()
return model, value(A), value(B)
from scipy.optimize import linprog
def minimize_cost(x, y, r, c, max_tokens=100):
A_eq = [x, y] # Coefficient matrix for equality constraints
b_eq = r # Right-hand side of the equations
result = linprog(
c,
A_eq=A_eq,
b_eq=b_eq,
method="highs",
bounds=[(0, max_tokens), (0, max_tokens)],
integrality=[1, 1],
)
# Check if the optimization was successful
if result.success:
a, b = result.x
print(
f"The optimized solution is: a = {a}, b = {b}, with a cost of {3*a + b} {result.fun}"
)
return a, b, 3 * a + b
else:
print("No valid solution (could not optimize).", result)
return None
Quanto de Python você precisa saber?
Os capítulos se referem ao meu livro Introdução à Programação com Python.