Untitled

 avatar
unknown
python
4 years ago
1.3 kB
14
Indexable
import numpy as np

#read in data
f = open('input_4.txt')
nums = np.array(next(f).strip().split(',')).astype(int)
next(f)
grids = []
grid = []
for line in f:
    if len(grid) == 5:
        grids.append(np.stack(grid))
        grid = []
    if len(line) == 1:
        pass
    else:
        grid.append(np.array(line.strip().split()).astype(int))
grids = np.stack(grids)


#play bingo
bingo = np.ones_like(grids)
for n in nums:
    bingo[grids==n] = 0
    is_bingo_row = np.sum(bingo, axis=1) == 0
    has_bingo_row = np.any(is_bingo_row,axis=1)
    is_bingo_col = np.sum(bingo, axis=2) == 0
    has_bingo_col = np.any(is_bingo_col,axis=1)
    has_bingo = np.logical_or(has_bingo_row, has_bingo_col)
    if np.any(has_bingo):
        print((grids[has_bingo]*bingo[has_bingo]).sum() * n)
        break


#part 2
bingo = np.ones_like(grids)
for n in nums:
    bingo[grids==n] = 0
    is_bingo_row = np.sum(bingo, axis=1) == 0
    has_bingo_row = np.any(is_bingo_row,axis=1)
    is_bingo_col = np.sum(bingo, axis=2) == 0
    has_bingo_col = np.any(is_bingo_col,axis=1)
    has_no_bingo = np.logical_not(np.logical_or(has_bingo_row, has_bingo_col))
    if len(has_no_bingo) == 1:
        print((grids*bingo).sum() * n)
        break
    grids = grids[has_no_bingo]
    bingo = bingo[has_no_bingo]
Editor is loading...