DEV Community 👩‍💻👨‍💻

Yuan Gao
Yuan Gao

Posted on

Advent of Code 2021: Day 07 with Python, cheating by using scipy

Link to challenge on Advent of Code 2021 website

Loading the data

The number is again, comma-separated, so np.loadtxt() does the job

from numpy import np
pos = np.loadtxt("day_7.txt", delimiter=",")
Enter fullscreen mode Exit fullscreen mode

Part 1

So....this is where I cheat. I'd like to get the job done quickly and go about my day. Python has some great libraries for data science, like scipy which has a nice selection of optimizers. We can use one of them.

The problem boils down to an optimization problem where we are to minimize the distance between a collection of 1D points and some target point. We're trying to minimize the sum of target - position for each of the points.

from scipy.optimize import minimize_scalar
res = minimize_scalar(lambda x: np.abs(round(x)-pos).sum())
Enter fullscreen mode Exit fullscreen mode

Job done.

Part 2

Part 2 tells us the cost function isn't linear target - position but is triangle numbers n(n+1) so we simply adjust our cost function accordingly:

res = minimize_scalar(lambda x: (np.abs(round(x)-pos)*(np.abs(round(x)-pos)+1)/2).sum())
Enter fullscreen mode Exit fullscreen mode

Full Code

import numpy as np
from scipy.optimize import minimize_scalar 

pos = np.loadtxt("day_7.txt", delimiter=",", dtype="int32")

res = minimize_scalar(lambda x: np.abs(round(x)-pos).sum())
print("Part 1 result:", round(res.fun))

res = minimize_scalar(lambda x: (np.abs(round(x)-pos)*(np.abs(round(x)-pos)+1)/2).sum())
print("Part 2 result:", round(res.fun))
Enter fullscreen mode Exit fullscreen mode

Top comments (0)

All DEV content is created by the community!

Hey, if you're landing here for the first time, you should know that this website is a global community of folks who blog about their experiences to help folks like you out.

Sign up now if you're curious. It's free!