my solutions to advent of code
aoc
advent-of-code
1import gleam/int
2import gleam/io
3import gleam/list
4import gleam/result
5import gleam/string
6import simplifile as file
7
8type Range {
9 Range(start: Int, end: Int)
10}
11
12pub fn main() {
13 let assert Ok(input) = file.read(from: "../input.txt")
14 as "Input file not found"
15 let input =
16 input
17 |> string.trim
18 |> string.split(",")
19 |> list.map(fn(s) {
20 case string.split(s, "-") {
21 [start, end] ->
22 Range(
23 start |> int.parse |> result.unwrap(0),
24 end |> int.parse |> result.unwrap(0),
25 )
26 _ -> panic as "invalid input"
27 }
28 })
29
30 input
31 |> list.fold(0, fn(acc, r) {
32 list.range(r.start, r.end)
33 |> list.fold(acc, fn(acc, i) {
34 let s = int.to_string(i)
35 let len = string.length(s)
36 case string.slice(s, 0, len / 2) |> string.repeat(2) == s {
37 True -> acc + i
38 False -> acc
39 }
40 })
41 })
42 |> int.to_string
43 |> io.println
44
45 input
46 |> list.fold(0, fn(acc, r) {
47 list.range(r.start, r.end)
48 |> list.fold(acc, fn(acc, i) {
49 case i > 10 {
50 True -> {
51 let s = int.to_string(i)
52 let len = string.length(s)
53 list.range(len / 2, 1)
54 |> list.fold_until(acc, fn(acc, cur_len) {
55 let n =
56 string.slice(s, 0, cur_len)
57 |> string.repeat(int.max(2, len / cur_len))
58 case n == s {
59 True -> list.Stop(acc + i)
60 False -> list.Continue(acc)
61 }
62 })
63 }
64 False -> acc
65 }
66 })
67 })
68 |> int.to_string
69 |> io.println
70}