add solutions for day 9 to 12

This commit is contained in:
Patrick Michl 2022-12-12 21:43:34 +01:00
parent 76514a78d5
commit f8f82e80b2
No known key found for this signature in database
GPG Key ID: BFE0ACEE21CD5EB0
8 changed files with 2486 additions and 0 deletions

138
data/day_10.txt Normal file
View File

@ -0,0 +1,138 @@
noop
noop
addx 5
addx 29
addx -28
addx 5
addx -1
noop
noop
addx 5
addx 12
addx -6
noop
addx 4
addx -1
addx 1
addx 5
addx -31
addx 32
addx 4
addx 1
noop
addx -38
addx 5
addx 2
addx 3
addx -2
addx 2
noop
addx 3
addx 2
addx 5
addx 2
addx 3
noop
addx 2
addx 3
noop
addx 2
addx -32
addx 33
addx -20
addx 27
addx -39
addx 1
noop
addx 5
addx 3
noop
addx 2
addx 5
noop
noop
addx -2
addx 5
addx 2
addx -16
addx 21
addx -1
addx 1
noop
addx 3
addx 5
addx -22
addx 26
addx -39
noop
addx 5
addx -2
addx 2
addx 5
addx 2
addx 23
noop
addx -18
addx 1
noop
noop
addx 2
noop
noop
addx 7
addx 3
noop
addx 2
addx -27
addx 28
addx 5
addx -11
addx -27
noop
noop
addx 3
addx 2
addx 5
addx 2
addx 27
addx -26
addx 2
addx 5
addx 2
addx 4
addx -3
addx 2
addx 5
addx 2
addx 3
addx -2
addx 2
noop
addx -33
noop
noop
noop
noop
addx 31
addx -26
addx 6
noop
noop
addx -1
noop
addx 3
addx 5
addx 3
noop
addx -1
addx 5
addx 1
addx -12
addx 17
addx -1
addx 5
noop
noop
addx 1
noop
noop

55
data/day_11.txt Normal file
View File

@ -0,0 +1,55 @@
Monkey 0:
Starting items: 71, 56, 50, 73
Operation: new = old * 11
Test: divisible by 13
If true: throw to monkey 1
If false: throw to monkey 7
Monkey 1:
Starting items: 70, 89, 82
Operation: new = old + 1
Test: divisible by 7
If true: throw to monkey 3
If false: throw to monkey 6
Monkey 2:
Starting items: 52, 95
Operation: new = old * old
Test: divisible by 3
If true: throw to monkey 5
If false: throw to monkey 4
Monkey 3:
Starting items: 94, 64, 69, 87, 70
Operation: new = old + 2
Test: divisible by 19
If true: throw to monkey 2
If false: throw to monkey 6
Monkey 4:
Starting items: 98, 72, 98, 53, 97, 51
Operation: new = old + 6
Test: divisible by 5
If true: throw to monkey 0
If false: throw to monkey 5
Monkey 5:
Starting items: 79
Operation: new = old + 7
Test: divisible by 2
If true: throw to monkey 7
If false: throw to monkey 0
Monkey 6:
Starting items: 77, 55, 63, 93, 66, 90, 88, 71
Operation: new = old * 7
Test: divisible by 11
If true: throw to monkey 2
If false: throw to monkey 4
Monkey 7:
Starting items: 54, 97, 87, 70, 59, 82, 59
Operation: new = old + 8
Test: divisible by 17
If true: throw to monkey 1
If false: throw to monkey 3

41
data/day_12.txt Normal file
View File

@ -0,0 +1,41 @@
abaaaaacccccccccccccccccccccccccccccccccccccccaaaaaaaccccaaaaaaaaaaaaaaaaacccccaaaaaacccccccccccccccccccccccaaaaaaaaccccccccccccccccccccccccccccccccaaaaaa
abaaaaaacccaaaacccccccccccccccccccccccaccccccccaaaaaaaaccaaaaaaaaaaaaaaaaccccccaaaaaacccccccccccccccccccccccccaaaaccccccccccccccccccccccccccccccccccaaaaaa
abaaaaaacccaaaacccccccccccccccccaaaaaaaacccccccaaaaaaaaacaaaaaaaaaaaaacccccccccaaaaacccccccccccccccccccccccccaaaaacccccccccccccccccccaaaccccccccccccaaaaaa
abaaacaccccaaaaccccccccccccccccccaaaaaacccccccccaaaaaaaccccaaaaaaaaaaacccccccccaaaaacccccccccccccccccccccccccaacaaaccccccccccccccccccaaacccccccccccccccaaa
abaaacccccccaaacccccccccccaacccccaaaaaaccccccccaaaaaaccccccaacaaaaaaaacccccccccccccccccccccccaaccccccccccccccacccaaaaacccccccccaaccccaaacccccccccccccccaaa
abccccccccccccccccccccccccaaaaccaaaaaaaacccccccaaaaaaaccccccccaaaaaaaaaccccccccccaacccccccccaaaccccccccccccccccccacaaacccccccccaaaaccaaacccccccccccccccaac
abccccccccccccccccccccccaaaaaacaaaaaaaaaaccccccaaccaaaaacccccaaaaccaaaaccccccccccaaacaacccccaaacaaacccaaccccccccaaaaaaaacccccccaaaaakkkkkkcccccccccccccccc
abccccccccccccccccccccccaaaaaccaaaaaaaaaacccccccccccaaaaaaccccacccaaaaaccccccccccaaaaaaccaaaaaaaaaaaaaaaccccccccaaaaaaaaccccccccaaajkkkkkkkaccccccaacccccc
abcccccccccccccccccccccccaaaaacacacaaaccccccccccccccaaaaaaccccccccaaaacccccccccaaaaaaacccaaaaaaaaaaaaaaaaaccccccccaaaaaccccccccccjjjkkkkkkkkccaaaaaacccccc
abcccccccccccccccccccccccaacaacccccaaacccaccccccccccaaaaaaccccccccaaaacccccccccaaaaaaacccccaaaaaacaaaaaaaacccccccaaaaacccccccjjjjjjjooopppkkkcaaaaaaaccccc
abcccccccccccccccccaacaacccccccccccaaaaaaacccccccccccaaaaacccccccccccccccccccccccaaaaaaccccaaaaaaccaaaaaaacccccccaaaaaacciijjjjjjjjoooopppkkkcaaaaaaaacccc
abccccccccccaaaccccaaaaacccccccccccccaaaaacccccccccccaaaaccccccccccccccccccccccccaacaaaccccaaaaaaacaaaaacccccccccaccaaaciiiijjjjjjoooopppppkllcaaaaaaacccc
abccaaccccccaaaaacaaaaacccccccccccccaaaaaacccccccccccccccccccccccccccccccccccccccaacccccccaaaacaaaaaaaaacccaaccccaaaaaciiiiinoooooooouuuupplllaaaaaacccccc
abcaaacccccaaaaaacaaaaaacccccccccccaaaaaaaaccccccccaacaccccccccccccccccccccccccccccccccccccaccccccccccaaccaaaccccaaaaaciiinnnooooooouuuuuppplllaaacacccccc
abaaaaaacccaaaaaacccaaaacccccccccccaaaaaaaaccccccccaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaacaacaaaaaaiiinnnnntttoouuuuuupppllllcccccccccc
abaaaaaaccccaaaaacccaaccccccccccacccccaaccccccccccaaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaacaaaaaaiiinnnnttttuuuuxxuuupppllllccccccccc
abaaaaacccccaacaaccccccccccccccaaaccccaacccccaacccaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccaaaaaccaaaaaaiiinnnttttxxuuxxyyuuppppllllcccccccc
abaaaacccccccccccccccccccccaaacaaaccccccaaacaaaaccacaaaacccccccccccccccccccccccccccccccccccaacccccccccccaaaaaccccaaaccciinnntttxxxxxxxyyvvvqqqqqlllccccccc
abaaaaaccccccccccccccccccccaaaaaaaaaacccaaaaaaacccccaaccccccccccccccccccccccccccccccccccccaaacccccccccccaacaaaccccccccciiinntttxxxxxxxyyvvvvvqqqqljjcccccc
abccaaaccaccccccccaaacccccccaaaaaaaaaccccaaaaaacccccccccccccccccccccccccccccccaacccccccaaaaacaaccccccccccccaacccccccccchhinnnttxxxxxxyyyyyvvvvqqqjjjcccccc
SbccccaaaacccccccaaaaaacccccccaaaaaccccccaaaaaaaaccccccccccccccccccccaaccccccaaaaccccccaaaaaaaacccccccccccccccccccccccchhhnnntttxxxxEzyyyyyvvvqqqjjjcccccc
abccccaaaacccccccaaaaaaccccccaaaaaacccccaaaaaaaaaacccccccccccccccccccaaccccccaaaaccccccccaaaaacccccccccccccccccccccccccchhhnntttxxxyyyyyyyvvvvqqqjjjcccccc
abcccaaaaaaccccccaaaaaacccccaaaaaaaccccaaaaaaaaaacccccccccccccccccaaaaaaaacccaaaacccccccaaaaaccccccccccccccccccccccccccchhmmmttxxxyyyyyyvvvvvqqqjjjdcccccc
abcccaaaaaacccccccaaaaacccccaaacaaacaaaaaaaaaaccccccccccccaaacccccaaaaaaaaccccccccccccccaacaaacccccccaacaaacccccccccccchhhmmmtswwwyyyyyyvvvqqqqjjjjdddcccc
abcccccaacccccccccaacaacccccccccccacaaaaaccaaaccccccccccaaaaacccccccaaaacccccccccccccccccccaaccccccccaaaaaacccccccccccchhhmmssswwwwwwyyywvrqqqjjjjdddccccc
abcccccccccccccccccccccccccccccccccaaaaaccccaaccccccccacaaaaaacccccaaaaacccccccccccccccccccccccccccccaaaaaacccccccccccchhhmmssswwwwwwywywwrrqjjjjddddccccc
abcccccccccccccccccccccccccccccccccaaaaaccccccccaaacaaacaaaaaacccccaaaaaaccccccccccccccccccccccccccccaaaaaaaccccccccccchhmmmsssswwsswwwwwwrrkkjjddddcccccc
abccccccccccccccccccccccccccccccccccaaaaacccccccaaaaaaacaaaaaccccccaaccaacccccccccccaaccccccccccccccaaaaaaaacaacaaccccchhhmmmsssssssswwwwrrrkkjddddaaccccc
abcccccccccccccccccccccccccaaaaaccccaacccccccccccaaaaaacaaaaacccccccccccccaacccccccaaaaaacccccccccccaaaaaaaacaaaaaccccchhgmmmmssssssrrwwwrrrkkddddaaaccccc
abcccccccccccccccccccccccccaaaaacccccccccccccccccaaaaaaaacccccccccccccccaaaaaaccccccaaaaaccccaaccccccccaaacccaaaaaaccccgggmmmmmmllllrrrrrrrkkkeedaaaaccccc
abcccccccccccaaccccccccccccaaaaaacccccccccccccccaaaaaaaaacccccccccccccccaaaaaaccccaaaaaaacccaaaacccccccaaccccaaaaaaccccggggmmmmllllllrrrrrkkkkeedaaaaacccc
abcccccccccccaaacaacaaaccccaaaaaaccccccccccccccaaaaaaaaaacccccccccccccccaaaaaaccccaaaaaaaaccaaaacccccccccccccaaaaaccccccgggggglllllllllrrkkkkeeeaaaaaacccc
abcccccccccccaaaaaacaaaacccaaaaaaccccccccccccccaaacaaaaaaccccccccccccccccaaaaaccccaaaaaaaaccaaaacccccccccccaaccaaaccccccgggggggggffflllkkkkkkeeeaaaaaacccc
abaccccccccaaaaaaaccaaaacccccaaacccccccccccccccccccaaaaaacaccccccccaaccccaaaacccccccaaacacccccccccccccccaaaaaccccccccccccccgggggffffflllkkkkeeeccaaacccccc
abaccccccccaaaaaaaccaaacccccccccccccccccaaaccccccccaaacaaaaaccccccaaacccccccccccccaaaacccccccccccccccccccaaaaaccccccccccccccccccaffffffkkkeeeeeccaaccccccc
abaaaccccccccaaaaaaccccccccccccccccccccaaaaaacccccccaaaaaaaacaaaacaaacccccccccaaaaaacccccccccccccccccccccaaaaaccccccccccccccccccccaffffffeeeeecccccccccccc
abaacccccccccaacaaaccccccccccccccccccccaaaaaaccccccccaaaaaccaaaaaaaaacccccccccaaaaaaaaccccccccccaaccccccaaaaacccccccccccccccccccccaaaffffeeeecccccccccccaa
abaacccccccccaaccccccccccccccccaaccccccaaaaacaaccaacccaaaaacaaaaaaaaacccccccccaaaaaaaaccccccaaacaacccccccccaacccccccccccccccccccccaaaccceaecccccccccccccaa
abaacccccccccccccccccccccccccccaaaaaacccaaaaaaaaaaaccaaacaaccaaaaaaaaaaaaacccccaaaaaaacccccccaaaaaccccccccccccccccccccccccccccccccaaacccccccccccccccaaacaa
abcccccccccccccccccccccccccccccaaaaaccccaacaacaaaaacccaaccccccaaaaaaaaaaaacccccaaaaacccccccccaaaaaaaccccccccccccccccccccccccccccccaaacccccccccccccccaaaaaa
abcccccccccccccccccccccccccccaaaaaaaccccccccaaaaaaaaccccccccccaaaaaaaaaaccccccaaaaaaccccccccaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa

2000
data/day_9.txt Normal file

File diff suppressed because it is too large Load Diff

53
src/day_10.jl Normal file
View File

@ -0,0 +1,53 @@
include(joinpath(readchomp(`git rev-parse --show-toplevel`), "aoc.jl"))
import .Aoc: @aoc
function p1(input::Vector{String})
x = 1
cycles = []
for i in input
if i == "noop"
push!(cycles, x)
else
num = parse(Int, split(i)[2])
push!(cycles, x)
push!(cycles, x)
x += num
end
end
sum = 0
for i in 20:40:220
sum += cycles[i] * i
end
sum
end
function p2(input::Vector{String})
x = 1
cycles = []
for i in input
if i == "noop"
push!(cycles, x)
else
num = parse(Int, split(i)[2])
push!(cycles, x)
push!(cycles, x)
x += num
end
end
cycle = 0
while cycle < length(cycles)
x = cycles[cycle+1]
if abs(x - (cycle%40)) < 2
print("#")
else
print(".")
end
cycle+=1
if cycle % 40 == 0
print("\n")
end
end
end
@aoc(2022, 10)

94
src/day_11.jl Normal file
View File

@ -0,0 +1,94 @@
include(joinpath(readchomp(`git rev-parse --show-toplevel`), "aoc.jl"))
import .Aoc: @aoc
function parse_monkeys(input::Vector{String})
curr_monkey = -1
monkeys = Dict()
ops = Dict()
tests = Dict()
conditions = Dict()
for i in input
line = strip(i)
if line == ""
continue
end
if line[1:6] == "Monkey"
curr_monkey += 1
continue
end
if line[1:8] == "Starting"
items = split(line, ':')[2]
items = split(items, ',')
items = map((x) -> parse(Int, strip(x)), items)
monkeys[curr_monkey] = items
continue
end
if line[1:9] == "Operation"
op = strip(split(line, '=')[2])
op = split(op)
ops[curr_monkey] = op
continue
end
if line[1:4] == "Test"
div_by = parse(Int, split(line)[end])
tests[curr_monkey] = [div_by]
continue
end
if line[1:2] == "If"
to = parse(Int, split(line)[end])
push!(tests[curr_monkey], to)
continue
end
end
(monkeys, ops, tests, conditions)
end
function run(turns, monkeys, ops, tests, conditions, worry_level_fn)
inspects = Dict()
for turn in 1:turns
for m in 0:length(keys(monkeys))-1
while length(monkeys[m]) > 0
if haskey(inspects, m)
inspects[m] += 1
else
inspects[m] = 1
end
wl = popfirst!(monkeys[m])
op = ops[m]
operand1 = op[1] == "old" ? wl : parse(Int, op[1])
operand2 = op[3] == "old" ? wl : parse(Int, op[3])
operator = op[2]
wl = eval(Meta.parse("$operand1 $operator $operand2"))
wl = worry_level_fn(wl)
if wl % tests[m][1] == 0
push!(monkeys[tests[m][2]], wl)
else
push!(monkeys[tests[m][3]], wl)
end
end
end
end
inspects
end
function p1(input::Vector{String})
monkeys, ops, tests, conditions = parse_monkeys(input)
inspections = run(20, monkeys, ops, tests, conditions, x -> x % 3)
res = sort(collect(values(inspections)))[end-1:end]
res[1] * res[2]
end
function p2(input::Vector{String})
monkeys, ops, tests, conditions = parse_monkeys(input)
lcm = 1
for i in values(tests)
lcm *= i[1]
end
inspections = run(10000, monkeys, ops, tests, conditions, x -> x % lcm)
res = sort(collect(values(inspections)))[end-1:end]
res[1] * res[2]
end
@aoc(2022, 11)

47
src/day_12.jl Normal file
View File

@ -0,0 +1,47 @@
include(joinpath(readchomp(`git rev-parse --show-toplevel`), "aoc.jl"))
import .Aoc: @aoc
using Graphs
directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
function build_graph(input::Vector{String})
grid = hcat(collect.(input)...)
start = findfirst(==('S'), grid)
dest = findfirst(==('E'), grid)
grid[start] = 'a'
grid[dest] = 'z'
grid = map(x -> x - 'a', grid)
graph = SimpleDiGraph(length(grid))
for (i, h) in enumerate(grid)
ic = CartesianIndices(grid)[i]
neighs = map(x -> ic + CartesianIndex(x), directions)
for d in filter(x -> checkbounds(Bool, grid, x), neighs)
if grid[d] <= h+1
add_edge!(graph, i, LinearIndices(grid)[d])
end
end
end
(start, dest, grid, graph)
end
function p1(input::Vector{String})
start, dest, grid, graph = build_graph(input)
solution = dijkstra_shortest_paths(graph, LinearIndices(grid)[start])
solution.dists[LinearIndices(grid)[dest]]
end
function p2(input::Vector{String})
start, dest, grid, graph = build_graph(input)
sources = findall(==(0), grid)
solution = dijkstra_shortest_paths(graph, map(x -> LinearIndices(grid)[x], sources))
solution.dists[LinearIndices(grid)[dest]]
end
@aoc(2022, 12)

58
src/day_9.jl Normal file
View File

@ -0,0 +1,58 @@
include(joinpath(readchomp(`git rev-parse --show-toplevel`), "aoc.jl"))
import .Aoc: @aoc
offsets = Dict('L' => (-1, 0), 'R' => (1, 0), 'U' => (0, 1), 'D' => (0, -1))
function p1(input::Vector{String})
headx, heady = (0,0)
tailx, taily = (0,0)
map = Dict((0,0) => true)
for i in input
x, y = offsets[i[1]]
for _ in 1:parse(Int, split(i)[2])
headx += x
heady += y
while max(abs(tailx - headx), abs(taily - heady)) > 1
if abs(tailx - headx) > 0
tailx += headx > tailx ? 1 : -1
end
if abs(taily - heady) > 0
taily += heady > taily ? 1 : -1
end
map[(tailx, taily)] = true
end
end
end
length(keys(map))
end
function p2(input::Vector{String})
rope = [ [0, 0] for _ in 1:10 ]
map = Dict((0,0) => true)
for i in input
x, y = offsets[i[1]]
for _ in 1:parse(Int, split(i)[2])
head = rope[1]
rope[1] = [head[1] + x, head[2] + y]
for ri in 2:10
prevx, prevy = rope[ri-1]
currx, curry = rope[ri]
while max(abs(currx - prevx), abs(curry - prevy)) > 1
if abs(currx - prevx) > 0
currx += prevx > currx ? 1 : -1
end
if abs(curry - prevy) > 0
curry += prevy > curry ? 1 : -1
end
end
rope[ri] = [currx, curry]
end
last = rope[end]
map[(last[1], last[2])] = true
end
end
length(keys(map))
end
@aoc(2022, 9)