From 32bc75cae2a0fceafea5c48c550888bc1d7c6016 Mon Sep 17 00:00:00 2001 From: "H.J" Date: Mon, 17 Jun 2024 15:39:21 -0400 Subject: gleam 2017 day 14 --- aoc2017-gleam/src/aoc_2017/day_14.gleam | 10 +++--- aoc2017-gleam/src/aoc_2017/day_15.gleam | 7 ++++ aoc2017-gleam/src/helpers/set_state.gleam | 55 +++++++++++++++++++++++++++++++ aoc2017-gleam/src/helpers/state.gleam | 55 ------------------------------- 4 files changed, 67 insertions(+), 60 deletions(-) create mode 100644 aoc2017-gleam/src/aoc_2017/day_15.gleam create mode 100644 aoc2017-gleam/src/helpers/set_state.gleam delete mode 100644 aoc2017-gleam/src/helpers/state.gleam diff --git a/aoc2017-gleam/src/aoc_2017/day_14.gleam b/aoc2017-gleam/src/aoc_2017/day_14.gleam index cd60a74..2a74912 100644 --- a/aoc2017-gleam/src/aoc_2017/day_14.gleam +++ b/aoc2017-gleam/src/aoc_2017/day_14.gleam @@ -4,7 +4,7 @@ import gleam/list import gleam/result import gleam/set import gleam/string -import helpers/state +import helpers/set_state pub fn pt_1(input: String) { use acc, row <- list.fold(make_rows(input), 0) @@ -29,7 +29,7 @@ fn popcount(hex_number: String) -> Int { } pub fn pt_2(input: String) { - let grid = state.start_actor(make_grid(input)) + let grid = set_state.start_actor(make_grid(input)) find_next_group(grid, 0) } @@ -57,7 +57,7 @@ fn make_grid(input: String) { } fn find_next_group(actor, count) { - case state.pop(actor) { + case set_state.pop(actor) { Ok(p) -> { list.each(neighbors(p), remove_neighbor(actor, _)) find_next_group(actor, count + 1) @@ -72,9 +72,9 @@ fn neighbors(of: #(Int, Int)) { } fn remove_neighbor(actor, point) { - case state.check(actor, point) { + case set_state.check(actor, point) { True -> { - state.drop(actor, point) + set_state.drop(actor, point) list.each(neighbors(point), remove_neighbor(actor, _)) } False -> Nil diff --git a/aoc2017-gleam/src/aoc_2017/day_15.gleam b/aoc2017-gleam/src/aoc_2017/day_15.gleam new file mode 100644 index 0000000..a0a1145 --- /dev/null +++ b/aoc2017-gleam/src/aoc_2017/day_15.gleam @@ -0,0 +1,7 @@ +pub fn pt_1(input: String) { + todo as "part 1 not implemented" +} + +pub fn pt_2(input: String) { + todo as "part 2 not implemented" +} diff --git a/aoc2017-gleam/src/helpers/set_state.gleam b/aoc2017-gleam/src/helpers/set_state.gleam new file mode 100644 index 0000000..cbbad81 --- /dev/null +++ b/aoc2017-gleam/src/helpers/set_state.gleam @@ -0,0 +1,55 @@ +import gleam/erlang/process.{type Subject, Normal} +import gleam/option.{None} +import gleam/otp/actor.{type Next, Continue, Stop} +import gleam/set.{type Set} + +const timeout = 1000 + +pub type Message(k) { + Shutdown + Check(key: k, client: Subject(Bool)) + Add(key: k) + Drop(key: k) + Pop(client: Subject(Result(k, Nil))) +} + +fn handle_message(message: Message(k), set: Set(k)) -> Next(Message(k), Set(k)) { + case message { + Shutdown -> Stop(Normal) + Check(key, client) -> { + process.send(client, set.contains(set, key)) + Continue(set, None) + } + Add(key) -> Continue(set.insert(set, key), None) + Drop(key) -> Continue(set.delete(set, key), None) + Pop(client) -> { + case set.to_list(set) { + [next, ..] -> { + process.send(client, Ok(next)) + Continue(set.delete(set, next), None) + } + [] -> { + process.send(client, Error(Nil)) + Stop(Normal) + } + } + } + } +} + +pub fn start_actor(with: Set(a)) { + let assert Ok(actor) = actor.start(with, handle_message) + actor +} + +pub fn pop(actor) { + process.call(actor, Pop, timeout) +} + +pub fn check(actor, value) { + process.call(actor, Check(value, _), timeout) +} + +pub fn drop(actor, value) { + process.send(actor, Drop(value)) +} diff --git a/aoc2017-gleam/src/helpers/state.gleam b/aoc2017-gleam/src/helpers/state.gleam deleted file mode 100644 index cbbad81..0000000 --- a/aoc2017-gleam/src/helpers/state.gleam +++ /dev/null @@ -1,55 +0,0 @@ -import gleam/erlang/process.{type Subject, Normal} -import gleam/option.{None} -import gleam/otp/actor.{type Next, Continue, Stop} -import gleam/set.{type Set} - -const timeout = 1000 - -pub type Message(k) { - Shutdown - Check(key: k, client: Subject(Bool)) - Add(key: k) - Drop(key: k) - Pop(client: Subject(Result(k, Nil))) -} - -fn handle_message(message: Message(k), set: Set(k)) -> Next(Message(k), Set(k)) { - case message { - Shutdown -> Stop(Normal) - Check(key, client) -> { - process.send(client, set.contains(set, key)) - Continue(set, None) - } - Add(key) -> Continue(set.insert(set, key), None) - Drop(key) -> Continue(set.delete(set, key), None) - Pop(client) -> { - case set.to_list(set) { - [next, ..] -> { - process.send(client, Ok(next)) - Continue(set.delete(set, next), None) - } - [] -> { - process.send(client, Error(Nil)) - Stop(Normal) - } - } - } - } -} - -pub fn start_actor(with: Set(a)) { - let assert Ok(actor) = actor.start(with, handle_message) - actor -} - -pub fn pop(actor) { - process.call(actor, Pop, timeout) -} - -pub fn check(actor, value) { - process.call(actor, Check(value, _), timeout) -} - -pub fn drop(actor, value) { - process.send(actor, Drop(value)) -} -- cgit v1.2.3