still is.
Can I get 4d6+24 silver arrows? Lazy evaluation please.
I mean maybe that is some engineering and planning marvel but not the kind that is good for your sanity in the long run. Just saves the day.
Every family has that weird cousin (it might be me in our case....)
and Ukraine only because it borders Europe
mostly thanks to people who call everyone else anti-semitist too
After reading multiple papers on stuff like polyomino and coverings etc over the weekend, I sat down to formulate an ILP approach. All the way through I had at the back of my mind "surely he would not expect people to solve something which requires reading research papers, there must be some angle to this which makes it easier". I don't think I have ever been more right in my life and I am really glad I made the obvious fail and succeed checks based on areas lol.
import numpy as np
import itertools as it
from pathlib import Path
from time import time
cwd = Path(__file__).parent.resolve()
def timing(f):
def wrap(*args, **kw):
ts = time()
result = f(*args, **kw)
te = time()
print(f"func{f.__name__} args: {args} took: {te-ts:.4f} sec")
return result
return wrap
def parse_input(file_path):
with file_path.open("r") as fp:
data = list(map(str.strip, fp.readlines()))
objects = []
for i in range(6):
i0 = data.index(f"{i}:")
obj = np.array(list(map(list, data[i0+1:i0+4])))
obj[obj=='#']=1
obj[obj=='.']=0
objects.append(obj.astype(int))
i0 = data.index("5:")+5
placements = []
for line in data[i0:]:
dims = list(map(int, line.split(':')[0].split('x')))
nobjs = list(map(int, line.split(': ')[-1].split(' ')))
placements.append((dims, nobjs))
return objects, placements
@timing
def solve_problem(file_name):
ref_objects, placements = parse_input(Path(cwd, file_name))
areas = [np.count_nonzero(obj==1) for obj in ref_objects]
counter_succesful = 0
for grid_shape, nobjs in placements:
obj_area = np.sum(np.array(nobjs)*areas)
grid_area = np.prod(grid_shape)
worse_area = np.sum(np.array(nobjs)*9)
if worse_area<=grid_area:
counter_succesful += 1
continue
if obj_area>grid_area:
continue
return counter_succesful
if __name__ == "__main__":
assert solve_problem("input") == 583
Yes I used a polygon library so what... I did eyeball the shape and guessed what the result should have been like but still more pleasing to write something that applies generally. Although I did put an area threshold (eyeballed) which subsets the corners to test, it only reduces run time to about 1/2 (from ~10s to ~5s) so that is not necessarily very critical. If I hadn't used this library, I would probably do sth along the lines of defining my own rectangle classes with unions, intersections etc so wouldn't be a more clever approach but much more time consuming.
from pathlib import Path
import numpy as np
import shapely
cwd = Path(__file__).parent
def parse_input(file_path):
with file_path.open("r") as fp:
data = list(map(lambda x: list(map(int,x.split(','))), fp.readlines()))
return np.array(data)
def construct_shapes(coordinates, threshold):
Itriu = np.triu_indices(coordinates.shape[0], k=2)
squares = []
for i0,i1 in zip(*Itriu):
c0 = tuple(coordinates[i0,:])
c1 = tuple(coordinates[i1,:])
area = np.prod(abs(np.array(c0) - np.array(c1)) + np.array([1,1]))
if area>threshold:
c2 = (c0[0],c1[1])
c3 = (c1[0],c0[1])
squares.append(shapely.Polygon((c0,c3,c1,c2)))
polygon = shapely.Polygon(coordinates)
return polygon, squares
def solve_problem(file_name, redgreen=False, threshold=0):
coordinates = parse_input(Path(cwd, file_name))
if not redgreen:
areas = np.prod(abs(coordinates[None,:] - coordinates[:,None]) +\
np.array([1,1])[None,None,:], axis=-1)
max_area = np.max(areas)
else:
polygon, squares = construct_shapes(coordinates, threshold)
max_area = -np.inf
for inds,square in enumerate(squares):
if square.area==0:
continue
if polygon.contains(square):
c = np.array(list(zip(*square.exterior.coords.xy)))
if (a:=np.prod(abs(c[0] - c[2]) + np.array([1,1])))>max_area:
max_area = a
return int(max_area)
if __name__ == "__main__":
assert solve_problem("test_input") == 50
assert solve_problem("input") == 4763509452
assert solve_problem("test_input", True, 1) == 24
assert solve_problem("input", True, 15000*80000) == 1516897893 # threshold by eyeballing the shape
I like to call it the "Don't embarrass comrade Putin curtain"
In that regard, I fully endorse making and propagating memes on this topic.
except police gets out and starts firing at by standers for setting up this trap
wait that is a self driving car my bad
Avicenna
0 post score0 comment score
Also works with smurfs and Donald duck