my solutions to advent of code
aoc
advent-of-code
1import gleam/bit_array
2import gleam/int
3import gleam/io.{println}
4import gleam/list
5import gleam/result.{unwrap}
6import gleam/string.{trim}
7import simplifile.{read}
8
9fn look_and_say(
10 input,
11 output: List(BitArray),
12 last_char: BitArray,
13 last_char_count,
14 i,
15) {
16 let char = bit_array.slice(input, i, 1)
17 case char |> unwrap(<<>>) == last_char {
18 True -> look_and_say(input, output, last_char, last_char_count + 1, i + 1)
19 False -> {
20 let output =
21 output
22 |> list.prepend(<<int.to_string(last_char_count):utf8>>)
23 |> list.prepend(last_char)
24 case char {
25 Ok(char) -> look_and_say(input, output, char, 1, i + 1)
26 Error(_) -> output
27 }
28 }
29 }
30}
31
32fn look_and_say_helper(input) {
33 let char = bit_array.slice(<<input:utf8>>, 0, 1) |> unwrap(<<>>)
34 look_and_say(<<input:utf8>>, [], char, 1, 1)
35 |> list.reverse
36 |> bit_array.concat
37 |> bit_array.to_string
38 |> unwrap("")
39}
40
41pub fn main() {
42 let input = read(from: "../input.txt") |> unwrap("") |> trim()
43
44 let res =
45 list.range(1, 50)
46 |> list.fold(input, fn(acc, i) {
47 case i == 41 {
48 True -> println(string.length(acc) |> int.to_string)
49 False -> Nil
50 }
51 look_and_say_helper(acc)
52 })
53 println(string.length(res) |> int.to_string)
54}