+29
-12
2015/10/gleam/src/main.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)