DEV Community

Yuan Gao
Yuan Gao

Posted on

3 2

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)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay