Untitled
unknown
python
4 years ago
2.2 kB
8
Indexable
def solve2(inp_filename): with open(inp_filename) as file: lines = [s.strip() for s in file.readlines()] commands = [] for line in lines: cmd, coords = line.split(' ') coords = [s.split('=') for s in coords.split(',')] ranges = dict() for ax, range_str in coords: lims = list(map(int, range_str.split('..'))) ranges[ax] = lims commands.append((cmd, ranges)) Xsets = { ax:set() for ax in 'xyz' } for cmd, ranges in commands: for ax, lims in ranges.items(): Xsets[ax].add(lims[0]) Xsets[ax].add(lims[1] + 1) XI = { ax:dict() for ax in 'xyz' } IX = { ax:[] for ax in 'xyz' } for ax in 'xyz': X = list(sorted(Xsets[ax])) for x in X: XI[ax][x] = len(XI[ax]) IX[ax].append(x) lengths = [len(XI[ax]) for ax in 'xyz'] print(lengths, np.prod(lengths)) Flags = np.zeros(tuple(lengths), dtype=np.uint8) for cmdi, (cmd, ranges) in enumerate(commands): subst_ranges = { ax: [0, 0] for ax in 'xyz' } for ax, lims in ranges.items(): subst_ranges[ax][0] = XI[ax][lims[0]] subst_ranges[ax][1] = XI[ax][lims[1] + 1] x0, x1 = subst_ranges['x'][0], subst_ranges['x'][1] y0, y1 = subst_ranges['y'][0], subst_ranges['y'][1] z0, z1 = subst_ranges['z'][0], subst_ranges['z'][1] Flags[x0:x1, y0:y1, z0:z1] = 1 if cmd == 'on' else 0 print(f"{len(commands)} commands executed") X = np.array(IX['x'], dtype=np.int64) X = X[1:] - X[:-1] X = np.array(X, dtype=np.uint64) Y = np.array(IX['y'], dtype=np.int64) Y = Y[1:] - Y[:-1] Y = np.array(Y, dtype=np.uint64) Z = np.array(IX['z'], dtype=np.int64) Z = Z[1:] - Z[:-1] Z = np.array(Z, dtype=np.uint64) Muls = np.zeros((len(X), len(Y), len(Z)), dtype=np.uint64) for x in range(len(X)): Muls[x,:,:] = X[x] * Y.reshape((-1,1)) @ Z.reshape((1,-1)) ans2 = np.sum(Muls * Flags[:-1,:-1,:-1]) return ans2 # solve2('input_short.tmp') solve2('input')
Editor is loading...