my solutions to advent of code
aoc advent-of-code
at main 1.6 kB view raw
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}