| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import os
- import sys
- from collections import Counter
- from itertools import chain
- sys.setrecursionlimit(5000)
- with open(os.path.join(os.path.dirname(__file__), "example.txt")) as example:
- example_data = example.read().splitlines()
- example_data = [list(n) for n in example_data]
- with open(os.path.join(os.path.dirname(__file__), "input.txt")) as example:
- input_data = example.read().splitlines()
- input_data = [list(n) for n in input_data]
- def init(data):
- charged = [["."] * len(data[0]) for _ in range(len(data))]
- direction = [["."] * len(data[0]) for _ in range(len(data))]
- return data, charged, direction
- data, charged, direction = init(example_data)
- def bounce(i=0, j=0, succ=1, h=True, v=False):
- if i >= len(data[0]) or i < 0 or j >= len(data) or j < 0:
- return
- if h:
- if succ > 0 and direction[i][j] == ">":
- return
- elif succ > 0:
- direction[i][j] = ">"
- if succ < 0 and direction[i][j] == "<":
- return
- elif succ < 0:
- direction[i][j] = "<"
- else:
- if succ > 0 and direction[i][j] == "v":
- return
- elif succ > 0:
- direction[i][j] = "v"
- if succ < 0 and direction[i][j] == "^":
- return
- elif succ < 0:
- direction[i][j] = "^"
- symbol = data[i][j]
- charged[i][j] = "#"
- if h:
- if symbol == "." or symbol == "-":
- bounce(i=i, j=j + succ, succ=succ, h=True, v=False)
- elif symbol == "|":
- bounce(i=i + succ, j=j, succ=succ, h=False, v=True)
- bounce(i=i - succ, j=j, succ=-succ, h=False, v=True)
- elif symbol == "\\":
- bounce(i=i + succ, j=j, succ=succ, h=False, v=True)
- elif symbol == "/":
- bounce(i=i - succ, j=j, succ=-succ, h=False, v=True)
- else:
- raise Exception("PIDOR GNOY " + symbol)
- elif v:
- if symbol == "." or symbol == "|":
- bounce(i=i + succ, j=j, succ=succ, h=False, v=True)
- elif symbol == "\\":
- bounce(i=i, j=j + succ, succ=succ, h=True, v=False)
- elif symbol == "/":
- bounce(i=i, j=j - succ, succ=-succ, h=True, v=False)
- elif symbol == "-":
- bounce(i=i, j=j + succ, succ=succ, h=True, v=False)
- bounce(i=i, j=j - succ, succ=-succ, h=True, v=False)
- else:
- raise Exception("PIDOR GNOY " + symbol)
- else:
- raise Exception(f"PIDOR GNOY + {h} + {v}")
- # part 1 1
- data, charged, direction = init(example_data)
- bounce()
- print(c := Counter(chain(*charged))["#"])
- # part 1 2
- data, charged, direction = init(input_data)
- bounce()
- print(c := Counter(chain(*charged))["#"])
- # part 2 1
- m = 0
- for i in range(len(data)):
- data, charged, direction = init(example_data)
- bounce(i=i, j=0, succ=1, h=True, v=False)
- m = max(m, Counter(chain(*charged))["#"])
- data, charged, direction = init(example_data)
- bounce(i=i, j=len(data[0]) - 1, succ=-1, h=True, v=False)
- m = max(m, Counter(chain(*charged))["#"])
- for j in range(len(data[0])):
- data, charged, direction = init(example_data)
- bounce(i=0, j=j, succ=1, h=False, v=True)
- m = max(m, Counter(chain(*charged))["#"])
- data, charged, direction = init(example_data)
- bounce(i=len(data) - 1, j=j, succ=-1, h=False, v=True)
- m = max(m, Counter(chain(*charged))["#"])
- print(m)
- # part 2 2
- m = 0
- for i in range(len(data)):
- data, charged, direction = init(input_data)
- bounce(i=i, j=0, succ=1, h=True, v=False)
- m = max(m, Counter(chain(*charged))["#"])
- data, charged, direction = init(input_data)
- bounce(i=i, j=len(data[0]) - 1, succ=-1, h=True, v=False)
- m = max(m, Counter(chain(*charged))["#"])
- for j in range(len(data[0])):
- data, charged, direction = init(input_data)
- bounce(i=0, j=j, succ=1, h=False, v=True)
- m = max(m, Counter(chain(*charged))["#"])
- data, charged, direction = init(input_data)
- bounce(i=len(data) - 1, j=j, succ=-1, h=False, v=True)
- m = max(m, Counter(chain(*charged))["#"])
- print(m)
|