Skip to content

Commit 792376f

Browse files
committed
2024-08 * ** Gleam
1 parent 0d438ec commit 792376f

File tree

3 files changed

+85
-5
lines changed

3 files changed

+85
-5
lines changed

src/aoc_2024/day_7.gleam

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import extra
22
import gleam/int
33
import gleam/list
4-
import gleam/order
54
import gleam/string
65

76
pub type Row {

src/aoc_2024/day_8.gleam

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import gleam/dict
2+
import gleam/list
3+
import gleam/set
4+
import grid.{type Dims, type Grid, type XY}
5+
6+
pub fn parse(input: String) -> Grid(String) {
7+
grid.from_string(input)
8+
|> grid.filter(fn(_, c) { c != "." })
9+
}
10+
11+
pub fn pt_1(input: Grid(String)) {
12+
input
13+
|> grid.to_list
14+
|> list.group(by: fn(cell) { cell.1 })
15+
|> dict.values
16+
|> list.map(fn(nodes) { list.map(nodes, fn(node) { node.0 }) })
17+
|> list.fold(from: set.new(), with: fn(acc, nodes) {
18+
nodes
19+
|> list.combination_pairs
20+
|> list.flat_map(antinodes_xy_pt1)
21+
|> list.filter(fn(xy) { grid.in_grid(input, xy) })
22+
|> set.from_list
23+
|> set.union(acc)
24+
})
25+
|> set.size
26+
}
27+
28+
fn antinodes_xy_pt1(pair: #(XY, XY)) -> List(XY) {
29+
let #(a, b) = pair
30+
let diff = grid.xy_sub(a, b)
31+
[grid.xy_add(a, diff), grid.xy_sub(b, diff)]
32+
}
33+
34+
pub fn pt_2(input: Grid(String)) {
35+
input
36+
|> grid.to_list
37+
|> list.group(by: fn(cell) { cell.1 })
38+
|> dict.values
39+
|> list.map(fn(nodes) { list.map(nodes, fn(node) { node.0 }) })
40+
|> list.fold(from: set.new(), with: fn(acc, nodes) {
41+
nodes
42+
|> list.combination_pairs
43+
|> list.flat_map(antinodes_xy_pt2(input.dims, _))
44+
|> set.from_list
45+
|> set.union(acc)
46+
})
47+
|> set.size
48+
}
49+
50+
fn antinodes_xy_pt2(dims: Dims, pair: #(XY, XY)) -> List(XY) {
51+
let #(a, b) = pair
52+
list.append(
53+
cast_ray(dims, a, grid.xy_sub(a, b), [a]),
54+
cast_ray(dims, b, grid.xy_sub(b, a), [b]),
55+
)
56+
}
57+
58+
/// Also return the start point
59+
fn cast_ray(dims: Dims, start: XY, d: XY, acc: List(XY)) -> List(XY) {
60+
let next = grid.xy_add(start, d)
61+
case grid.in_dims(dims, next) {
62+
False -> acc
63+
True -> cast_ray(dims, next, d, [next, ..acc])
64+
}
65+
}

src/grid.gleam

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ pub fn xy_add(a: XY, b: XY) -> XY {
1212
#(a.0 + b.0, a.1 + b.1)
1313
}
1414

15+
pub fn xy_sub(a: XY, b: XY) -> XY {
16+
#(a.0 - b.0, a.1 - b.1)
17+
}
18+
1519
pub fn xy_scale(xy: XY, k: Int) -> XY {
1620
#(xy.0 * k, xy.1 * k)
1721
}
@@ -97,6 +101,10 @@ pub fn map(grid: Grid(a), fun: fn(XY, a) -> b) -> Grid(b) {
97101
Grid(dims: grid.dims, data: grid.data |> dict.map_values(fun))
98102
}
99103

104+
pub fn filter(grid: Grid(a), pred: fn(XY, a) -> Bool) -> Grid(a) {
105+
Grid(..grid, data: grid.data |> dict.filter(pred))
106+
}
107+
100108
pub fn filter_map(grid: Grid(a), fun: fn(XY, a) -> Result(b, Nil)) -> Grid(b) {
101109
Grid(
102110
dims: grid.dims,
@@ -123,15 +131,23 @@ pub fn find_exact(grid: Grid(a), needle: a) -> Result(XY, Nil) {
123131
})
124132
}
125133

134+
pub fn to_list(grid: Grid(a)) -> List(#(XY, a)) {
135+
dict.to_list(grid.data)
136+
}
137+
126138
pub fn values(grid: Grid(a)) -> List(a) {
127139
dict.values(grid.data)
128140
}
129141

130142
pub fn in_grid(grid: Grid(a), xy: XY) -> Bool {
131-
xy.0 >= grid.dims.min_x
132-
&& xy.0 <= grid.dims.max_x
133-
&& xy.1 >= grid.dims.min_y
134-
&& xy.1 <= grid.dims.max_y
143+
in_dims(grid.dims, xy)
144+
}
145+
146+
pub fn in_dims(dims: Dims, xy: XY) -> Bool {
147+
xy.0 >= dims.min_x
148+
&& xy.0 <= dims.max_x
149+
&& xy.1 >= dims.min_y
150+
&& xy.1 <= dims.max_y
135151
}
136152

137153
pub fn extend(dims: Dims, xy: XY) -> Dims {

0 commit comments

Comments
 (0)