Day 8: Resonant Collinearity
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
python
solution
import aoc def setup(): lines = aoc.get_lines(8, stripped=True) ll = len(lines) fm = {f: [(x, y) for y, r in enumerate(lines) for x, z in enumerate(r) if z == f] for f in {z for r in lines for z in r if z != '.'}} return ll, fm def fa(fm, ll, rh=False): ans = set() for cd in fm.values(): l = len(cd) for i in range(l): x1, y1 = cd[i] for j in range(i + 1, l): x2, y2 = cd[j] dx, dy = x2 - x1, y2 - y1 if rh: for k in range(-ll, ll): x, y = x1 + k * dx, y1 + k * dy if 0 <= x < ll and 0 <= y < ll: ans.add((x, y)) else: x3, y3, x4, y4 = x1 - dx, y1 - dy, x2 + dx, y2 + dy if 0 <= x3 < ll and 0 <= y3 < ll: ans.add((x3, y3)) if 0 <= x4 < ll and 0 <= y4 < ll: ans.add((x4, y4)) return len(ans) def one(): ll, fm = setup() print(fa(fm, ll)) def two(): ll, fm = setup() print(fa(fm, ll, rh=True)) one() two()