solve day 21
This commit is contained in:
parent
028097d209
commit
3f9df3ee38
2
data/day_21.txt
Normal file
2
data/day_21.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Player 1 starting position: 7
|
||||||
|
Player 2 starting position: 8
|
55
src/day_21.jl
Normal file
55
src/day_21.jl
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
include(joinpath(readchomp(`git rev-parse --show-toplevel`), "aoc.jl"))
|
||||||
|
import .Aoc: @aoc
|
||||||
|
using Pipe: @pipe
|
||||||
|
|
||||||
|
function prepare_input(input)
|
||||||
|
p1 = parse(Int, match(r"position: (\d)", input[1]).captures[1])
|
||||||
|
p2 = parse(Int, match(r"position: (\d)", input[2]).captures[1])
|
||||||
|
[p1, p2]
|
||||||
|
end
|
||||||
|
|
||||||
|
function p1(input::Vector{String})
|
||||||
|
p = prepare_input(input)
|
||||||
|
score = [0,0]
|
||||||
|
d = 1
|
||||||
|
while true
|
||||||
|
for i in 1:2
|
||||||
|
np = (p[i] + sum(d:d+2)) % 10
|
||||||
|
d += 3
|
||||||
|
score[i] += p[i] = np
|
||||||
|
score[i] >= 1000 && return (score[i==1 ? 2 : 1]*(d-1))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function simulate(position, score, mul, scores)
|
||||||
|
length(scores) == 0 && return
|
||||||
|
s = popfirst!(scores)
|
||||||
|
for (throw, chances) in [(3, 1),(4, 3),(5, 6),(6, 7),(7, 6),(8, 3),(9, 1)]
|
||||||
|
position2 = (position + throw) % 10
|
||||||
|
score2 = score + (position2 == 0 ? 10 : position2)
|
||||||
|
paths = mul * chances
|
||||||
|
if score2 >= 21
|
||||||
|
s[1] += paths
|
||||||
|
else
|
||||||
|
s[2] += paths
|
||||||
|
simulate(position2, score2, paths, scores)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
pushfirst!(scores, s)
|
||||||
|
end
|
||||||
|
|
||||||
|
function p2(input::Vector{String})
|
||||||
|
p = prepare_input(input)
|
||||||
|
|
||||||
|
s1 = [ [0,0] for _ in 1:21 ]
|
||||||
|
simulate(p[1], 0, 1, s1)
|
||||||
|
s2 = [ [0,0] for _ in 1:21 ]
|
||||||
|
simulate(p[2], 0, 1, s2)
|
||||||
|
|
||||||
|
w1 = sum(map(x -> x[1][1] * x[2][2], zip(s1[2:end], s2)))
|
||||||
|
w2 = sum(map(x -> x[1][1] * x[2][2], zip(s2, s1)))
|
||||||
|
return w1 > w2 ? w1 : w2
|
||||||
|
end
|
||||||
|
|
||||||
|
@aoc(2021, 21)
|
Loading…
x
Reference in New Issue
Block a user