+30
-2
2015/20/rust/src/main.rs
+30
-2
2015/20/rust/src/main.rs
···
1
1
fn main() {
2
-
let input = include_str!("../../input.txt").trim();
2
+
let input: u64 = include_str!("../../input.txt")
3
+
.trim()
4
+
.parse()
5
+
.expect("bad input");
6
+
let input = input / 10;
3
7
4
-
println!("{}", &input);
8
+
let mut highest_house = (0, 0);
9
+
let mut house: u64 = 1;
10
+
// while highest_house.1 < input {
11
+
while house < 10 {
12
+
let presents = if house % 2 == 0 {
13
+
(1..house + 1).fold(0, |acc, elf| {
14
+
if house % elf == 0 { acc + elf } else { acc }
15
+
})
16
+
} else {
17
+
(1..house.div_ceil(2) + 1).fold(0, |acc, elf| {
18
+
if house % (elf * 2) == 0 {
19
+
acc + elf
20
+
} else {
21
+
acc
22
+
}
23
+
})
24
+
};
25
+
if presents > highest_house.1 {
26
+
highest_house = (house, presents);
27
+
}
28
+
house += 1;
29
+
println!("{} {}", house, presents);
30
+
}
31
+
32
+
println!("Part 1: {:?}", highest_house);
5
33
}
+20
2025/5/gleam/gleam.toml
+20
2025/5/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
2025/5/gleam/manifest.toml
+14
2025/5/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" }
+117
2025/5/gleam/src/main.gleam
+117
2025/5/gleam/src/main.gleam
···
1
+
import gleam/int
2
+
import gleam/io
3
+
import gleam/list
4
+
import gleam/order.{Eq, Gt, Lt}
5
+
import gleam/set
6
+
import gleam/string
7
+
import simplifile as file
8
+
9
+
pub fn main() {
10
+
let assert Ok(input) = file.read(from: "../input.txt")
11
+
as "Input file not found"
12
+
let assert [fresh_ranges, available] =
13
+
input |> string.trim |> string.split("\n\n")
14
+
let fresh_ranges =
15
+
fresh_ranges
16
+
|> string.trim
17
+
|> string.split("\n")
18
+
|> list.reverse
19
+
|> list.drop(5)
20
+
|> list.take(12)
21
+
|> list.reverse
22
+
|> list.map(fn(i) {
23
+
let assert [from, to] = i |> string.trim |> string.split("-")
24
+
let assert Ok(from) = int.parse(from)
25
+
let assert Ok(to) = int.parse(to)
26
+
#(from / 100_000_000, to / 100_000_000)
27
+
// #(from, to)
28
+
})
29
+
let available =
30
+
available
31
+
|> string.split("\n")
32
+
|> list.map(fn(i) {
33
+
let assert Ok(id) = int.parse(i)
34
+
id
35
+
})
36
+
37
+
available
38
+
|> list.fold(0, fn(acc, i) {
39
+
acc
40
+
+ case list.any(fresh_ranges, fn(range) { i >= range.0 && i <= range.1 }) {
41
+
True -> 1
42
+
False -> 0
43
+
}
44
+
})
45
+
|> int.to_string
46
+
|> io.println
47
+
48
+
// let haha =
49
+
// fresh_ranges
50
+
// |> list.fold(set.new(), fn(acc, i) {
51
+
// list.range(i.0, i.1) |> list.fold(acc, fn(acc, i) { set.insert(acc, i) })
52
+
// })
53
+
// io.println(set.size(haha) |> int.to_string)
54
+
55
+
let base_set: set.Set(#(Int, Int)) = set.new()
56
+
let ranges =
57
+
fresh_ranges
58
+
|> list.fold(base_set, fn(prev_seen_ranges, range) {
59
+
let #(range, seen_ranges) =
60
+
prev_seen_ranges
61
+
|> set.fold(#(range, prev_seen_ranges), fn(acc, seen_range) {
62
+
let #(range, seen_ranges) = acc
63
+
echo #(
64
+
range,
65
+
seen_range,
66
+
int.compare(range.0, seen_range.0),
67
+
int.compare(range.1, seen_range.1),
68
+
int.compare(range.0, seen_range.1),
69
+
int.compare(range.1, seen_range.0),
70
+
)
71
+
case
72
+
int.compare(range.0, seen_range.0),
73
+
int.compare(range.1, seen_range.1),
74
+
int.compare(range.0, seen_range.1),
75
+
int.compare(range.1, seen_range.0)
76
+
{
77
+
Gt, Gt, Gt, Gt | Lt, Lt, Lt, Lt -> #(range, seen_ranges)
78
+
Eq, Eq, Eq, Eq
79
+
| Gt, Lt, Lt, Gt
80
+
| Eq, Lt, Lt, Gt
81
+
| Eq, Lt, Lt, Eq
82
+
| Gt, Eq, Lt, Gt
83
+
| Gt, Eq, Eq, Gt
84
+
| Eq, Eq, Lt, Gt
85
+
-> #(#(0, 0), seen_ranges)
86
+
Eq, Gt, Eq, Gt | Lt, Eq, Lt, Gt | Lt, Gt, Lt, Gt | Lt, Eq, Lt, Eq -> #(
87
+
range,
88
+
set.delete(seen_ranges, seen_range),
89
+
)
90
+
Eq, Gt, Lt, Gt -> #(range, set.delete(seen_ranges, seen_range))
91
+
Lt, Lt, Lt, Gt | Lt, Lt, Lt, Eq -> #(
92
+
#(range.0, seen_range.1),
93
+
set.delete(seen_ranges, seen_range),
94
+
)
95
+
Gt, Gt, Lt, Gt -> #(
96
+
#(seen_range.0, range.1),
97
+
set.delete(seen_ranges, seen_range),
98
+
)
99
+
Gt, Gt, Eq, Gt -> #(
100
+
#(seen_range.0, range.0),
101
+
set.delete(seen_ranges, seen_range),
102
+
)
103
+
_, _, _, _ -> #(range, seen_ranges)
104
+
}
105
+
})
106
+
107
+
case range == #(0, 0) {
108
+
False -> seen_ranges |> set.insert(range)
109
+
True -> seen_ranges
110
+
}
111
+
})
112
+
echo ranges
113
+
ranges
114
+
|> set.fold(0, fn(acc, range) { acc + range.1 - range.0 + 1 })
115
+
|> int.to_string
116
+
|> io.println
117
+
}