···
-
ReindeerState(km: Int, action: Action, time_until_change: Int)
-
dict.Dict(String, ReindeerState)
-
pub type ReindeerStatePoints {
-
time_until_change: Int,
LeadKm(km: Int, leads: Set(String))
-
pub type RunStatePoints {
-
RunStatePoints(lead_km: LeadKm, state: Dict(String, ReindeerStatePoints))
pub fn to_int(number_string) {
···
-
|> list.fold(state, fn(state, reindeer) {
-
let Reindeer(name, speed, run, rest) = reindeer
-
let ReindeerState(km, action, time_until_change) =
-
|> dict.get(reindeer.name)
-
|> result.unwrap(ReindeerState(0, Run, run))
-
case time_until_change, action {
-
1, Run -> ReindeerState(km, Rest, rest)
-
1, Rest -> ReindeerState(km, Run, run)
-
_, _ -> ReindeerState(km, action, time_until_change - 1)
-
|> dict.insert(state, name, _)
-
|> 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) {
-
case state.km > winner {
-
pub fn do_calculate_run_state_pt2(
-
reindeers: List(Reindeer),
-
let RunStatePoints(LeadKm(_, leads), state) =
|> list.fold(state, fn(s, reindeer) {
-
let RunStatePoints(lead_km, state) = s
let Reindeer(name, speed, run, rest) = reindeer
-
let ReindeerStatePoints(points, km, action, time_until_change) =
|> dict.get(reindeer.name)
-
|> result.unwrap(ReindeerStatePoints(0, 0, Run, run))
···
case time_until_change, action {
-
1, Run -> ReindeerStatePoints(points, km, Rest, rest)
-
1, Rest -> ReindeerStatePoints(points, km, Run, run)
-
ReindeerStatePoints(points, km, action, time_until_change - 1)
|> dict.insert(state, name, _)
···
-
RunStatePoints(lead_km, state)
|> set.fold(state, fn(state, reindeer_name) {
-
let assert Ok(ReindeerStatePoints(
|> dict.get(reindeer_name)
-
ReindeerStatePoints(points + 1, km, action, time_until_change),
-
RunStatePoints(LeadKm(0, set.new()), state)
-
|> do_calculate_run_state_pt2(reindeers, sec - 1)
-
pub fn calculate_run_state_pt2(reindeers: List(Reindeer), sec: Int) {
-
do_calculate_run_state_pt2(
-
RunStatePoints(LeadKm(0, set.new()), dict.new()),
-
pub fn get_winner_points(state: RunStatePoints) {
|> dict.fold(0, fn(winner, _, state) {
case state.points > winner {
···
-
|> calculate_run_state_pt2(2503)
···
+
ReindeerState(points: Int, km: Int, action: Action, time_until_change: Int)
LeadKm(km: Int, leads: Set(String))
+
RunState(lead_km: LeadKm, state: Dict(String, ReindeerState))
pub fn to_int(number_string) {
···
+
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.get(reindeer.name)
+
|> result.unwrap(ReindeerState(0, 0, Run, run))
···
case time_until_change, action {
+
1, Run -> ReindeerState(points, km, Rest, rest)
+
1, Rest -> ReindeerState(points, km, Run, run)
+
_, _ -> ReindeerState(points, km, action, time_until_change - 1)
|> dict.insert(state, 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) {
+
case state.km > winner {
+
pub fn get_winner_points(state: RunState) {
|> dict.fold(0, fn(winner, _, state) {
case state.points > winner {
···
+
|> calculate_run_state(2503)