my solutions to advent of code
aoc advent-of-code

much much faster answer

aylac.top e459d7e6 2c2ea697

verified
Changed files
+29 -12
2015
10
gleam
+29 -12
2015/10/gleam/src/main.gleam
··· 1 + import gleam/bit_array 1 2 import gleam/int 2 3 import gleam/io.{println} 3 4 import gleam/list ··· 5 6 import gleam/string.{trim} 6 7 import simplifile.{read} 7 8 8 - fn look_and_say(input, output, last_char, last_char_count, i) { 9 - let char = string.slice(input, i, 1) 10 - case char == last_char { 11 - True -> look_and_say(input, output, char, last_char_count + 1, i + 1) 9 + fn 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) 12 19 False -> { 13 - let output = output <> int.to_string(last_char_count) <> last_char 14 - case char != "" { 15 - True -> look_and_say(input, output, char, 1, i + 1) 16 - False -> output 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 17 27 } 18 28 } 19 29 } 20 30 } 21 31 22 32 fn look_and_say_helper(input) { 23 - let char = string.slice(input, 0, 1) 24 - look_and_say(input, "", char, 1, 1) 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("") 25 39 } 26 40 27 41 pub fn main() { 28 42 let input = read(from: "../input.txt") |> unwrap("") |> trim() 29 43 30 44 let res = 31 - list.range(1, 40) 45 + list.range(1, 50) 32 46 |> list.fold(input, fn(acc, i) { 33 - echo i 47 + case i == 41 { 48 + True -> println(string.length(acc) |> int.to_string) 49 + False -> Nil 50 + } 34 51 look_and_say_helper(acc) 35 52 }) 36 53 println(string.length(res) |> int.to_string)