From 801bee8b3a021acf6da9cde38d9e84b3277c15d17de9b9d581992a9680ed9f5d Mon Sep 17 00:00:00 2001 From: nazrin Date: Mon, 9 Dec 2024 00:59:11 +0000 Subject: [PATCH] Day 8 --- 8.jl | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 8.jl diff --git a/8.jl b/8.jl new file mode 100644 index 0000000..77724b7 --- /dev/null +++ b/8.jl @@ -0,0 +1,42 @@ +const grid = [ collect(line) for line in readlines("input/8") ] +const size = length(grid) + +const Coords = Tuple{Int,Int} + +ants::Dict{Char,Vector{Coords}} = Dict() +for (y,row) in enumerate(grid) + for (x,c) in enumerate(row) + if c != '.' + get!(ants, c, []) .= push!(ants[c], (x, y)) + end + end +end + +isOnMap(n) = 1 <= n[1] <= size && 1 <= n[2] <= size +partOneGrid = deepcopy(grid) + +partOneSet, partTwoSet = Set(), Set() + +for (freq,coords) in ants + for (a,b) in Iterators.filter((x) -> x[1] != x[2], ( sort([a, b]) for a in coords, b in coords )) + local diff = a .- b + for n in (a .+ diff, b .- diff) + if isOnMap(n) + push!(partOneSet, n) + end + end + for (n,fn) in ((a,.-), (b,.+)) + while isOnMap(n) + n = fn(n, diff) + if isOnMap(n) + push!(partTwoSet, n) + end + end + end + end +end + +const partOne, partTwo = length(partOneSet), length(partTwoSet) + +@show partOne, partTwo +