-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaoc2023day5ex2.dwl
64 lines (64 loc) · 1.89 KB
/
aoc2023day5ex2.dwl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import * from dw::core::Strings
import * from dw::core::Arrays
type Span = { start: Number, end: Number }
var groups = payload
replace '\r' with ''
splitBy '\n\n'
var seeds = groups[0]
substringAfterLast ': '
splitBy ' '
map ($ as Number)
divideBy 2
map { start: $[0], end: $[0]+$[1]-1 }
var maps = groups[1 to -1]
map (
$
substringAfter '\n'
splitBy '\n'
map (
$ splitBy ' '
map ($ as Number))
map {
start: $[1],
end: $[1] + $[2] - 1,
remapStart: $[0],
remapEnd: $[0] + $[2] - 1
}
map (
(g) ->
(n: Span, cont: (Span) -> Array<Span>) -> do {
var intersect = {
start: max([g.start, n.start]),
end: min([g.end, n.end])
}
var pre = {
start: n.start,
end: intersect.start - 1
}
var newSpan = {
start: intersect.start - g.start + g.remapStart,
end: intersect.end - g.start + g.remapStart
}
var post = {
start: intersect.end + 1,
end: n.end
}
---
if (intersect.start <= intersect.end)
[newSpan]
++ (if (pre.start <= pre.end) cont(pre) else [])
++ (if (post.start <= post.end) cont(post) else [])
else
cont(n)
})
reduce (
(v, acc=(n: Span) -> [n]) ->
(n: Span) ->
v(n, acc)))
---
maps
reduce ((v, acc=seeds) ->
acc
flatMap v($)
orderBy $.start)
minBy $.start