···
LeadKm(km: Int, leads: Set(String))
-
RunState(lead_km: LeadKm, state: Dict(String, ReindeerState))
pub fn to_int(number_string) {
let assert Ok(number) = number_string |> int.base_parse(10)
···
-
let RunState(LeadKm(_, leads), state) =
-
|> list.fold(state, fn(s, reindeer) {
-
let RunState(lead_km, state) = s
let Reindeer(name, speed, run, rest) = reindeer
let ReindeerState(points, km, action, time_until_change) =
···
|> dict.insert(state, name, _)
-
let lead_km = case int.compare(km, lead_km.km) {
-
Eq -> LeadKm(km, lead_km.leads |> set.insert(name))
Gt -> LeadKm(km, set.new() |> set.insert(name))
-
RunState(lead_km, state)
-
|> set.fold(state, fn(state, reindeer_name) {
-
let assert Ok(ReindeerState(points, km, action, time_until_change)) =
-
|> dict.get(reindeer_name)
-
ReindeerState(points + 1, km, action, time_until_change),
-
RunState(LeadKm(0, set.new()), state)
|> do_calculate_run_state(reindeers, sec - 1)
pub fn calculate_run_state(reindeers: List(Reindeer), sec: Int) {
-
do_calculate_run_state(
-
RunState(LeadKm(0, set.new()), dict.new()),
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 {
···
LeadKm(km: Int, leads: Set(String))
+
Dict(String, ReindeerState)
pub fn to_int(number_string) {
let assert Ok(number) = number_string |> int.base_parse(10)
···
+
let #(LeadKm(_, leads), state) =
+
|> list.fold(#(LeadKm(0, set.new()), state), fn(s, reindeer) {
let Reindeer(name, speed, run, rest) = reindeer
let ReindeerState(points, km, action, time_until_change) =
···
|> dict.insert(state, name, _)
+
let lead = case int.compare(km, lead.km) {
+
Eq -> LeadKm(km, lead.leads |> set.insert(name))
Gt -> LeadKm(km, set.new() |> set.insert(name))
+
|> set.fold(state, fn(state, reindeer_name) {
+
let assert Ok(ReindeerState(points, km, action, time_until_change)) =
+
|> dict.get(reindeer_name)
+
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) {
+
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 {