···
LeadKm(km: Int, leads: Set(String))
29
-
RunState(lead_km: LeadKm, state: Dict(String, ReindeerState))
29
+
Dict(String, ReindeerState)
pub fn to_int(number_string) {
let assert Ok(number) = number_string |> int.base_parse(10)
···
42
-
let RunState(LeadKm(_, leads), state) =
41
+
let #(LeadKm(_, leads), state) =
44
-
|> list.fold(state, fn(s, reindeer) {
45
-
let RunState(lead_km, state) = s
43
+
|> list.fold(#(LeadKm(0, set.new()), state), fn(s, reindeer) {
44
+
let #(lead, state) = s
let Reindeer(name, speed, run, rest) = reindeer
let ReindeerState(points, km, action, time_until_change) =
···
|> dict.insert(state, name, _)
64
-
let lead_km = case int.compare(km, lead_km.km) {
65
-
Eq -> LeadKm(km, lead_km.leads |> set.insert(name))
63
+
let lead = case int.compare(km, lead.km) {
64
+
Eq -> LeadKm(km, lead.leads |> set.insert(name))
Gt -> LeadKm(km, set.new() |> set.insert(name))
70
-
RunState(lead_km, state)
75
-
|> set.fold(state, fn(state, reindeer_name) {
76
-
let assert Ok(ReindeerState(points, km, action, time_until_change)) =
78
-
|> dict.get(reindeer_name)
73
+
|> set.fold(state, fn(state, reindeer_name) {
74
+
let assert Ok(ReindeerState(points, km, action, time_until_change)) =
82
-
ReindeerState(points + 1, km, action, time_until_change),
86
-
RunState(LeadKm(0, set.new()), state)
76
+
|> dict.get(reindeer_name)
80
+
ReindeerState(points + 1, km, action, time_until_change),
|> do_calculate_run_state(reindeers, sec - 1)
pub fn calculate_run_state(reindeers: List(Reindeer), sec: Int) {
93
-
do_calculate_run_state(
94
-
RunState(LeadKm(0, set.new()), dict.new()),
89
+
do_calculate_run_state(dict.new(), reindeers, sec)
pub fn get_winner_km(state: RunState) {
|> dict.fold(0, fn(winner, _, state) {
···
pub fn get_winner_points(state: RunState) {
|> dict.fold(0, fn(winner, _, state) {
case state.points > winner {