+20
2015/17/gleam/gleam.toml
+20
2015/17/gleam/gleam.toml
···
1
+
name = "main"
2
+
version = "1.0.0"
3
+
4
+
# Fill out these fields if you intend to generate HTML documentation or publish
5
+
# your project to the Hex package manager.
6
+
#
7
+
# description = ""
8
+
# licences = ["Apache-2.0"]
9
+
# repository = { type = "github", user = "", repo = "" }
10
+
# links = [{ title = "Website", href = "" }]
11
+
#
12
+
# For a full reference of all the available options, you can have a look at
13
+
# https://gleam.run/writing-gleam/gleam-toml/.
14
+
15
+
[dependencies]
16
+
gleam_stdlib = ">= 0.44.0 and < 2.0.0"
17
+
simplifile = ">= 2.3.0 and < 3.0.0"
18
+
19
+
[dev-dependencies]
20
+
gleeunit = ">= 1.0.0 and < 2.0.0"
+14
2015/17/gleam/manifest.toml
+14
2015/17/gleam/manifest.toml
···
1
+
# This file was generated by Gleam
2
+
# You typically do not need to edit this file
3
+
4
+
packages = [
5
+
{ name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "B06A9AF0BF10E51401D64B98E4B627F1D2E48C154967DA7AF4D0914780A6D40A" },
6
+
{ name = "gleam_stdlib", version = "0.65.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "7C69C71D8C493AE11A5184828A77110EB05A7786EBF8B25B36A72F879C3EE107" },
7
+
{ name = "gleeunit", version = "1.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "CD701726CBCE5588B375D157B4391CFD0F2F134CD12D9B6998A395484DE05C58" },
8
+
{ name = "simplifile", version = "2.3.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0A868DAC6063D9E983477981839810DC2E553285AB4588B87E3E9C96A7FB4CB4" },
9
+
]
10
+
11
+
[requirements]
12
+
gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" }
13
+
gleeunit = { version = ">= 1.0.0 and < 2.0.0" }
14
+
simplifile = { version = ">= 2.3.0 and < 3.0.0" }
+82
2015/17/gleam/src/main.gleam
+82
2015/17/gleam/src/main.gleam
···
1
+
import gleam/dict
2
+
import gleam/int
3
+
import gleam/io
4
+
import gleam/list
5
+
import gleam/result
6
+
import gleam/string
7
+
import simplifile as file
8
+
9
+
fn check_containers_part1(input, remaining, right_options) {
10
+
case remaining {
11
+
0 -> right_options + 1
12
+
r if r < 0 -> right_options
13
+
_ -> {
14
+
let #(_, right_options) =
15
+
input
16
+
|> dict.fold(#(input, right_options), fn(acc, cid, cv) {
17
+
let #(input, right_options) = acc
18
+
let input = input |> dict.delete(cid)
19
+
#(input, check_containers_part1(input, remaining - cv, right_options))
20
+
})
21
+
right_options
22
+
}
23
+
}
24
+
}
25
+
26
+
fn check_containers_part2(input, remaining, right_options, jars_used) {
27
+
case remaining {
28
+
0 ->
29
+
right_options
30
+
|> dict.insert(
31
+
jars_used,
32
+
{ dict.get(right_options, jars_used) |> result.unwrap(0) } + 1,
33
+
)
34
+
r if r < 0 -> right_options
35
+
_ -> {
36
+
let #(_, right_options) =
37
+
input
38
+
|> dict.fold(#(input, right_options), fn(acc, cid, cv) {
39
+
let #(input, right_options) = acc
40
+
let input = input |> dict.delete(cid)
41
+
#(
42
+
input,
43
+
check_containers_part2(
44
+
input,
45
+
remaining - cv,
46
+
right_options,
47
+
jars_used + 1,
48
+
),
49
+
)
50
+
})
51
+
right_options
52
+
}
53
+
}
54
+
}
55
+
56
+
pub fn main() {
57
+
let assert Ok(input) = file.read(from: "../input.txt")
58
+
as "Input file not found"
59
+
let #(input, _) =
60
+
input
61
+
|> string.trim
62
+
|> string.split("\n")
63
+
|> list.fold(#(dict.new(), 1), fn(l, v) {
64
+
#(dict.insert(l.0, l.1, int.parse(v) |> result.unwrap(0)), l.1 + 1)
65
+
})
66
+
67
+
check_containers_part1(input, 150, 0)
68
+
|> int.to_string
69
+
|> io.println
70
+
71
+
let #(_number_of_jars, possibilities) =
72
+
check_containers_part2(input, 150, dict.new(), 0)
73
+
|> dict.fold(#(999_999, 0), fn(last, number_of_jars, possibilities) {
74
+
case last.0 > number_of_jars {
75
+
True -> #(number_of_jars, possibilities)
76
+
False -> last
77
+
}
78
+
})
79
+
possibilities
80
+
|> int.to_string
81
+
|> io.println
82
+
}