aboutsummaryrefslogtreecommitdiff
path: root/aoc-2020-gleam/src/days
diff options
context:
space:
mode:
authorTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2023-03-02 21:40:59 +0100
committerTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2023-03-02 21:40:59 +0100
commit6c661db5b3e167d45554f7c5e4838dbc3bffa63a (patch)
tree6ba5eebddc1713f5bd4ee9fe740937a8031d151e /aoc-2020-gleam/src/days
parent2ba7501d516afa4ab240faccefb6a3f72223598e (diff)
downloadgleam_aoc2020-6c661db5b3e167d45554f7c5e4838dbc3bffa63a.tar.gz
gleam_aoc2020-6c661db5b3e167d45554f7c5e4838dbc3bffa63a.zip
Refactor using constructs from Gleam v0.27
Diffstat (limited to 'aoc-2020-gleam/src/days')
-rw-r--r--aoc-2020-gleam/src/days/day02.gleam9
-rw-r--r--aoc-2020-gleam/src/days/day03.gleam3
-rw-r--r--aoc-2020-gleam/src/days/day04.gleam3
-rw-r--r--aoc-2020-gleam/src/days/day05.gleam2
-rw-r--r--aoc-2020-gleam/src/days/day07.gleam10
-rw-r--r--aoc-2020-gleam/src/days/day08.gleam16
6 files changed, 29 insertions, 14 deletions
diff --git a/aoc-2020-gleam/src/days/day02.gleam b/aoc-2020-gleam/src/days/day02.gleam
index cedb604..530ab0f 100644
--- a/aoc-2020-gleam/src/days/day02.gleam
+++ b/aoc-2020-gleam/src/days/day02.gleam
@@ -3,6 +3,8 @@ import gleam/list
import gleam/bool
import gleam/string as str
import ext/listx
+import ext/intx
+import ext/genericx as genx
import ext/resultx as resx
import util/input_util
import util/parser as p
@@ -50,8 +52,8 @@ fn part1(lines: List(String)) -> Int {
fn(line) {
line.password
|> str.to_graphemes
- |> listx.count(satisfying: fn(g) { g == line.policy.grapheme })
- |> fn(l) { line.policy.min <= l && l <= line.policy.max }
+ |> listx.count(satisfying: genx.equals(_, line.policy.grapheme))
+ |> intx.is_between(line.policy.min, and: line.policy.max)
},
)
}
@@ -64,7 +66,8 @@ fn part2(lines: List(String)) -> Int {
line.password
|> str.to_graphemes
|> list.at(index - 1)
- |> resx.assert_unwrap == line.policy.grapheme
+ |> resx.assert_unwrap
+ |> genx.equals(line.policy.grapheme)
}
bool.exclusive_or(
grapheme_matches(line.policy.min),
diff --git a/aoc-2020-gleam/src/days/day03.gleam b/aoc-2020-gleam/src/days/day03.gleam
index e4cecda..4c1ef59 100644
--- a/aoc-2020-gleam/src/days/day03.gleam
+++ b/aoc-2020-gleam/src/days/day03.gleam
@@ -5,6 +5,7 @@ import gleam/string as str
import gleam/function as fun
import gleam/iterator as iter
import gleam/set.{Set}
+import ext/intx
import ext/resultx as resx
import ext/iteratorx as iterx
import util/input_util
@@ -62,7 +63,7 @@ fn has_tree(in area: Area, at pos: Pos) -> Bool {
}
fn is_valid(pos: Pos, in area: Area) -> Bool {
- 0 <= pos.1 && pos.1 < area.height
+ intx.is_between(pos.1, 0, and: area.height - 1)
}
fn tree_count(in area: Area, with slope: Pos) -> Int {
diff --git a/aoc-2020-gleam/src/days/day04.gleam b/aoc-2020-gleam/src/days/day04.gleam
index 21998e2..305cfa1 100644
--- a/aoc-2020-gleam/src/days/day04.gleam
+++ b/aoc-2020-gleam/src/days/day04.gleam
@@ -4,6 +4,7 @@ import gleam/function as fun
import gleam/result as res
import gleam/map.{Map}
import ext/listx
+import ext/intx
import ext/resultx as resx
import util/input_util
import util/parser as p
@@ -61,7 +62,7 @@ fn is_valid1(passport: Passport) -> Bool {
fn is_valid2(passport: Passport) -> Bool {
let int_between = fn(min, max) {
p.int()
- |> p.satisfying(rule: fn(num) { min <= num && num <= max })
+ |> p.satisfying(rule: intx.is_between(_, min, and: max))
|> p.ignore
}
diff --git a/aoc-2020-gleam/src/days/day05.gleam b/aoc-2020-gleam/src/days/day05.gleam
index 8eeb94b..b3448a8 100644
--- a/aoc-2020-gleam/src/days/day05.gleam
+++ b/aoc-2020-gleam/src/days/day05.gleam
@@ -34,7 +34,7 @@ fn part2(lines: List(String)) -> Int {
|> list.map(with: get_seat_id)
|> set.from_list
- let occupied = fn(id) { set.contains(in: seat_ids, this: id) }
+ let occupied = set.contains(in: seat_ids, this: _)
iter.find(
in: iter.range(from: 1, to: 1023),
diff --git a/aoc-2020-gleam/src/days/day07.gleam b/aoc-2020-gleam/src/days/day07.gleam
index 2e7c890..fb5949c 100644
--- a/aoc-2020-gleam/src/days/day07.gleam
+++ b/aoc-2020-gleam/src/days/day07.gleam
@@ -1,10 +1,12 @@
import gleam/io
+import gleam/int
import gleam/list
import gleam/pair
import gleam/result as res
import gleam/function as fun
import gleam/map.{Map}
import gleam/iterator.{Iterator} as iter
+import ext/genericx as genx
import ext/resultx as resx
import ext/iteratorx as iterx
import util/graph
@@ -85,16 +87,18 @@ fn part1(lines: List(String)) -> Int {
graph
|> map.keys
|> iter.from_list
- |> iter.filter(for: fn(bag) { bag != special_bag })
+ |> iter.filter(for: genx.different(_, than: special_bag))
|> iterx.count(satisfying: fn(start) {
start
|> graph.dfs(with: neighbours)
- |> iter.any(fn(bag) { bag == special_bag })
+ |> iter.any(satisfying: genx.equals(_, special_bag))
})
}
fn part2(lines: List(String)) -> Int {
- bag_count(of: special_bag, in: parse_graph(lines)) - 1
+ special_bag
+ |> bag_count(in: parse_graph(lines))
+ |> int.subtract(1)
}
pub fn run() -> Nil {
diff --git a/aoc-2020-gleam/src/days/day08.gleam b/aoc-2020-gleam/src/days/day08.gleam
index 6f074cf..9ef430b 100644
--- a/aoc-2020-gleam/src/days/day08.gleam
+++ b/aoc-2020-gleam/src/days/day08.gleam
@@ -1,5 +1,7 @@
import gleam/io
+import gleam/int
import gleam/list
+import gleam/bool
import gleam/set.{Set}
import gleam/iterator.{Iterator} as iter
import gleam/option.{None, Option, Some} as opt
@@ -35,7 +37,7 @@ fn parse_program(lines: List(String)) -> Program {
p.replace(p.literal("-"), with: -1),
])
|> p.then(p.int())
- |> p.map2(with: fn(sign, magnitude) { sign * magnitude })
+ |> p.map2(with: int.multiply)
let instr_parser =
p.any(of: [
@@ -77,10 +79,14 @@ fn execution_result_helper(
cpu: Cpu,
visited: Set(Int),
) -> ExecutionResult {
- case set.contains(visited, cpu.pc), fetch(from: program, with: cpu) {
- True, _ -> InfiniteLoop(acc_before_second: cpu.acc)
- _, None -> Termination(acc_after: cpu.acc)
- _, Some(instr) ->
+ use <- bool.guard(
+ when: set.contains(visited, cpu.pc),
+ return: InfiniteLoop(acc_before_second: cpu.acc),
+ )
+
+ case fetch(from: program, with: cpu) {
+ None -> Termination(acc_after: cpu.acc)
+ Some(instr) ->
execution_result_helper(
program,
execute(instr, on: cpu),