summaryrefslogtreecommitdiff
path: root/2021/day04/example.py
diff options
context:
space:
mode:
Diffstat (limited to '2021/day04/example.py')
-rw-r--r--2021/day04/example.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/2021/day04/example.py b/2021/day04/example.py
new file mode 100644
index 0000000..4eac08a
--- /dev/null
+++ b/2021/day04/example.py
@@ -0,0 +1,59 @@
1import sys
2
3infile = sys.argv[1] if len(sys.argv)>1 else '4.in'
4
5# parse input
6numbers = None
7B = []
8F = []
9board = []
10for line in open(infile):
11 line = line.strip()
12 if numbers is None:
13 numbers = [int(x) for x in line.split(',')]
14 else:
15 if line:
16 board.append([int(x) for x in line.split()])
17 else:
18 if board:
19 B.append(board)
20 board = []
21B.append(board)
22
23for b in B:
24 assert len(b)==5 and len(b[0])==5
25 F.append([[False for _ in range(5)] for _ in range(5)])
26
27WON = [False for _ in range(len(B))]
28for num in numbers:
29 for i in range(len(B)):
30 for r in range(5):
31 for c in range(5):
32 if B[i][r][c] == num:
33 F[i][r][c] = True
34
35 won = False
36 for r in range(5):
37 ok = True
38 for c in range(5):
39 if not F[i][r][c]:
40 ok = False
41 if ok:
42 won = True
43 for c in range(5):
44 ok = True
45 for r in range(5):
46 if not F[i][r][c]:
47 ok = False
48 if ok:
49 won = True
50 if won and not WON[i]:
51 WON[i] = True
52 nwin = len([j for j in range(len(B)) if WON[j]])
53 if nwin == 1 or nwin == len(B):
54 unmarked = 0
55 for r in range(5):
56 for c in range(5):
57 if not F[i][r][c]:
58 unmarked += B[i][r][c]
59 print(unmarked * num)