···
21
-
ReindeerState(km: Int, action: Action, time_until_change: Int)
25
-
dict.Dict(String, ReindeerState)
27
-
pub type ReindeerStatePoints {
28
-
ReindeerStatePoints(
32
-
time_until_change: Int,
21
+
ReindeerState(points: Int, km: Int, action: Action, time_until_change: Int)
LeadKm(km: Int, leads: Set(String))
40
-
pub type RunStatePoints {
41
-
RunStatePoints(lead_km: LeadKm, state: Dict(String, ReindeerStatePoints))
29
+
RunState(lead_km: LeadKm, state: Dict(String, ReindeerState))
pub fn to_int(number_string) {
···
55
-
|> list.fold(state, fn(state, reindeer) {
56
-
let Reindeer(name, speed, run, rest) = reindeer
57
-
let ReindeerState(km, action, time_until_change) =
59
-
|> dict.get(reindeer.name)
60
-
|> result.unwrap(ReindeerState(0, Run, run))
62
-
let km = case action {
66
-
case time_until_change, action {
67
-
1, Run -> ReindeerState(km, Rest, rest)
68
-
1, Rest -> ReindeerState(km, Run, run)
69
-
_, _ -> ReindeerState(km, action, time_until_change - 1)
71
-
|> dict.insert(state, name, _)
73
-
|> do_calculate_run_state(reindeers, sec - 1)
78
-
pub fn calculate_run_state(reindeers: List(Reindeer), sec: Int) {
79
-
do_calculate_run_state(dict.new(), reindeers, sec)
82
-
pub fn get_winner_km(state: RunState) {
84
-
|> dict.fold(0, fn(winner, _, state) {
85
-
case state.km > winner {
92
-
pub fn do_calculate_run_state_pt2(
93
-
state: RunStatePoints,
94
-
reindeers: List(Reindeer),
100
-
let RunStatePoints(LeadKm(_, leads), state) =
42
+
let RunState(LeadKm(_, leads), state) =
|> list.fold(state, fn(s, reindeer) {
103
-
let RunStatePoints(lead_km, state) = s
45
+
let RunState(lead_km, state) = s
let Reindeer(name, speed, run, rest) = reindeer
105
-
let ReindeerStatePoints(points, km, action, time_until_change) =
47
+
let ReindeerState(points, km, action, time_until_change) =
|> dict.get(reindeer.name)
108
-
|> result.unwrap(ReindeerStatePoints(0, 0, Run, run))
50
+
|> result.unwrap(ReindeerState(0, 0, Run, run))
···
case time_until_change, action {
116
-
1, Run -> ReindeerStatePoints(points, km, Rest, rest)
117
-
1, Rest -> ReindeerStatePoints(points, km, Run, run)
119
-
ReindeerStatePoints(points, km, action, time_until_change - 1)
58
+
1, Run -> ReindeerState(points, km, Rest, rest)
59
+
1, Rest -> ReindeerState(points, km, Run, run)
60
+
_, _ -> ReindeerState(points, km, action, time_until_change - 1)
|> dict.insert(state, name, _)
···
129
-
RunStatePoints(lead_km, state)
70
+
RunState(lead_km, state)
|> set.fold(state, fn(state, reindeer_name) {
135
-
let assert Ok(ReindeerStatePoints(
76
+
let assert Ok(ReindeerState(points, km, action, time_until_change)) =
|> dict.get(reindeer_name)
146
-
ReindeerStatePoints(points + 1, km, action, time_until_change),
82
+
ReindeerState(points + 1, km, action, time_until_change),
150
-
RunStatePoints(LeadKm(0, set.new()), state)
151
-
|> do_calculate_run_state_pt2(reindeers, sec - 1)
86
+
RunState(LeadKm(0, set.new()), state)
87
+
|> do_calculate_run_state(reindeers, sec - 1)
156
-
pub fn calculate_run_state_pt2(reindeers: List(Reindeer), sec: Int) {
157
-
do_calculate_run_state_pt2(
158
-
RunStatePoints(LeadKm(0, set.new()), dict.new()),
92
+
pub fn calculate_run_state(reindeers: List(Reindeer), sec: Int) {
93
+
do_calculate_run_state(
94
+
RunState(LeadKm(0, set.new()), dict.new()),
164
-
pub fn get_winner_points(state: RunStatePoints) {
100
+
pub fn get_winner_km(state: RunState) {
102
+
|> dict.fold(0, fn(winner, _, state) {
103
+
case state.km > winner {
110
+
pub fn get_winner_points(state: RunState) {
|> dict.fold(0, fn(winner, _, state) {
case state.points > winner {
···
199
-
|> calculate_run_state_pt2(2503)
145
+
|> calculate_run_state(2503)