1
0

Compare commits

...

15 Commits

Author SHA1 Message Date
e871837dc6 rustfmt 2022-12-27 01:46:31 +00:00
8fbaaa4bbc day 12 2022-12-27 01:35:54 +00:00
c7087d0921 day 11 2022-12-26 23:52:21 +00:00
00a67d7d3d day 10 2022-12-26 22:02:09 +00:00
02445824a6 day 9 2022-12-26 21:31:55 +00:00
2c1323095f day 8 2022-12-26 18:33:09 +00:00
ffd5771fc9 update day 7 2022-12-23 23:04:34 +00:00
64820c0251 day 7 2022-12-23 23:01:37 +00:00
52a17ff632 day 6 2022-12-23 21:20:23 +00:00
87f14bbf0c day 5 2022-12-23 20:52:52 +00:00
c67298eb5a day 4 2022-12-23 19:34:36 +00:00
8e55e961cb workspace 2022-12-23 19:15:57 +00:00
04490516f0 day 3 2022-12-23 19:12:52 +00:00
cede3289dc day 2 2022-12-23 18:09:51 +00:00
c5d6c5142d day 1 2022-12-23 18:09:40 +00:00
48 changed files with 11098 additions and 0 deletions

16
Cargo.toml Normal file
View File

@ -0,0 +1,16 @@
[workspace]
members = [
"day1",
"day2",
"day3",
"day4",
"day5",
"day6",
"day7",
"day8",
"day9",
"day10",
"day11",
"day12",
]

8
day1/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day1"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

2242
day1/input.txt Normal file

File diff suppressed because it is too large Load Diff

14
day1/sample_input.txt Normal file
View File

@ -0,0 +1,14 @@
1000
2000
3000
4000
5000
6000
7000
8000
9000
10000

24
day1/src/main.rs Normal file
View File

@ -0,0 +1,24 @@
fn main() {
const INPUT: &str = include_str!("../input.txt");
let split = INPUT.split("\n");
let mut calories: Vec<u64> = Vec::new();
let mut running_total: u64 = 0;
for s in split {
if s == "" {
calories.push(running_total);
running_total = 0;
} else {
running_total += s.trim().parse::<u64>().expect("Invalid input line: {s}!");
}
}
let max_calories = calories.iter().max().unwrap();
println!("Max calories: {max_calories}");
calories.sort_by(|a, b| b.cmp(a));
let top_three = calories[0] + calories[1] + calories[2];
println!("Sum of top 3: {top_three}");
}

8
day10/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day10"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

143
day10/input.txt Normal file
View File

@ -0,0 +1,143 @@
noop
noop
addx 5
noop
noop
addx 6
addx 4
addx -4
addx 4
addx -6
addx 11
addx -1
addx 2
addx 4
addx 3
noop
addx 2
addx -30
addx 2
addx 33
noop
addx -37
noop
noop
noop
addx 3
addx 2
addx 5
addx 20
addx 7
addx -24
addx 2
noop
addx 7
addx -2
addx -6
addx 13
addx 3
addx -2
addx 2
noop
addx -5
addx 10
addx 5
addx -39
addx 1
addx 5
noop
addx 3
noop
addx -5
addx 10
addx -2
addx 2
noop
noop
addx 7
noop
noop
noop
noop
addx 3
noop
addx 3
addx 2
addx 8
addx -1
addx -20
addx 21
addx -38
addx 5
addx 2
noop
noop
noop
addx 8
noop
noop
addx -2
addx 2
addx -7
addx 14
addx 5
noop
noop
noop
addx -16
addx 17
addx 2
addx -12
addx 19
noop
noop
addx -37
noop
noop
noop
addx 3
addx 2
addx 2
addx 5
addx 20
addx -19
addx 2
noop
noop
noop
addx 5
addx 19
addx -12
addx 3
addx -2
addx 2
addx -18
addx 25
addx -14
addx -22
addx 1
noop
noop
noop
addx 3
addx 5
addx -4
addx 7
addx 4
noop
addx 1
noop
noop
addx 2
addx -6
addx 15
addx -1
addx 4
noop
noop
addx 1
addx 4
addx -33
noop
addx 21
noop

146
day10/sample_input.txt Normal file
View File

@ -0,0 +1,146 @@
addx 15
addx -11
addx 6
addx -3
addx 5
addx -1
addx -8
addx 13
addx 4
noop
addx -1
addx 5
addx -1
addx 5
addx -1
addx 5
addx -1
addx 5
addx -1
addx -35
addx 1
addx 24
addx -19
addx 1
addx 16
addx -11
noop
noop
addx 21
addx -15
noop
noop
addx -3
addx 9
addx 1
addx -3
addx 8
addx 1
addx 5
noop
noop
noop
noop
noop
addx -36
noop
addx 1
addx 7
noop
noop
noop
addx 2
addx 6
noop
noop
noop
noop
noop
addx 1
noop
noop
addx 7
addx 1
noop
addx -13
addx 13
addx 7
noop
addx 1
addx -33
noop
noop
noop
addx 2
noop
noop
noop
addx 8
noop
addx -1
addx 2
addx 1
noop
addx 17
addx -9
addx 1
addx 1
addx -3
addx 11
noop
noop
addx 1
noop
addx 1
noop
noop
addx -13
addx -19
addx 1
addx 3
addx 26
addx -30
addx 12
addx -1
addx 3
addx 1
noop
noop
noop
addx -9
addx 18
addx 1
addx 2
noop
noop
addx 9
noop
noop
noop
addx -1
addx 2
addx -37
addx 1
addx 3
noop
addx 15
addx -21
addx 22
addx -6
addx 1
noop
addx 2
addx 1
noop
addx -10
noop
noop
addx 20
addx 1
addx 2
addx 2
addx -6
addx -11
noop
noop
noop

53
day10/src/main.rs Normal file
View File

@ -0,0 +1,53 @@
fn do_cycle(cycle: u64, x_reg: i64) {
let col = (cycle - 1) % 40;
// println!("{} <= ")
if x_reg - 1 <= col.try_into().unwrap() && x_reg + 1 >= col.try_into().unwrap() {
print!("#");
} else {
print!(".");
}
if col == 39 {
println!();
}
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
const ADD_CYCLES: u64 = 2;
let mut strengths: Vec<i64> = Vec::new();
let mut cycles = 1u64;
let mut x_reg = 1i64;
do_cycle(cycles, x_reg);
for line in INPUT.lines() {
if line.starts_with("noop") {
cycles += 1;
} else {
let (_, operand) = line.split_once(' ').unwrap();
let operand = operand.parse::<i64>().unwrap();
for _ in 0..(ADD_CYCLES - 1) {
cycles += 1;
if (cycles + 20) % 40 == 0 {
strengths.push((cycles as i64) * x_reg);
}
do_cycle(cycles, x_reg);
}
cycles += 1;
x_reg += operand;
}
if (cycles + 20) % 40 == 0 {
strengths.push((cycles as i64) * x_reg);
}
do_cycle(cycles, x_reg);
}
let sum: i64 = strengths.iter().sum();
println!("{}", sum);
}

9
day11/Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "day11"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
num = { version = "0.4.0" }

55
day11/input.txt Normal file
View File

@ -0,0 +1,55 @@
Monkey 0:
Starting items: 89, 74
Operation: new = old * 5
Test: divisible by 17
If true: throw to monkey 4
If false: throw to monkey 7
Monkey 1:
Starting items: 75, 69, 87, 57, 84, 90, 66, 50
Operation: new = old + 3
Test: divisible by 7
If true: throw to monkey 3
If false: throw to monkey 2
Monkey 2:
Starting items: 55
Operation: new = old + 7
Test: divisible by 13
If true: throw to monkey 0
If false: throw to monkey 7
Monkey 3:
Starting items: 69, 82, 69, 56, 68
Operation: new = old + 5
Test: divisible by 2
If true: throw to monkey 0
If false: throw to monkey 2
Monkey 4:
Starting items: 72, 97, 50
Operation: new = old + 2
Test: divisible by 19
If true: throw to monkey 6
If false: throw to monkey 5
Monkey 5:
Starting items: 90, 84, 56, 92, 91, 91
Operation: new = old * 19
Test: divisible by 3
If true: throw to monkey 6
If false: throw to monkey 1
Monkey 6:
Starting items: 63, 93, 55, 53
Operation: new = old * old
Test: divisible by 5
If true: throw to monkey 3
If false: throw to monkey 1
Monkey 7:
Starting items: 50, 61, 52, 58, 86, 68, 97
Operation: new = old + 4
Test: divisible by 11
If true: throw to monkey 5
If false: throw to monkey 4

27
day11/sample_input.txt Normal file
View File

@ -0,0 +1,27 @@
Monkey 0:
Starting items: 79, 98
Operation: new = old * 19
Test: divisible by 23
If true: throw to monkey 2
If false: throw to monkey 3
Monkey 1:
Starting items: 54, 65, 75, 74
Operation: new = old + 6
Test: divisible by 19
If true: throw to monkey 2
If false: throw to monkey 0
Monkey 2:
Starting items: 79, 60, 97
Operation: new = old * old
Test: divisible by 13
If true: throw to monkey 1
If false: throw to monkey 3
Monkey 3:
Starting items: 74
Operation: new = old + 3
Test: divisible by 17
If true: throw to monkey 0
If false: throw to monkey 1

107
day11/src/main.rs Normal file
View File

@ -0,0 +1,107 @@
struct Monkey {
items: Vec<i64>,
operation: Box<dyn Fn(i64) -> i64>,
test: Box<dyn Fn(i64) -> i64>,
inspections: u64,
}
fn empty_op(_: i64) -> i64 {
-1
}
fn empty_test(_: i64) -> i64 {
-1
}
fn op_func(op: char, operand: &str) -> Box<dyn Fn(i64) -> i64> {
let op = match op {
'*' => std::ops::Mul::mul,
'+' => std::ops::Add::add,
_ => panic!("unsupported op {}", op),
};
if operand == "old" {
Box::new(move |x| op(x, x))
} else {
let operand: i64 = operand.parse().unwrap();
Box::new(move |x| op(x, operand))
}
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
let mut monkeys: Vec<Monkey> = Vec::new();
let mut cur_monkey = -1i64;
let mut cur_test_divisor = -1i64;
let mut cur_test_true_ret = -1i64;
let mut lcm: i64 = 1;
for line in INPUT.lines() {
let line = line.trim_start();
if line == "" {
continue;
} else if line.starts_with("Monkey") {
cur_monkey += 1;
monkeys.push(Monkey {
items: Vec::new(),
operation: Box::new(empty_op),
test: Box::new(empty_test),
inspections: 0,
});
continue;
} else if line.starts_with("Starting items: ") {
let items = line[16..].split(", ");
for item in items {
monkeys[cur_monkey as usize]
.items
.push(item.parse().unwrap());
}
} else if line.starts_with("Operation: ") {
let mut items = line[21..].split(' ');
let op = items.next().unwrap().chars().next().unwrap();
let operand = items.next().unwrap();
monkeys[cur_monkey as usize].operation = op_func(op, operand);
} else if line.starts_with("Test: ") {
cur_test_divisor = line[19..].parse().unwrap();
lcm = num::integer::lcm(lcm, cur_test_divisor);
} else if line.starts_with("If true: ") {
cur_test_true_ret = line[25..].parse().unwrap();
} else if line.starts_with("If false: ") {
let target: i64 = line[26..].parse().unwrap();
monkeys[cur_monkey as usize].test = Box::new(move |x| {
if x % cur_test_divisor == 0 {
cur_test_true_ret
} else {
target
}
});
}
}
println!("lcm: {}", lcm);
for _ in 1..=10000 {
for i in 0..monkeys.len() {
for j in 0..monkeys[i].items.len() {
let mut new_worry = (monkeys[i].operation)(monkeys[i].items[j]);
new_worry = new_worry % lcm;
let dest: usize = (monkeys[i].test)(new_worry).try_into().unwrap();
monkeys[dest].items.push(new_worry);
monkeys[i].inspections += 1;
}
monkeys[i].items.clear();
}
}
let mut active_monkeys = monkeys.iter().map(|m| m.inspections).collect::<Vec<u64>>();
active_monkeys.sort();
active_monkeys.reverse();
println!("{}", active_monkeys[0] * active_monkeys[1]);
}

9
day12/Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "day12"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
petgraph = "0.6.2"

41
day12/input.txt Normal file
View File

@ -0,0 +1,41 @@
abaaacccccccccaaaaaaccccccccccccccccaacccccccccccaacaaaaaaaaaaaaaaaaaccaaaaacccaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa
abaaacccccccccaaaaaacccccccccccccccaaaaccccccccccaaaaaaaacaaaaaaaaaaaccaaaaaaccaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa
abaaaccccccccccaaaaacccccccccccccccaaaacccccccccccaaaaacccaaaaaaaaaacccaaaaaacccaaccccccccccccccaaaaacccccccccccccccccccccccccccccccccccccaaaaaa
abccccaaccccccaaaaacccccccccaaaaaccaaaaccccccccccccaaaaacaaaaaaaaacccccaaaaaccccccccccccccccccccaaaaacccccccccccccccccaaaccccaaaccccccccccaaacaa
abcccaaaacccccaaaaacccccccccaaaaacccccccccccccccccaaacaaaaaaaaaacccccccaaaaacccccccccccccccccccaaaaaacccccccccccccccccaaaaccaaaaccccccccccccccaa
abcccaaaaacacccccccccccccccaaaaaaccccccccccccccccccaaccaaaaacaaaaccccccccccccccccccccccccccccccaaaaaaccccccccccccccccccaaaaaaaacccccccccccccccaa
abaaaaaaaaaacccccccccccccccaaaaaaccccccccccccccccccccccaaaacccaaaccccccccccccccccccccccccccccccaaaaaacccccccccccccccciiiiijaaaaccccccccccccccccc
abaaaaaaaaaacccccccccccccccaaaaaacccccccccccccccccccccccccccccaaacccccccccccccccccccccccccccccccaaaccccccccccccccccciiiiiijjjaccccccccaaaccccccc
abccaaaaaaccccccccccccccccccaaaccccccccccccccccccccccccccccccccacccccccccccaacccccccccccccccccccccccccccccccccccccciiiiioijjjjaaccccccaaaaaacccc
abccaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccccccccccccccccccccccccccccccccciiinnooojjjjjaaccaaaaaaaacccc
abccaaaaaacccccccccccccccccccccccccccccccccccccaacccccaacccccccccccccccccaaaaaacccccccccccccccccccccccccccaaaccccciiinnnoooojjjjjjkkkaaaaaaacccc
abcaaaaaaaaccccccccccccccccccccccccccccccccccccaaaccaaaaaaccccaaacccccccccaaaacccccccccccccccccccccccccccccaaaaccciiinnnouooojjjjkkkkkaaaaaccccc
abccaccccccccccccccccccaaccccccaccccccccccccaaaaaaaaaaaaaacccaaaacccccccccaaaacccccccccccccccccccccccccccaaaaaacchhinnnttuuooooookkkkkkkaaaccccc
abccccccccccccccccccaacaaaccccaaaaaaaaccccccaaaaaaaacaaaaacccaaaacccccccccaccacccccccccccccccccccccccccccaaaaacchhhhnntttuuuooooppppkkkkcaaacccc
abccccccccaaacccccccaaaaaccccccaaaaaaccccccccaaaaaacaaaaaccccaaaaccccccccccccccccccccccccccccaccccccccccccaaaaahhhhnnntttxuuuooppppppkkkcccccccc
abccccccccaaaacccccccaaaaaaccccaaaaaaccaaacccaaaaaacaaaaaccccccccccccccaaccccccccccccccaaaaaaaacccccccccccaachhhhhnnnntttxxuuuuuuuupppkkkccccccc
abccccccccaaaacccccaaaaaaaacccaaaaaaaacaaacacaaaaaaccccccccccccccccccccaacccccccccccccccaaaaaacccccccccccccchhhhmnnnntttxxxxuuuuuuupppkkcccccccc
abacccccccaaaacccccaaaaacaaccaaaaaaaaaaaaaaaaaaccaacccccccccccccccccaaaaaaaaccccccccccccaaaaaaccccccccccccchhhhmmmntttttxxxxuyyyuvvpppklcccccccc
abacccccccccccccccccacaaaccaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccaaaaaaaacccccccccccaaaaaaaaccccccccccccgghmmmtttttxxxxxxyyyyvvvpplllcccccccc
abaccccccccaacccccccccaaaccaaaaaaaacaaaaaaaaaaccccccccccccccccccccccccaaaaccccccccccccaaaaaaaaaaccccccaccccgggmmmtttxxxxxxxyyyyyvvppplllcccccccc
SbaaaccccccaaacaaaccccccccaaaaaaaaacaaaaaaaaacccccccccccccccccccccccccaaaaacccccccccccaaaaaaaaaaaaacaaaccaagggmmmtttxxxEzzzzyyyvvppplllccccccccc
abaacccccccaaaaaaacccccccaaaaaaacaaccaaaaaaaccccccccccccccaaaccccccccaaaaaacccccccccccacacaaacccaaaaaaacaaagggmmmsssxxxxxyyyyyvvvqqqlllccccccccc
abaccccccccaaaaaaccacccaaaaaaaaacccccccaaaaaaccccccccccccaaaaccccccccaaccaacccccccccccccccaaaccccaaaaaaccaagggmmmssssxxwwyyyyyyvvqqqlllccccccccc
abaccccccaaaaaaaaccaacaaaccaaaaaacccccaaaaaaaccccccccccccaaaaccccccccccaacccccccccccccccccaacccccaaaaaaaaaaggggmmmssssswwyywyyyyvvqqlllccccccccc
abaccccccaaaaaaaaacaaaaacccaaaaaacccccaaacaaaccccccccccccaaaaccccccccaaaaaaccccccccccccaacccccccaaaaaaaaaaaaggggmmmossswwyywwyyvvvqqqllccccccccc
abcccccccaaaaaaaaaacaaaaaacaaccccccccaaacccccccccccccccccccccccccccccaaaaaaccccccccccccaaaaacccaaaaaaaaaaaaaaggggoooosswwywwwwvvvvqqqmlccccccccc
abccccccccccaaacaaaaaaaaaacccccccccccaaacaccccccccccccccccccccccccccccaaaaccccccccccccaaaaaccccaaacaaacccaaacagggfooosswwwwwrvvvvqqqqmmccccccccc
abccccccccccaaacccaaaaaaaacccccccccaacaaaaacccccccccccccccccccccccccccaaaaccccccccccccaaaaaacccccccaaacccaaccccfffooosswwwwrrrrrqqqqqmmccccccccc
abccccccccccaacccccccaaccccccccccccaaaaaaaacccccccccccccaaccccccccccccaccaccccccccccccccaaaacccccccaacccccccccccfffoossrwrrrrrrrqqqqmmmccccccccc
abccaaaccccccccccccccaacccccccccccccaaaaaccccccccccccaacaacccccccaaaaacccccccccccccccccaacccccccccccccccccccccccfffoossrrrrrnnnmqqmmmmmccccccccc
abcaaaaccccccccccccccccccccccccccccccaaaaacccccccccccaaaaacccccccaaaaacccaaaccccccccccccccccccccccccccccccccccccfffooorrrrrnnnnmmmmmmmccccaacccc
abcaaaacccccccccccccccccccccccccccccaaacaaccccacccccccaaaaaaccccaaaaaaccccaaaccacccccccccccccccccccccccccccccccccffoooonnnnnnnnmmmmmmccccaaacccc
abccaaacccccccccccccccccccccaaaaaccccaaccccaaaacccccaaaaaaaaccccaaaaaaccccaaaaaaaccccccccccccccccaccaccccccccccccfffooonnnnnnddddddddcccaaaccccc
abccccccccccccccccccccccccccaaaaaccccccccccaaaaaacccaaaaacaacccaaaaaaaccaaaaaaaacccccccccccccccccaaaaccccccccccccfffeonnnnneddddddddddcaaacccccc
abccccccccccaaaccccccccccccaaaaaacccccccccccaaaacccccacaaacccccaacaacccaaaaaaaaacccccccccccccccccaaaacccccccccccccffeeeeeeeeddddddddcccaaacccccc
abcccccccccaaaaccccacccccccaaaaaaccccccccccaaaaacccccccaaaacccaaacaccccaaaaaaaaaccccccccccccccccaaaaaaccccccccccccceeeeeeeeedacccccccccccccccccc
abaccccccccaaaaccccaaacaaacaaaaaaccccccccccaacaaccccccccaaaacaaaacaaacaaaaaaaaaacccccccccccccaacaaaaaacccccccccccccceeeeeeeaaacccccccccccccccaaa
abaaacccccccaaaccccaaaaaaaccaaaccccccccaaacccccccccccccccaaaaaaaacaaaaaaaaaaaaaaacacaaccaaacaaacccaacccccccccccccccccaacccaaaacccccccccccccccaaa
abaaaccccccccccccccaaaaaaccccccccccccccaaacccccccccccccccaaaaaaaccaaaaaaccaacccaccaaaaccaaaaaaaccccccccaaccccccccccccccccccaaacccccccccccccccaaa
abaaccccccccccccccaaaaaaacccccccccccaaaaaaaaccccccccccccccaaaaaaaaaaaaaacaaaccccccaaaaaccaaaaaaccccccaaaaccccccccccccccccccaaaccccccccccccaaaaaa
abaaaccccccccccccaaaaaaaaaacccccccccaaaaaaaacccccccccccaaaaaaaaaaaaaaaaaaacccccccaaaaaacaaaaaaaaaccccaaaaaacccccccccccccccccccccccccccccccaaaaaa

5
day12/sample_input.txt Normal file
View File

@ -0,0 +1,5 @@
Sabqponm
abcryxxl
accszExk
acctuvwj
abdefghi

86
day12/src/main.rs Normal file
View File

@ -0,0 +1,86 @@
use petgraph::{algo::dijkstra::*, prelude::*, visit::Reversed};
fn char_elevation(c: char) -> i16 {
let elevation = match c {
'S' => 'a',
'E' => 'z',
c => c,
};
((elevation as u8) - b'a') as i16
}
fn travelable(dest: char, src: char) -> bool {
char_elevation(src) + 1 >= char_elevation(dest)
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
let grid = INPUT.lines().collect::<Vec<&str>>();
let grid = grid
.iter()
.map(|s| s.chars().collect::<Vec<char>>())
.collect::<Vec<Vec<char>>>();
let mut graph: DiGraphMap<(usize, usize), u8> = DiGraphMap::new();
let height = grid.len();
let width = grid[0].len();
let mut start: (usize, usize) = (0, 0);
let mut end: (usize, usize) = (0, 0);
let mut starts: Vec<(usize, usize)> = Vec::new();
for i in 0..height {
for j in 0..width {
graph.add_node((i, j));
let c = grid[i][j];
if c == 'S' {
start = (i, j);
starts.push((i, j));
} else if c == 'E' {
end = (i, j);
} else if c == 'a' {
starts.push((i, j));
}
}
}
for i in 0..height {
for j in 0..width {
let c = grid[i][j];
let up = i.saturating_sub(1);
let down = i + 1;
let left = j.saturating_sub(1);
let right = j + 1;
if left != j && travelable(grid[i][left], c) {
graph.add_edge((i, j), (i, left), 1);
}
if right < width && travelable(grid[i][right], c) {
graph.add_edge((i, j), (i, right), 1);
}
if up != i && travelable(grid[up][j], c) {
graph.add_edge((i, j), (up, j), 1);
}
if down < height && travelable(grid[down][j], c) {
graph.add_edge((i, j), (down, j), 1);
}
}
}
let res = dijkstra(&graph, start, Some(end), |_| 1);
println!("{} steps from ({}, {})", res[&end], start.0, start.1);
let res = dijkstra(Reversed(&graph), end, None, |_| 1);
let mut min: (i32, usize, usize) = (i32::MAX, 0, 0);
for start in starts {
if res.contains_key(&start) && res[&start] < min.0 {
min = (res[&start], start.0, start.1);
}
}
println!("{} steps from ({}, {})", min.0, min.1, min.2);
}

8
day2/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day2"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

2500
day2/input.txt Normal file

File diff suppressed because it is too large Load Diff

3
day2/sample_input.txt Normal file
View File

@ -0,0 +1,3 @@
A Y
B X
C Z

92
day2/src/main.rs Normal file
View File

@ -0,0 +1,92 @@
#[derive(PartialEq)]
#[repr(u8)]
enum Move {
ROCK = 1,
PAPER = 2,
SCISSORS = 3,
}
#[repr(u8)]
enum Outcome {
LOSS = 0,
DRAW = 3,
WIN = 6,
}
impl TryFrom<char> for Move {
type Error = ();
fn try_from(c: char) -> Result<Self, Self::Error> {
match c {
'A' | 'X' => Ok(Move::ROCK),
'B' | 'Y' => Ok(Move::PAPER),
'C' | 'Z' => Ok(Move::SCISSORS),
_ => Err(()),
}
}
}
impl std::fmt::Display for Move {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Move::ROCK => f.write_str("Rock").unwrap(),
Move::PAPER => f.write_str("Paper").unwrap(),
Move::SCISSORS => f.write_str("Scissors").unwrap(),
};
std::fmt::Result::Ok(())
}
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
let mut your_score: u64 = 0;
let mut their_score: u64 = 0;
let lines = INPUT.split("\n");
for line in lines {
let mut tokens = line.split(' ');
let their_move = tokens.next().unwrap();
let your_move = tokens.next().unwrap();
let their_move = Move::try_from(their_move.chars().next().unwrap()).unwrap();
let your_move = Move::try_from(your_move.chars().next().unwrap()).unwrap();
let outcome: Outcome;
if their_move == your_move {
outcome = Outcome::DRAW
} else if their_move == Move::ROCK {
outcome = if your_move == Move::PAPER {
Outcome::WIN
} else {
Outcome::LOSS
};
} else if their_move == Move::PAPER {
outcome = if your_move == Move::SCISSORS {
Outcome::WIN
} else {
Outcome::LOSS
};
} else {
outcome = if your_move == Move::ROCK {
Outcome::WIN
} else {
Outcome::LOSS
};
}
let outcome: u64 = outcome as u64;
your_score += outcome;
their_score += 6 - (outcome);
let your_move: u64 = your_move as u64;
let their_move: u64 = their_move as u64;
your_score += your_move;
their_score += their_move;
}
println!("Your score: {your_score}");
println!("Their score: {their_score}");
}

8
day3/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day3"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

300
day3/input.txt Normal file
View File

@ -0,0 +1,300 @@
FzQrhQpJtJMFzlpplrTWjTnTTrjVsVvvTnTs
mScqSqqgcfPCqGPZcfGNSvTNsVVNSjNvWSNsNz
fPcPGqgCcHgFzQpJJtHtJH
DZDqqlrjplDHrNCmnBcHBMCRcJzb
RQFLStFvdcBbzdJbJM
PThQtwftTPFvtTPhvtFtfFtpZZllwjRNlsqNqqZjwpGlrZ
pPwtqgwJZPJLgQqSFlqhFFlqMd
DBmCWBBDWTRGvcVRTCCnnfQlFSdlzfhfdMWQfjhhQz
drmBVVCRgprPtrZp
HznjQjvmzDMVrQnMLJMMlfWgPSlJGWWJPl
BdcqqhcdBRpFhhZBthhctdJSJJWfgGFlJCSFgbWPCDJS
NdRTZdNqBwqtthpRBTTRqdtZrsLQVzrrzjzDwDsnmrQrnsrr
HZFZCFzZWszqsRTBZTNMhmthVTmhDppmMQVPpm
wjvSbJddvrvlrvnJSJJvlJmhPlhVPVtGVpQDBVMpphQP
frbrfrcvvnvjfwbcJgrrCBRsCFsNzRgRCHCqssRH
dDFNqNqZqPLNqvqTTvCLSPdZssGHClJQJcRHJGHHcHBcsMsQ
lrjmWgWWrhjgrppQHHMQrsQRJGcBJc
lVlmnwjmdTTSvVFN
FWNFHvQPmLGwwwSHtswwln
RfMJcDdfdcfdddfZjdchrtZmSmCZVtqVnZmrnrtC
JMmJcfjjphcghpgjhRGzGzBBGPFGNBvPTpFL
cVPVwStmmcQPBQPpSCppwhHZNNqHszNBhsNRNjqHzj
MfWdDgvdbnvgMTWgvgZfzmsZJHzNhqjqjRhJ
MDWMWGndMgFDnFLDwQrPPCSrCSVrlmGS
QLZmPdRdWmMsMDWZmsLWWrhMHcHGzHvGzFcvrvzNrc
tplSbLVBlvHHcFNnSr
VqfgwLlCJWmWQTfW
nRWvlvRbtLvdMCPFGL
wrfsJNNGhNzGrTgDMDLgPMLPfq
wcVhJQhwhrrBpmVblBRGSG
HHHcggrZLcQQcQll
GzfzTRTzmmFMwSNSwdSJQtNLNB
TGbmLMFTzVVVTMzmFMfFPMHPZhnjZCpHnhgnZnPWCPZZ
MRwwpVMHRspqVqwmccDlDrcHBBZgBl
jQfQQQjWWFBgmcgDfcZg
hvvSQzSnQQSWWQWSjTZVTRMshwVCssppwV
pvrTvCvtFppCHMMZcdDFdcZM
wLjTQnqljjSnlwjqjRgLcHHHMBDMZhBMHgHcbBDh
mqjqlSNqRqwSRrWCvzGmtfTfzs
TWScDCqCQQVBWDqWHsHswwBgRJzRhhHp
dPttGrvFfGjMjnjvshsJgsJLgghRgH
rFMlGdtjPffNnnrffSNcVCDqQqCQRqQRRN
GmBRbVpPbmJcwggBBgWW
LjsTCNNtddjHqLLgWwccqgfq
nsjNjntNtjHCsDwZmwZZVmmGSvSD
bwDDgNFtMMDbFsMbFwWWVcRcSpcgjgQWhWSp
lfTJJlvdfCffccWppRjRlcSc
RnzGdJJmsMNnMFtM
bsBTFsqqTTmFZTsQBWWznWCRshlJNJlCVh
GjGnDvDjvjPppHwwpwgrPPClJhNVRCzhhzJWlWlhNlvJ
ffdgLrgdLrDjdfHPbbZbttcBbcbLmntn
TNTwwvTTHNtTHNLLVqtqTSZBJnrnhhbrFJjZjnVZgghF
cplWfRlzcWfRCZZhFrGjBfjZjn
pddzDsRpDcclzCQMWBvNSmTTSqdvPPvqwqtT
DQTttwwLtQtVSDMJDRmmSS
ffsWfvrBWrPvwJhPhPSMPMVn
WsvsggFvwNLgHtNQ
llBbVDMTlFVdFDTbVggSVsqZqZZZqqvNJZJRNRWgtv
HhpjcHHvjPsqCsWcNcsq
GfpvnPvwFDTTFFDw
GMmFGMGFFgVwQHQwwM
cJtZNtZTbThcZtcZJJtTZWJPllgNgpPvVgpjHvQpRpHQNg
hWcJZcnhcJznbcBZLqSLDfCmHqnqCLsD
zQpjLpnhnsHTnlQLrMCCHPFrvvCMPcHm
ZfgdSBtNqBwlgSDfZDwtqSFvJCvrPrVvFmwCJFvrmmFV
dfbRNZBqDtgRNBNNNljLLjhGRGGWGLGTRhjz
hhrnfBzhtzZgDgDnBfrfDZsRpMNCNNWjwCCfGQGGNGCGQC
lcdPmHLSPDSdFDpQMLjCQQQCRGpN
lJSSbmPdVdVvdHbvSDFHHPlZqgBnttzgTsssTrqgbZbsTT
FsdsShrgggLDdbSDsgrGrlWHTpfRpTjjfFTzRTRjBWWp
mPvqCmJCqJNnPvPNPCvvLTTVjHjzNWHHTWRBRVTWVz
wJLvqPZmJtccncvZmJqqrghDGQwbdSGdsgGgQgQr
zFwtNJGtNFlpnwHccZjZbcpprsmc
PWQfBWhBgQgTWQRLThBqMSVDSbbDRsVDmsmZsSZDjr
fvQfWBfLqfTqhLhCvNFttJlCwGrrCC
fNrGLNrfNrGjllRRRPmWVL
tbJdcFbSSssZSmmpFcsSbwDWVWBlllVPDnnjBFjDRnBF
ZZJcvZctgNmmvMGhQm
HhhjFRhgrcRTFLvWVJVQWJVHDHQJPP
GwCmwBfGzfSCzCfwtmtzzJVWSVJJZrbWQQQqJJDZVJ
mtfzpGdststtBmfmCwrGRFcTcvjngjFnRcLnpLLn
rrwjdwLgVmVwHrfPCJPQBCBGmPtt
ccNZqbNnMMblNpTlNpnhhBPSJsQhJtJtChPJqS
vTWvNcWNWTFvnnvcgjzDLVQLgHVwWDrW
jNPgbNHbfLJgLzfz
ShvhhFVVDShFVqMSSSvZfffvPLtBBBBJJlpfLJJv
DqhnShhMnZZwCSDCMhChrRnNrNdNQbHNNPmjmdHN
VQVZGQFnzFTSsBfgzgfs
rjlpjtDrtMLZPMtPtpPZPwCsgSHgMHCCmCTWsgBWSBmg
pjvDqLwrlDtwqtqNLvtjpPPwRNbQRncQVQddZhRhJQbJncbG
PsBSqnSdQsFhmmmnppFc
TRhNvrTCvNTHVcfHbJVTpc
rhtWvGWLrjRqdSqqLLqdld
vPhfqPJvrMrnffDDhvpMjdzGMLdLLQpllLGQ
mbmcFSScGbSCcQlzwQQlclsg
BSGVCmCTZWCGGvnvfZHqqrDhHN
GSRfrzGRhzsGChjTBBlqBgjgCTCn
wHQwtDVDHwHHDJcDWJZwzHZBqTnnBFlvjFgBqnljjvBdBZ
JNmVJpVmNtDHJWHrbfPLhbGhrzRbpr
WcWcbzNPbDwBNvWBwRMPQmJZQRQZftRZGP
LhVHFgggTHCFHhfMQQSMMGQRMLLM
qnrqppFVHphqfDsNbzjrzbrN
cwgDrdLSrBrvvhDzCljjTW
VHtVZpspQtMQsVRQppFVQVHtCdPTPTzdjvhTzTTPRvjjvWhn
QQZpMdJsQFJHtMHdScwLwLJGrSScSwqw
ZsjNflGfRfRPrZNRFcffLwJdwcLdDBnwzzzDznVn
CTGvhhTqbtbgTqLJWdDntzWWdnLw
phCMgmQGvvHCvMhbTQQFsNsNFPZSfZjffmNsll
CNpCJHLNhhSSHZPgrFlFFWgpFpmzjj
qQttDVDwQGdQGvqDQfwbcVrrlljjzzmzrVJgrr
nvMDsqqqQvfvsqDnRSZHJPPZHhLHLS
RNNrrPfDNRQwQhjscghMqs
WVZlHvnZqtlLVLvwjwhsggTstMhwTw
vGHWLJlVWlmLVqRCGCFFNfqqGf
MNzqCnvqvqvCVLBvvCVCpVcRssncrPSTWGrPSPdGTcrP
hmHwFmQjFlhtZmHwtZjjddSSGcsdPrrGcQQQRGPW
fHbbFjlhZwmtwhfjmmwmmLbpLqzqvBzLzCvLNRMbNB
tQfLrtQPrrfDSSCVlDfLSrmbBjGvWjjLmWWWpWNNppmv
wdHhRTTndnRThdvnBFGpNBMnpvvp
JdqTHTHHRdqzsJRRzTRHscJdDSGCfDlqQZqlfZrZZCffqSSQ
hQMWLsgGJMMhsCHggQWhgspDWFPzZvPvptDvzvmtdtdF
BrBlrTBrNRbfnjNQlZDztPvpmpppmzvfdd
jQlQlqQVbVcsMgMgChhJVs
MtFMCTWRFRRtCRTTRTMGJddjLdstHvBzBHzHVVpL
lZSDnbDlnZPrbHpzJJsdSVJpBL
nNghhPrlZlgDTFhCfMFJRMQF
RGpPFZPRQZPFRGvpPQPpjvpmhnnCMjhmhgBgVgMVWBVgVM
wLtfNdNHmrNthCBgCbhnngWd
srSfwHfszsNmtswlrqQDGQFDRPJGDvzRppRJ
GVFFGvVWZLFsmssFRNfVvmGGJPpJTTqDBvTpqlpDvqbBtTPl
gQhzzChzrMQhjpzlzWzJpPpBJb
ghgWjcCjMgCHWdQMhdjChCmfwmRRGZZGVHLZHRfmNwVs
DnDVhdnrfSfpcGGjQQGdJddJ
bPWPRbRsRMsHNzDqTZcGBcqZqmmN
HvwPvvzMPwDCChDVwS
vTCCvTfWFDTtRPMvfWFlDFHBqGLpLzbwBgWwqzGqbBbB
cQcSNchSJSZShVJNnZrhSqBpgwGHHtGwqtbwLbqpbr
JNnJVsJscNstNhQsjnVVNlFfMmTMFfCTfjFvfPRPPF
VLFBsgffNFNqRvbz
ChltjTdjDhHpHZvdpjjZhwCpbNrbSzzbrNGMTMMNSMbWWNSN
vQjpttQhHnLsBQVLsQ
mbzQgTzRVVbsVdQgzzVRddmztFGWNGNNWnGtFSGBsrCNWCrC
jfJjvPPwLDcHDPvDDPDppLCWCFBGWntCBnrtFcrFWTGn
wpJPLjvpTTDpwhfgzmVMbqhdhVRgzl
PlcqbWClLmnqZVLq
THwdrrhddhhfJJhwLJhpQnDVnznnmZQQnSpfpD
vrFdvGsGHhhhwHjFGrFGJHdMCCcNgbWMPccRRccMFLNPPP
tbppJqcNtJnZzRJbPFsFPHfZrrshFDjj
GdwgwlLgGCndsDFrhDHHFF
SSlLnmmvqWNqmcqb
ZPFPPTZpZSWzCMMSzPBsFvhtlQvJQQtJhsVs
dmNbmgbrwDNmbcDgwNdcwdLsnhlJlnvtsBJnhVQqqnstLB
bNGfDGgHHVwbwNwVfgmRMzCzzCSHjSRZSZCTRS
dDTffQdqQQLBLnVLLQvL
rrBHZZcgJcrLvNLtLgRLbN
cjjJhrFlhZwFFzwJzmTBBdmTsDPzDsBP
ClGrJJMNCrGQqlcPvWgnDP
ZBvbjHpSwBVVVcWjjjqQ
BLSbbwsHSTBHwmLHHLbBsSTFdrfvCrtmdzfGJzrdzGJddGfh
gljWRwmSjtJWjJtJjgjSZfVSTVVHGZSVHcVchZ
pBzLFQpPsFBGcGBTThfB
pFpQzFLPLpvQFQnLbsqqGddgjbmwRldwtWmlGWwj
PDQDMFQBMfWPvjdLLndLjrmsMj
qZqVzTRRqHtvZGGtVqTTzVjLLsrmJCddnLjrjHsrhdCr
GzwcZtqNzqvNqwzZVGRwSzbpWfFbWPlWFpNDBfQfFNNf
dfRszdzVdsjwdhLwCCqwGllHvPGPwG
SpJtBLFgcGqHQClqZF
JrttrtcTmSSLrmtBTrNgnBJjbNhhbhzRdsVdMhNjhMMhVd
MPFSCfSMqVSBGrtzlvccfQctzbzl
hZNjTHWWTZwshbLvmlWpBzmbmm
dRTTJNDNhjsJqBBMMgrJPVVr
WnVzDMjlDVWwwHgwhmgNhNNsJh
qfvrLNCcbLdvpcvbrPPqCsGhSJGTTBspTshBpTBBms
ZLvvZfrPfPCLbCFFzjVQzRnNNMVzDQ
nllbFTTpTFTBcnCjQPqQdZRQZhCb
tvWszrrztvSmzQQvrDmZRjjjPPDVqPRdZRdCPd
gfzvSsftgQHQHgQl
GVbHRRGRLpdmGWTm
gSPPltPlrlvccFccPlcJNCTpnnmpMCLMMmWfdRmMSS
FzNJRhhvPFRvQwzqjqzBHZZj
PhZSpFBPBFsNmjBVllltBj
JMGLnrrnbfffrdqRqPHnnqLDVTDDjgmRgwtmjDljlDVlwl
LHMqPqPnnqGLWJPMnndrGfSWppzvvFSChFFFvvzQSQZz
RSWWssbvnnCqZnWsRCnssWrTggNhgbNHBgQjhhQBgjNT
mcpzcppzczcDGVcPcDLLGLjmrMNTNtQNHhMHrQBQNTgN
LVpPfcjjWvsFFnFf
MpddpdCpJdJlbdMvBHMnnsHqSRvG
PWvZfFmZrrfmwWwFznBnqRRSGcsBVmVBRG
zjzzhQPQvzjLPQzwffrwrtlTCDtJDlgJLltpTTJlTl
TvTWjjzpznGttFFZccrrPrSZllcB
gNNSqHMqsMHQJHNZCDDCZDqLZdlZBD
SMQNSRNbRRHwhwhsRmtnvWVmmnbGnjmpGn
ccSVQjCQddTsFJcH
gLppBfgfmvCRFdsddTJJgb
WMLMmWGGBZWZLCtvDhlSSDGlwhSPSzSP
TpqVGVHFQGmqSqPZdccNCzzhdwCjNG
fffbbvftMrBMDDcCccCZCjlvhCCd
RLWMnbftDhnMRtfBftRJMtLMgFgHmmpmPmSmmQFPPLHHVTQS
nRvwQSDNcpVJJcJR
qZMjBhjhZMMBzLBGLGrjJbTPVTpbdPPdVbVb
ZZpmFFZlfGqfmmGMzlfmMmnWQDtHtSvnWWNSHSSstFtS
bFDGZjGDbbRSgLtN
CphJVfJWCTBgvfLHNRcwnt
WVhPWBTzzChzhhhBmrpPPCJZDQtdMlrjFQdrFqsjdrQsFG
ZBpVQHHVMMWWdmmLWw
lQhhrjcRttrqbvQLNwdDWzmNSDmStz
QbGqhcbvcsqvCCHnsCZHCnTn
tlWtQTTTJjTQtVnmrbnPWVShVC
MDMGGzsHcwFgGZBqrmmPSnbqVmNVGC
sZFPwHcMZDBRTlvQQJttTQTR
FhVRfGptMGMnZhRFBNRBCCNHHNvTNTRC
zmwrLLSjrbzmNlcvvrHvDPCN
JLwjQdSbjdbSdqJQFGVqFVMgnGHMfGVV
fffZWrJqZSHWTWHqSvrgDhggzRjttsDhpDgs
PGlBLcBBbnnbLLFbGLBjRgjFTFVzshtzpgsppz
TGCPnMPQlGnPmclPlnnQmbmHJvNvfHdqwddwvvZfCNHCfW
ClLwpspTPrTFZCdzFbZdbQ
RRMWfRgWVRMRQBZZScVczVGFbjNb
MfnvMqWmslvDhQPw
hdndSdqsTddBhdcmmNHFDcqHttPF
JjMzzMZQGwZGZJzMzZJQzGJFvPvNPtFmvmNmDvcFtvDHMv
gZwzQwJfGVJQJbGLBsSTSTdTbCWDBSnd
ZZCHZRzMZGRMhMMVVFNThrdd
SgsccSPmmgqssSlqsgcmscSqlhpFdVThjphNrdrhjdwdhFJN
vmttqTcqvLqqmPccmqSBbRWnWzQZZZZBHnQCzHDH
GgPnGdSPBpGsLTBL
rVNJjmwZqtZZshltFTtvRFsL
mqmWrZVqWjrqZMNwPMQQbsddgdsbsgPz
LZLVvjZrggHLJggSZDgrnPnQnRnppVRllntRdPFz
chMCzbqGmhNhhbBCMBdFnpfqFnltRRQnlPpQ
TChmWcMMTmBswJzZZrWrvzgg
gngRNBNRBsNFFBgfgbLLLnqdSLvLTcbLbd
GWtlChlVMllcZSDWSLbdZL
lljjGlhMGrGJpsFdRJfsfzfz
jVTdrnGQcQtTTTFQqBqsgHHFgsqf
ZZLbPLzDzPZCmsgqsBHt
wDzDlPblRDPLPvhvwtdnnhdrnrMGWMVGMThj
spjjpjvjpjmQjrpCMfSlfzrPBl
dHFntHWnnbRVFtnbcqHFzBCCCPzfPMlcCSlgllzc
RLbVWHnnSWtnHFbdbVRdNNtQsjsQTjDLwmGTmTssQwmLGJ
JbJJSLMhRMSLhNqqwFDwFNcFqL
GcpnGnznnpzpzGpffNTNTwTfwdDNNdTFdD
nllnlPGWQWHcGpzzQGGzGvHGJbVVtJSChQVbmtmVJrmrmbRm
GFsFrzwrflmtdtbltG
ggLPDngCJncNLJRDwgnllmJqjWMjhjhjWWmWjj
nBNRNPgpRgDLTgNwfsSHVBQHVHwsZr
WwvnvWvcFtwtSFSF
zBZZZRQSzMBSgSVJGjGTPTGFzCzmmj
fZDrpZZfRfMgSQDDBhgQghDHsnbrcNlWnnLWHLrHsWnllc
ZVncdPPwVPdhZngnqHWHNNvTHvlMvn
fSLjjLSGGBjTTHqvBqrMNT
RSSSDGRtSGZthTTctmtg
rtzrfJbgJHRfGRZLPR
hdVhlllmFlFPLwHmsRGGZP
nTWhRjTBTWlvNQgnJSSbrJtz
JgVTpBpfvgpTDDJFJvTgggtlFlNNMRLNNzNNZRNHMRCLlF
wbPWcSGbGqWDlnNWMMMCLMWZ
wrsGcbrcbcqwDwbcmGvQBQgTTsdVJgJsVdQf
mztrhgJtDrhgcrZmnhbnzbhcMTMPlBCPBGVGTMVGslCCPGDs
FLRQmjjFSQpQwLlPsMsCpvslvPCB
fNLLwSdSwWSWjwmrtczZhhrJzdzh
HHwCwJFmHZttZCfCSffSMHcVDMcPBRPcPRDhPghM
nvQLsTnLslnLvpzGTssnsRPDMhPgVPVgtcVMRPgVQQ
vnsTGWlTLsWTLLvNsGWlsZrwmZCJddjFmtJJNZFftj
hbjSTvSJTfcSwcPSPfTbfHszVVFpGnpJpsHFnHVVls
rtZrcQrRZZQrmZBQlCGppnppHzpVFCGR
WmLqmgNtcLNQWTbPvfPwbbdb
HzZgsdHglHlzdHsFtsNNJSlNcSpjcjlrrNVv
wqqWRPPqwmbcqPjQVvSPJJrVpv
qqBBqmWRhqRLqcBnhzzztgnTdDHnHsFsHn
rJPFVwwsrJwmdVrLWJvvRBWBvbzWlb
nDZcNGNpjTpHncvpZCDnTNZGhlWzQhWbpRRQlQhpWWSWLlQb
CDNntnCCHnvmqPfwtFdVqd
gqBwgBjCswwgqNBNCVDDTVdhlSDTDcZc
HvRRFMzRRRRMpHrtTllfhZHHSShHTf
PmlGLPrppMrrmFFmLMWRjbsjnsjwQNJWnbQjWgBN
pDggpFgRghZjBFPPnPPFrt
cwTfLwBVwCWbLcVTVVvrdndGjMHrnGJtnttdMC
NTVcWNvcBSpgNqspRQlN
DLDgFlDmNZfjfnJZSF
tctvttzvGGzvrHqtVVdwnJGSSnnjjZdWTdwW
zvpcrbpHpqJJsPbPlLlhmhglPQ
pvHHvssFCFZQNCftttdQdd
VgTGTTVGgLjDjlLGzgPVMTNwmcwQmMQfQtmdcmwMJwNm
TPjTDjfGWTLLljgzrWpZZbsqrFqhqbps
ppVLcfcwSLgpSLVLgWwtfshDNDqvWvGvlQZvDNHQHjqq
MPrzmdRrPPrCJFnMnMRRFRPdqqZQNQvjvZDGDlHhQvGNDG
BmBMBBJTMmPBJMMFCCFJRmrsTlVpVbpwLSVwLsgcwTVlVc
SSGzmFRzmRGLgSSmGMJFnvfvJnJVnJQnMl
cBpjHtjwNfcpNZtppHtCMlMPMlJBVlVQlvJPvJ
dNtNZwqWfqtqZWtHttsqHqrRrrdRTLbmmzSLmTGGmbrg
RrrddnrgnRbbgWdGrfnwgQwjDjDpvTpBQTwBPP
MHCStZJzSwvPjWQD
mcJWVHCCLcGLbdcn
PlMsdjPdGMjdPSrSjgddbLbmHHTszHZzpHmsTFvmpzZzmN
ntRJQVRfcQhcQWhnchBJWntTFTTTNTSpFtztmZFDTpDZ
hQfcfCBSwCccVJhSJnrPPGLqPlbPLCrqldgb
vgvWDMZvGpcqgqsP
tSdtjLHLQLHjdFdDddQSQhwlsGqwQlqqqhQsPhGc
tbRjtTLFRvTZDBrMrV

6
day3/sample_input.txt Normal file
View File

@ -0,0 +1,6 @@
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw

76
day3/src/main.rs Normal file
View File

@ -0,0 +1,76 @@
use std::collections::HashSet;
fn char_to_prio(c: char) -> u64 {
if c.is_ascii_uppercase() {
let ci = c as u8;
return u64::from(ci - b'A' + 27);
} else if c.is_ascii_lowercase() {
let ci = c as u8;
return u64::from(ci - b'a' + 1);
}
0
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
let input = INPUT.lines();
let mut priority_sum: u64 = 0;
for line in input {
let compartments = line.clone().split_at(line.len() / 2);
let items: HashSet<char> = HashSet::from_iter(compartments.0.chars());
let mut new_items: HashSet<char> = HashSet::new();
for c in compartments.1.chars() {
if new_items.insert(c) && items.contains(&c) {
priority_sum += char_to_prio(c);
}
}
}
println!("Priority sum: {}", priority_sum);
let mut input = INPUT.lines().peekable();
priority_sum = 0;
while input.peek().is_some() {
let lines = [
input.next().unwrap().clone(),
input.next().unwrap().clone(),
input.next().unwrap().clone(),
];
for c in b'A'..=b'Z' {
let c = c as char;
let mut count: u8 = 0;
for line in lines {
if line.chars().any(|x| x == c) {
count += 1;
}
}
if count == 3 {
priority_sum += char_to_prio(c);
break;
}
count = 0;
let c = c.to_lowercase().next().unwrap();
for line in lines {
if line.chars().any(|x| x == c) {
count += 1;
}
}
if count == 3 {
priority_sum += char_to_prio(c);
break;
}
}
}
println!("Priority sum: {}", priority_sum);
}

8
day4/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day4"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

1000
day4/input.txt Normal file

File diff suppressed because it is too large Load Diff

6
day4/sample_input.txt Normal file
View File

@ -0,0 +1,6 @@
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8

40
day4/src/main.rs Normal file
View File

@ -0,0 +1,40 @@
use std::{cmp::min, collections::HashSet};
fn main() {
const INPUT: &str = include_str!("../input.txt");
let input = INPUT.lines();
let mut count_complete: u64 = 0;
let mut count_partial: u64 = 0;
for line in input {
let (first, second) = line.split_once(',').unwrap();
let first: (&str, &str) = first.split_once('-').unwrap();
let first: (u64, u64) = (
first.0.parse::<u64>().unwrap(),
first.1.parse::<u64>().unwrap(),
);
let second: (&str, &str) = second.split_once('-').unwrap();
let second: (u64, u64) = (
second.0.parse::<u64>().unwrap(),
second.1.parse::<u64>().unwrap(),
);
let first_set: HashSet<u64> = HashSet::from_iter(first.0..=first.1);
let second_set: HashSet<u64> = HashSet::from_iter(second.0..=second.1);
let smallest_len = min(first_set.len(), second_set.len());
let intersection_len = first_set.intersection(&second_set).count();
if intersection_len == smallest_len {
count_complete += 1;
}
if intersection_len > 0 {
count_partial += 1;
}
}
println!("Partial: {count_partial}, Complete: {count_complete}");
}

8
day5/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day5"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

511
day5/input.txt Normal file
View File

@ -0,0 +1,511 @@
[Q] [J] [H]
[G] [S] [Q] [Z] [P]
[P] [F] [M] [F] [F] [S]
[R] [R] [P] [F] [V] [D] [L]
[L] [W] [W] [D] [W] [S] [V] [G]
[C] [H] [H] [T] [D] [L] [M] [B] [B]
[T] [Q] [B] [S] [L] [C] [B] [J] [N]
[F] [N] [F] [V] [Q] [Z] [Z] [T] [Q]
1 2 3 4 5 6 7 8 9
move 1 from 8 to 1
move 1 from 6 to 1
move 3 from 7 to 4
move 3 from 2 to 9
move 11 from 9 to 3
move 1 from 6 to 9
move 15 from 3 to 9
move 5 from 2 to 3
move 3 from 7 to 5
move 6 from 9 to 3
move 6 from 1 to 6
move 2 from 3 to 7
move 5 from 4 to 5
move 7 from 9 to 4
move 2 from 9 to 5
move 10 from 4 to 2
move 6 from 5 to 4
move 2 from 7 to 6
move 10 from 2 to 3
move 21 from 3 to 5
move 1 from 3 to 6
move 3 from 6 to 9
move 1 from 8 to 9
move 5 from 4 to 5
move 4 from 9 to 3
move 17 from 5 to 1
move 1 from 6 to 2
move 16 from 5 to 1
move 3 from 3 to 6
move 6 from 6 to 4
move 1 from 2 to 4
move 4 from 1 to 2
move 2 from 6 to 2
move 28 from 1 to 3
move 1 from 9 to 7
move 1 from 8 to 7
move 1 from 5 to 4
move 1 from 2 to 6
move 1 from 3 to 1
move 3 from 2 to 5
move 1 from 6 to 3
move 4 from 4 to 7
move 5 from 5 to 2
move 1 from 5 to 6
move 6 from 1 to 3
move 1 from 6 to 2
move 26 from 3 to 6
move 2 from 7 to 9
move 4 from 7 to 3
move 19 from 6 to 3
move 6 from 2 to 4
move 5 from 3 to 2
move 1 from 9 to 7
move 26 from 3 to 8
move 6 from 4 to 3
move 1 from 3 to 8
move 1 from 6 to 7
move 6 from 3 to 6
move 6 from 6 to 4
move 1 from 9 to 2
move 2 from 4 to 9
move 22 from 8 to 2
move 2 from 6 to 5
move 1 from 9 to 1
move 1 from 6 to 5
move 1 from 7 to 5
move 3 from 6 to 7
move 2 from 6 to 1
move 1 from 1 to 5
move 3 from 5 to 9
move 4 from 8 to 4
move 2 from 1 to 4
move 18 from 2 to 1
move 2 from 7 to 8
move 3 from 9 to 5
move 8 from 1 to 9
move 5 from 9 to 3
move 1 from 9 to 8
move 2 from 9 to 4
move 2 from 7 to 8
move 5 from 5 to 7
move 1 from 9 to 3
move 4 from 8 to 4
move 1 from 7 to 8
move 4 from 4 to 3
move 2 from 8 to 3
move 1 from 8 to 9
move 2 from 1 to 8
move 3 from 4 to 5
move 1 from 8 to 4
move 1 from 9 to 3
move 1 from 8 to 5
move 8 from 1 to 8
move 11 from 2 to 9
move 12 from 3 to 5
move 1 from 3 to 9
move 1 from 8 to 5
move 11 from 9 to 3
move 4 from 5 to 9
move 3 from 8 to 7
move 3 from 7 to 8
move 1 from 5 to 8
move 7 from 4 to 3
move 1 from 4 to 5
move 1 from 2 to 8
move 3 from 7 to 6
move 3 from 4 to 8
move 1 from 7 to 9
move 2 from 4 to 7
move 5 from 8 to 1
move 3 from 6 to 5
move 2 from 4 to 2
move 1 from 9 to 4
move 1 from 8 to 6
move 1 from 2 to 9
move 1 from 8 to 5
move 3 from 8 to 4
move 3 from 4 to 2
move 4 from 3 to 9
move 17 from 5 to 9
move 9 from 9 to 6
move 1 from 9 to 3
move 5 from 6 to 3
move 3 from 6 to 3
move 8 from 9 to 5
move 2 from 8 to 5
move 1 from 4 to 8
move 1 from 5 to 3
move 1 from 8 to 5
move 3 from 2 to 6
move 3 from 1 to 4
move 7 from 5 to 1
move 1 from 2 to 6
move 13 from 3 to 6
move 2 from 7 to 8
move 13 from 6 to 5
move 3 from 5 to 7
move 6 from 5 to 6
move 1 from 7 to 6
move 2 from 7 to 3
move 1 from 6 to 8
move 13 from 3 to 5
move 9 from 5 to 9
move 7 from 5 to 7
move 17 from 9 to 2
move 3 from 4 to 7
move 9 from 2 to 9
move 10 from 9 to 3
move 8 from 7 to 8
move 2 from 5 to 3
move 4 from 2 to 6
move 11 from 3 to 9
move 9 from 6 to 5
move 5 from 9 to 8
move 1 from 3 to 1
move 3 from 9 to 1
move 2 from 5 to 2
move 1 from 7 to 9
move 2 from 9 to 4
move 2 from 9 to 8
move 13 from 1 to 8
move 3 from 8 to 5
move 27 from 8 to 1
move 10 from 5 to 9
move 1 from 7 to 2
move 2 from 4 to 3
move 10 from 9 to 6
move 1 from 8 to 7
move 15 from 1 to 9
move 13 from 9 to 5
move 15 from 5 to 7
move 5 from 1 to 3
move 8 from 7 to 1
move 7 from 7 to 1
move 16 from 1 to 8
move 4 from 3 to 9
move 4 from 1 to 7
move 4 from 9 to 6
move 5 from 2 to 7
move 15 from 8 to 6
move 1 from 9 to 1
move 3 from 3 to 4
move 1 from 9 to 7
move 1 from 2 to 7
move 1 from 2 to 7
move 1 from 8 to 1
move 3 from 4 to 8
move 3 from 8 to 1
move 8 from 6 to 8
move 7 from 1 to 4
move 11 from 6 to 8
move 14 from 6 to 5
move 13 from 8 to 7
move 4 from 7 to 5
move 15 from 7 to 4
move 6 from 5 to 4
move 2 from 5 to 9
move 1 from 5 to 2
move 3 from 8 to 5
move 19 from 4 to 7
move 10 from 5 to 8
move 2 from 6 to 8
move 1 from 4 to 8
move 2 from 7 to 9
move 9 from 7 to 4
move 6 from 4 to 6
move 11 from 4 to 8
move 2 from 5 to 4
move 5 from 6 to 4
move 1 from 6 to 7
move 3 from 9 to 5
move 3 from 8 to 5
move 3 from 7 to 6
move 11 from 8 to 7
move 1 from 9 to 5
move 1 from 6 to 8
move 1 from 2 to 1
move 5 from 4 to 9
move 2 from 4 to 1
move 2 from 1 to 4
move 1 from 1 to 9
move 4 from 5 to 1
move 1 from 4 to 6
move 17 from 7 to 5
move 9 from 8 to 7
move 6 from 9 to 7
move 3 from 1 to 9
move 12 from 7 to 9
move 12 from 9 to 5
move 5 from 7 to 9
move 17 from 5 to 3
move 7 from 3 to 1
move 5 from 1 to 5
move 5 from 9 to 2
move 4 from 3 to 5
move 1 from 4 to 8
move 5 from 2 to 1
move 22 from 5 to 9
move 3 from 7 to 6
move 6 from 6 to 9
move 2 from 5 to 4
move 1 from 6 to 3
move 2 from 4 to 1
move 3 from 8 to 2
move 1 from 3 to 4
move 24 from 9 to 1
move 4 from 3 to 9
move 2 from 2 to 9
move 2 from 3 to 1
move 1 from 8 to 6
move 1 from 6 to 9
move 1 from 8 to 9
move 2 from 7 to 4
move 1 from 8 to 3
move 1 from 4 to 7
move 3 from 9 to 8
move 1 from 2 to 1
move 9 from 9 to 3
move 1 from 8 to 7
move 1 from 4 to 3
move 2 from 9 to 7
move 1 from 9 to 3
move 2 from 8 to 4
move 12 from 3 to 8
move 2 from 1 to 7
move 1 from 4 to 3
move 30 from 1 to 5
move 6 from 5 to 7
move 12 from 7 to 2
move 1 from 3 to 4
move 2 from 1 to 3
move 1 from 4 to 9
move 10 from 5 to 7
move 10 from 2 to 6
move 8 from 8 to 3
move 3 from 1 to 3
move 5 from 6 to 3
move 2 from 8 to 5
move 1 from 9 to 2
move 2 from 8 to 6
move 4 from 7 to 2
move 3 from 2 to 7
move 2 from 7 to 5
move 1 from 4 to 9
move 11 from 3 to 1
move 7 from 6 to 9
move 3 from 2 to 3
move 10 from 1 to 7
move 14 from 7 to 5
move 3 from 7 to 6
move 5 from 9 to 7
move 29 from 5 to 7
move 6 from 3 to 9
move 2 from 9 to 7
move 15 from 7 to 5
move 11 from 5 to 6
move 5 from 9 to 5
move 10 from 5 to 8
move 1 from 2 to 4
move 1 from 8 to 2
move 2 from 4 to 3
move 2 from 5 to 9
move 8 from 8 to 9
move 11 from 9 to 3
move 1 from 1 to 8
move 18 from 7 to 3
move 1 from 9 to 3
move 28 from 3 to 5
move 12 from 6 to 7
move 1 from 2 to 9
move 15 from 7 to 2
move 1 from 8 to 1
move 10 from 2 to 9
move 10 from 5 to 3
move 2 from 2 to 3
move 18 from 3 to 4
move 6 from 9 to 4
move 1 from 1 to 7
move 1 from 6 to 4
move 1 from 8 to 2
move 1 from 9 to 4
move 2 from 9 to 4
move 19 from 4 to 3
move 1 from 7 to 9
move 1 from 9 to 7
move 1 from 6 to 8
move 3 from 2 to 8
move 2 from 9 to 5
move 15 from 3 to 1
move 7 from 5 to 1
move 3 from 4 to 9
move 1 from 7 to 2
move 3 from 3 to 1
move 6 from 5 to 2
move 3 from 3 to 9
move 4 from 9 to 2
move 5 from 5 to 3
move 1 from 3 to 5
move 3 from 5 to 7
move 3 from 8 to 5
move 1 from 7 to 5
move 4 from 5 to 1
move 4 from 4 to 2
move 2 from 7 to 8
move 12 from 1 to 6
move 1 from 8 to 6
move 6 from 2 to 3
move 9 from 3 to 8
move 1 from 3 to 4
move 3 from 6 to 1
move 2 from 9 to 2
move 1 from 4 to 5
move 2 from 8 to 3
move 10 from 2 to 1
move 2 from 4 to 7
move 12 from 1 to 4
move 1 from 5 to 1
move 7 from 4 to 9
move 2 from 3 to 2
move 6 from 9 to 2
move 1 from 9 to 1
move 1 from 7 to 8
move 5 from 6 to 7
move 3 from 6 to 1
move 6 from 2 to 3
move 2 from 4 to 3
move 1 from 6 to 8
move 1 from 6 to 7
move 8 from 3 to 9
move 2 from 4 to 5
move 3 from 2 to 4
move 10 from 8 to 2
move 22 from 1 to 9
move 9 from 2 to 4
move 1 from 1 to 3
move 1 from 3 to 2
move 3 from 2 to 4
move 2 from 7 to 1
move 14 from 4 to 2
move 2 from 1 to 8
move 2 from 4 to 5
move 4 from 7 to 8
move 24 from 9 to 6
move 3 from 5 to 9
move 1 from 9 to 8
move 1 from 5 to 2
move 1 from 6 to 7
move 6 from 9 to 1
move 1 from 7 to 3
move 5 from 8 to 6
move 9 from 6 to 3
move 4 from 1 to 4
move 2 from 1 to 2
move 11 from 6 to 3
move 13 from 3 to 2
move 2 from 9 to 8
move 8 from 3 to 8
move 2 from 8 to 5
move 1 from 7 to 5
move 3 from 6 to 3
move 11 from 8 to 5
move 13 from 2 to 4
move 10 from 5 to 2
move 2 from 3 to 4
move 2 from 5 to 7
move 15 from 4 to 9
move 2 from 7 to 4
move 2 from 4 to 2
move 2 from 4 to 9
move 2 from 4 to 2
move 1 from 3 to 8
move 1 from 8 to 1
move 1 from 1 to 2
move 1 from 6 to 3
move 7 from 2 to 4
move 1 from 5 to 3
move 7 from 9 to 1
move 7 from 1 to 2
move 4 from 6 to 9
move 12 from 9 to 7
move 6 from 7 to 5
move 1 from 3 to 5
move 7 from 4 to 7
move 3 from 7 to 8
move 3 from 8 to 6
move 18 from 2 to 9
move 7 from 2 to 3
move 15 from 9 to 4
move 3 from 3 to 9
move 1 from 3 to 1
move 3 from 5 to 4
move 1 from 1 to 2
move 1 from 9 to 2
move 2 from 6 to 2
move 5 from 7 to 6
move 5 from 2 to 7
move 3 from 3 to 4
move 5 from 5 to 3
move 6 from 7 to 4
move 9 from 4 to 2
move 18 from 4 to 9
move 6 from 2 to 1
move 1 from 1 to 9
move 4 from 7 to 4
move 7 from 2 to 4
move 1 from 2 to 8
move 1 from 4 to 2
move 4 from 3 to 4
move 16 from 9 to 5
move 9 from 9 to 8
move 1 from 9 to 7
move 4 from 1 to 2
move 2 from 5 to 4
move 10 from 5 to 4
move 4 from 2 to 1
move 5 from 1 to 2
move 1 from 8 to 5
move 1 from 6 to 5
move 4 from 8 to 5
move 2 from 6 to 9
move 3 from 6 to 2
move 2 from 9 to 1
move 1 from 7 to 6
move 1 from 3 to 8
move 9 from 5 to 9
move 4 from 8 to 1
move 2 from 8 to 2
move 1 from 5 to 7
move 9 from 9 to 8
move 1 from 7 to 5
move 9 from 8 to 2
move 6 from 1 to 6
move 6 from 2 to 6
move 10 from 2 to 5
move 5 from 2 to 1
move 1 from 3 to 5
move 8 from 5 to 4
move 5 from 1 to 3
move 10 from 6 to 8
move 3 from 6 to 9
move 4 from 3 to 1
move 5 from 8 to 2
move 4 from 5 to 9
move 1 from 3 to 7
move 1 from 7 to 3
move 1 from 8 to 6
move 1 from 6 to 1
move 15 from 4 to 8
move 5 from 9 to 2
move 1 from 9 to 1
move 1 from 1 to 3
move 6 from 4 to 8
move 12 from 8 to 7
move 1 from 3 to 5
move 3 from 1 to 9
move 13 from 4 to 9
move 5 from 7 to 2
move 1 from 5 to 4
move 8 from 9 to 5
move 6 from 2 to 5
move 2 from 5 to 6

9
day5/sample_input.txt Normal file
View File

@ -0,0 +1,9 @@
[D]
[N] [C]
[Z] [M] [P]
1 2 3
move 1 from 2 to 1
move 3 from 1 to 3
move 2 from 2 to 1
move 1 from 1 to 2

78
day5/src/main.rs Normal file
View File

@ -0,0 +1,78 @@
fn print_stacks(stacks: &Vec<Vec<char>>) {
for stack in stacks {
println!("{:?}", stack);
}
}
fn stacks_message(stacks: &Vec<Vec<char>>) -> String {
stacks
.iter()
.map(|v| v[v.len() - 1])
.fold(String::new(), |mut s, c| {
s.push(c);
s
})
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
let chunks = INPUT.split_once("\n\n").unwrap();
let mut stack_lines: Vec<String> = chunks
.0
.lines()
.map(|x| -> String { x.to_string() + " " })
.collect();
stack_lines.pop();
let num_stacks = (stack_lines[0].len() + 1) / 4;
let mut stacks: Vec<Vec<char>> = vec![Vec::<char>::new(); num_stacks];
for line in stack_lines.iter().rev() {
let mut line = line.to_string();
line += " ";
for i in 0..num_stacks {
let c = line.chars().nth(i * 4 + 1).unwrap();
if c.is_whitespace() {
continue;
}
stacks[i].push(c);
}
}
let stacks_copy = stacks.clone();
let move_lines = chunks.1.lines();
for line in move_lines {
let split: Vec<&str> = line.split(" ").collect();
let n: usize = split[1].parse().unwrap();
let from = split[3].parse::<usize>().unwrap() - 1;
let to = split[5].parse::<usize>().unwrap() - 1;
for _ in 0..n {
let x = stacks[from].pop().unwrap();
stacks[to].push(x);
}
}
print_stacks(&stacks);
println!("Message: {}\n", stacks_message(&stacks));
let mut stacks = stacks_copy;
let move_lines = chunks.1.lines();
for line in move_lines {
let split: Vec<&str> = line.split(" ").collect();
let n: usize = split[1].parse().unwrap();
let from = split[3].parse::<usize>().unwrap() - 1;
let to = split[5].parse::<usize>().unwrap() - 1;
let len = stacks[from].len();
let mut x: Vec<char> = stacks[from].drain(len - n..len).collect();
stacks[to].append(x.as_mut());
}
print_stacks(&stacks);
println!("Message: {}", stacks_message(&stacks));
}

7
day6/Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "day6"
version = "0.1.0"
edition = "2021"
[dependencies]
queue = "0.3.1"

1
day6/sample_input.txt Normal file
View File

@ -0,0 +1 @@
stftmtvvtvqqczqqnjnwwlqqdzdnnsvnsswbbwsstvvssfjsjbjfjmjpjzpplpppjzjqqdzzhqqqqtcccbzzzwzrrrdqdldpdsppmqmmnwwjddnqqscclncllvhllqpllchhbccfcbcgbcgcfcncsnstsddldzldlmljjfbjbzbccmrmrppqmqsswbwqwdwwcnwwhrhppfsfvsvrrfllhglhlggjpggzjgzggnvvqfvvhffpwpmwpmmwvmvrmrbmbzmzbbvgbbcfbcfbfppnzpzrrszzqgzgjgddmdwmwrmwmzznqzqhqhvvsslppsrrljjfpfcpfpbbrjjwjmjpmpfmfzfvzfftptzzbmzmddpvdddqmmzjzbbhmmwqmmmbgmmttrhrqrvqvzvdvzdvvmsvmmqlmmtddvlvttrtvtvcttvssnwwbccqmmgbbqrqlqjllmslsmslltrtffzfpfzpffvwvffsllgvgtgwtwnttfzznzqzztfzfvzznnwzzcvcqvvdwwsnsvnnthhnphpssmjmfmhfmhmgmllmsmrsrrmmhsswjwqqdbbghhpsptsswvsvfvcffqcchlhfhvhjhdjhddvjjpmmsrsqrrngrrmvmsvsllrmlrlprpggqzqmmvlvvwrwnrwwzztrzrbrdbrdbbhlhchjchhtthpthphplhhlphpjjsddtppvbpbbmnmgnmmqbbrhhfrfpfjpjgjljcctwtmwtwvvvmsvmmnjmnjmnmqmvvggtzzctzttszsvvjwjqjmjbjvbbshbhghlghhpvpnvvqmmgjmmggqvqtvqtvqtvvmlljbbhdhshnnwqwbbrnnwswmwfmfttjztjzjsjzjdjbdjjzfzdzgzhghgpgqqdzdhhnwnjnnhrnrqqjsqsllbzzzcnzzmjmvmrvrgrfgrrqmrmpmpzmzqqfwqfwfjjhphgpptzzwmmfjjvbjvbbqsbsbcbppjzpjjzpjpvjjzdjjgcgppvrvjrjpjspjppntpnnjlnlrnrdndjnnsbnnppvspprbrddjrdrmrfmmtmtbtntftjjsscvcbvvcnccnbnrbbmlmddhpdptddmrmmjddnjjtztctqqhhttqctqtbbnfnwnmndnzzljlgltgltljtjllwjjbrjbrbpbgppmzpmpggdnnmznnhhmfhhssgtgvvlsljltlppdqqbtbvbsvsswbsbhsbsmmwswbbbbhvbvcbvvsvcsvvmfmlmgmjgmmbqbrbsrrgrsggldlmlttpbpmmtptctqcqvccnhnmnssmvsmmddlclpccfwfdfqfvqfvfqqwmmwrmmbzznpnllfttgcttnbtnnsswttfppnddpdpsphhpttnrtrlrsrmrnmmzhmhnmnwwddmhdhqqhbqqdcclnlfnnzfnzzqfqddczcqcrrjsrrswslltfltffjhhqqfcchqcqpplbltbblbcbncnpccdffcwwqzwqqlwwtjjpbbjvvljvjgvvrsszfsfcssqsvvwsvvdfvdfdpffztzrtzthzhhmwmzwzssjlsldsldsldlvvjdvvnbvnvmvmccvfcvcfcbchhzqqhgqqcbbhdbdpddwcdwwzszsfszzgbgdgzgvgsgnssfqsqjssrppsgppmmpzmppglgqlqqpzpqqfzzzrnzrnrqqzzfwzzffjfzzmnznpznpprhhvcvvvfddcrdrsscnnsznzszbznntwntnrnbnzzrnnlwlggnzzwppmbmrrncnlclzltlblhhlvhvphhsdhsdsqddgzgvvshvvzzbvbrrlplqpptplljcljlvjlvlqvvndnsdddmvddzhzjjgpjpddppzllwtwfwgfgpffmhhzllsttmqqhjhhpvpgpfjsgscnwjmwmtmptwlpfjljwgpgntrlpjfgbjqmcpzgfhrwmznqnsbpptbdrzmdtvvtdqjgrjzlphndhmlchvddglqnqsjqrfqslprsvlqjwqnsmsznptsstpvdntpttslpmqqbsdlqwpjqnzmpblgqmjrvqwsncnzdszgfsghddlnwhwzpgtddgstttvrjfjwwfrgsdjjngljqlqcrzlgsmwngbzvmjwtnqdqcgwmfhsztgrtvvfzbtstmdbqpntdpsszjthqvpbdwswfzvmrcpbgbgdmldfhvdpfsmdzfhwsrpcglsztdwqgbqszcqtqjhgntzvttldqsffftzmllptzhmhpmfsgcchfrnrchnsgcfjbgrqmvrmmhnmlnwtgwhznqfgwnlrqlpjrvfrgzcjwncvlwhpclfzngbgvmrmlzngmqlvvwhbpjzlclgrcnnvnlppqhvlrnpzvmtsbdpfbwgffgzfwvltcfvfdcnfhwvcvclwwbmshhmpgrzgltwjmqczpqzdwfjpqhmwqhvvgnpgtwrjrgwvhthtdrdpnwpbmwstgblwmbfvlwflqmfbcsgwstwvncwfcsmrpcfrrvmlbqhdtdswswfnzhgzlngwsrtlzfcgdppmjnghfrgbdqhqmslhcqddjvsslsjwqqznttqjzdlghnsvqqtwrpfbzjgwnrhhvlnbqmnvcpblzgbzltnrhzpdwvbqbtmctbzgsdjfzswrbqbzgvwjlwtmgcllnmnwcljbhbplpvtgpgjftfrbgpgmhghnjcgjfqmsbqhbgtzbfzgwmfdsgfgmgzsbgdrszfhjttbvcqjzjgbqfgswlmrrhnmnfrptvjtlnvplgznsljzfzmhghlsccnqzflfnmbhshfprhclmtfptcmtnhrjgnngnqnczvcgzzlntftjsbgpgwzbnrhzzfqmznqnzfrvjzsmtpjbswzjlbgpfftzrzbfgdblpwscbqjfrfmfnhhlhjprtlzzvwnwzsnqhnmgwsdprnrblgbclzhthftqzdljspwdzwmwhfmdzmlvqsngppdfsjdprbrhffcvcvzztjjqcffwbrvpzvzfzhjvsfvsnrmjvqmjtrjbmbqsdtjgvtbbzzfmnmrrflgcdtljpmpvqvdbzgbmhjgccgdtplllctzqpfqnsztbwdbmqgfzrcddtmwrgmwsghcfpgqssdjrtqhtjfbpjvjdnzgvpzrhbrhrhcmpbglbbrvdltdpsrwjbjzftccwgnqmnlqlpjwrfdvmlgvgqznlvsmpzsmgjstvqbqpprzlsdndpfbmqcrfgvcfvlfhmpfnnqlcqlnbbgcrrrhbtzwnwmfrnrzvgmqlmqnmnzbwflwzcmncphjqztlrzvpztqhptmfsrppvvlzcfnlrwptgccsjjjscjcwnzssmbcvtzhnscgsbrchbqbrtdzllfvmqfwznfzpzmbfwcdsfhdlddnfbdgqbqjqzdtppshwcvvcjqstdgtgbhmlqlrfrhbvfsszsmbldmwfnfgnjptdslnzwcjgmvbnqcfzjmrslrlllplbhpjcnvzmvrfzwqhmbnrvpqnvcfncgfwqlvcwpwwljssfmswctcmhgtphvjdpfnnzznfbdjcsndrczlgdjhrnrltsgbtqmqcbwlthwcgsbvqbnntcznczpmlmblwdrlmzqdztwsgjthjwtfcpgwbczmdmhttzcwvdzhdfldmwnbnfdcjgvjhrfltjnjhqhzmzrlbncwdnlgshmqhpgsdwbvmvjsfgvgqzqjqdzqzmfmrncfdgrqfrnstvpqwtltnhgrmhgmmnwvlnsfmmbjrdmrnlgfgpqncdpqgvjltpghbgffdppdcfhdqhtvrdnfvcttlrqppfnqtmzpfgsnmjqfrgtbbdzzrccsrzgfjndlrnzqmjjtgldglcpzcrhwfplvdndjtzbpfbbbpfljqnlvrdzbrvczzwdrvzlmslbjsqgqdrltmhwcdpldqldlpctcbjmsvdwlfspzlpgrhdrvjtprcwrmszvzwmmjgvsbfcztmrdgrgshgtggpzszgqhwmhdzjmzsgqsfmqvcgqqwgprgvvqlbfhpwsfbjdqtcfnfhsgzthzhbpwggbnscqbnvcdprsbgllsrdcclqggfgfdrpqlqljfwpmzdhthpczcsqrrm

31
day6/src/main.rs Normal file
View File

@ -0,0 +1,31 @@
extern crate queue;
use std::collections::HashSet;
use queue::Queue;
fn main() {
const INPUT: &str = include_str!("../sample_input.txt");
let mut buf: Queue<char> = Queue::with_capacity(4);
let mut msg_buf: Queue<char> = Queue::with_capacity(14);
let mut found_start = false;
for (i, c) in INPUT.chars().enumerate() {
if buf.force_queue(c) == 4 && !found_start {
let x = HashSet::<&char>::from_iter(buf.vec().iter()).len();
if x == 4 {
println!("{} {:?}", i + 1, buf);
found_start = true;
}
}
if msg_buf.force_queue(c) == 14 {
let x = HashSet::<&char>::from_iter(msg_buf.vec().iter()).len();
if x == 14 {
println!("{} {:?}", i + 1, msg_buf);
break;
}
}
}
}

9
day7/Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "day7"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
petgraph = "0.6.2"

1020
day7/input.txt Normal file

File diff suppressed because it is too large Load Diff

23
day7/sample_input.txt Normal file
View File

@ -0,0 +1,23 @@
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 ks

83
day7/src/main.rs Normal file
View File

@ -0,0 +1,83 @@
use std::borrow::BorrowMut;
use petgraph::dot::*;
use petgraph::prelude::*;
use petgraph::*;
fn do_weights(g: &mut Graph<(String, u64), ()>, root_dir: NodeIndex<u32>) {
for edge in g.clone().edges_directed(root_dir, Outgoing) {
let mut target_weight = g.node_weight(edge.target()).unwrap();
if target_weight.1 == 0 {
do_weights(g, edge.target());
target_weight = g.node_weight(edge.target()).unwrap();
}
g.node_weight_mut(root_dir).unwrap().1 += target_weight.1;
}
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
let mut g = DiGraph::<(String, u64), (), u32>::new();
let invalid_index: NodeIndex<u32> = NodeIndex::from(u32::MAX);
let mut curr_dir: NodeIndex<u32> = invalid_index;
let mut root_dir: NodeIndex<u32> = invalid_index;
for line in INPUT.lines() {
if line.starts_with("$ cd") {
let new_dir = &line[5..];
if new_dir == ".." {
curr_dir = g
.edges_directed(curr_dir, Incoming)
.next()
.unwrap()
.source();
} else {
let prev_dir = curr_dir;
curr_dir = g.add_node((new_dir.to_string() + "/", 0));
if prev_dir == invalid_index {
root_dir = curr_dir;
} else {
g.add_edge(prev_dir, curr_dir, ());
}
}
} else if line.starts_with("$ ls") {
continue;
} else {
let (size, name) = line.split_once(' ').unwrap();
if size == "dir" {
continue;
}
let size: u64 = size.parse().unwrap();
let n = g.add_node((name.to_string(), size));
g.add_edge(curr_dir, n, ());
}
}
do_weights(g.borrow_mut(), root_dir);
println!("{:?}\n\n", Dot::with_config(&g, &[Config::EdgeNoLabel]));
let total = g
.node_weights()
.filter(|(n, w)| n.ends_with("/") && *w <= 100000)
.map(|(_, w)| w)
.sum::<u64>();
println!("total: {total}");
let used_space = g.node_weight(root_dir).unwrap().1;
let free_space = 70000000 - used_space;
let need_to_free = 30000000 - free_space;
let delete = g
.node_weights()
.filter(|(n, w)| n.ends_with("/") && *w > need_to_free)
.map(|(_, w)| w)
.min()
.unwrap();
println!("delete size: {delete}");
}

8
day8/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "day8"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

99
day8/input.txt Normal file
View File

@ -0,0 +1,99 @@
112121202020313300020340412130241443213110212555412551412441344012102310202342110301131001201210222
002220000133232333300400324440200340331442222154322435351134115104433131022400301210231103320120102
002111110023312202140422121302301411425412143121451113531553512221212012141140202223332010130102121
200121112032232121304410232442313124341433152252314544515325125233341244332012020324021110233002001
201022212100303122230042110420411144235142233535353242115241433555244414021310121244221013322222121
011133013013221340022444040034222334222333233513241314324332525223122512421234021412140011030323220
210300120303001122232014221422523555232331235422254211412225214325215241553042040303041423101011002
003120002332341304133020544511125535535541345465624233512532523153125344553310344313112440310203011
131130201012400142322154551413323211211264453362355545322422255141341455331312144311201120100013210
231231113320032112042452344144421222532325455233246353364224262633314514222114310222010411123020310
130132323324003111222144335255232253526222366424453236522644225645542113443452221300403213402211010
113120324042321002433123114511424246663652545323562652666642343346224141215312351154031420431123313
322103103420203222134243312435226546235454342354423362646633563243445363453321134444313221424211210
222002200102244012425542311135622554533554536552565362325262535422342364211432245513321404214403103
020312030211000311145233135522425335364263235236633766423525523653365556233412434131421431421413032
210200210122104332244324435223345455654634767746775377345346266325246256554325112245151433442112120
122021103003325452113155263653362555455536744343555667465337737332644556355541512314415321432122010
302130331324344154351152233526435626553676357536566754666777544543643553226655255322235341014410100
314012231321215344153565545233452474545654556345434346477343637634766266254223421545221444103004003
203142142342444551513532553564436657337357765377547636675373434576744336526346456543411441023143110
012342201025331211122452444533576366457663645436375557334447647673566472636623645223251551503132201
242040141354332534632526224223663666376753663766575676333754654644753446365223356333455541211334020
304212105422512243642223324443434437444774475647656876467367634464365546355325563651434541552020333
411420043555145455366465334765477455434665856478775445748748844536643753776566362432434143454420144
401414045521554536566434665734634475568447478784884574576588667675763475753664255466323144315114340
403203444553445263226363636763747365744764846865845556768875448846334555367546232343531522434303222
320101251535223652234326457665537657586786457478765885578775686476536463546335334642346321452233131
101012145413152534234557444577344864876885844857544755664447444658566665757343254462522531514251101
340341152532244444232667437647346678855466568676685668454547775878787354745333434364264512332351234
034022314552563333466574354365446884777648857896869775765876486687448874547744636623356245124411300
434115222252325233267546336767445666887887795778879879888964665878876674757366746353365644321332143
312035533543623363556753755356877487485687695957956976755556874674844755665746737526623244522514143
420252322135326524253347754684544485747997555758865876756898776645768885645667637664454254124241132
042551521433445422576644675485868857686859585876589677967989879564666758475665333623554365252143351
404455122524562436436545777675857467559889565668857859685895859976758774886545433533522546412531113
402414213444443632667535548848565847669657785977756989557799965677887465558473374753636263414433431
022221152324544456367356377556875457665895668676988667859858876695687554757534736365524353324555445
344111222625453364363635787885744595658769866898866968696568596595864444764473337656423523432142535
225434342232366345537763675578769565995877778767697786787965759585779855884865343633323444422312351
035315413543653543334365848874759855766697967679779767999679566665785768858653734543735645643221454
023235144645352563656735676476699588575688669887679986967789786578779847658656675663653453233341153
142225254342433566337738656784888579869898976766696886867989878587588888556744335476656546565134514
332531546644465434575456856855557977598878768976688677796996689765566874765455375433552656652141222
245115244422246534474538846486987698857687868676878977996687768986655856867454644744464462545223145
534255233266234565357356454786989999898896977688879977977896669857699764786566736463343326443154122
454354332542262477736688458567665797769979688789788788987866776769877696655848467435475444463335241
512543144352562655357675475585978965976868699798788899789679876985786899685774865763673624244331431
324412256535565334657448674688895886877986668889799998798889878866685759475645457456546355544251525
115513233345333374765468446775577596767887988887878879877777968697669577748775734356333445243551434
415151565352224735474558556859799577886898999998979889789968896887667799778755865475767222365331232
341542233524534557363486747546566765697666978897898998779776898687767558456588645347447452326635211
141352533235633637755547684876556558796988688897999988799797887989695558885678545676777233242514541
521224242633256545773565667556868787766779689977797878779776688978856968445584875373474655564453414
212223344626635634464468564667887899889688667779987877977666888978896755878447456437466626246242154
234115532222663767644584477756969899977977999989879987999976887779867996588585775466444223626514313
135352514355535475547475454586885687868789797787897877999696989878678658675857877374766244666335415
245312112534242364465384488548568678767769779778898997999876767795755964548464847565732454524524223
021525515246626734753566444568597959566979986967678896977989678777787774766445653374342254643512525
154333554224543664547576668488558779569899998698676696676768688689695868756558334756732443435414211
241121123663636476553777547778679898575887899887676677898688967655685877474554463766356464665314411
042314546263224256647665654464888598856776787699868899986977858568579785688458575346453652462152344
123331145253442347344577548844655756795759896669869969898669978977675445684486336563564633463521424
441245214645233266655474685847446687769676869796966869876898656576557445456865677774743333555121233
125144145355562535553453348876854556596588579796889867979959976599967847546665344765436664421452124
005214145522463625374665767445668477766757899558986688996855569799556464475877546663265544522533142
424213534345444245575767446587747766879868999866679969656557796695754688786576454364542222333552433
340123443165235626753533465668444668759977876797965776795859756987877778467766435676633663325451242
003233434214334366657377335845776467875798576979767697579687977648857565845364473624435244552521232
424135233343456444347333753548856886767998675667957686789866998677467875563746577654546663332345512
142144412143652453363555366356464857764776776669865675576766767657655474454367647255355333454132411
114044434535536365647343757563768767554848877759975798758895468485667587677463336535634542315521124
243044411234356654655645476665375787765667655868887868786658648788875454747665334553525245122313313
223005135155362266463337346655467578858875455446758445778678456564555447754654655642444335244151100
441031313535133543536645563565447868478877557885475885785484588664864367437333352334646552545540434
230403434533122325663365655775564467566764578557546875654785658764434354637753535553443132323132432
231103055415354435244636576576467643575457665666647886566848556463753663346723326243525141135130424
234240311433354434253255264577573744567747565865655865884455858675735663776644624454624322251114322
001140425351442116425436424534333635755754445857766654848476464365374745573246334553145131221240002
423442125121142242554242262463344446436337646568454446465366647477574476743566434562422322213241112
041120244223522424262622532426564364336575645645643473455773734743736536462532635531424223442140002
333213342044141312256465444645743463747737775353476574446663366477433766453534634424144243324342330
123301211302132311214446544655333545346646756574364363763577337443636433244534466131243245142313041
333302233005545533332445234232634365637756745756665533337455656536362324645335641322232425441330441
210101031320143231223346443232362353735643457655456457447337655745423533326242244322432513011341141
103110441134453455534214566635432365634456656643365735556363677266633236436433421143354400234124322
210103104441245232113425543552436226532532734735737666776674646353226636524623254312414101401413013
020024442231000453252454154546643563663622535463445755356246553442265263346551444421542422240011133
031020232402201014325415255432463233224332466352332362464633465245446636555422514435430143120003112
310302320413232125411435155524536333442626366353663655223253243262552253454113353253031242202102210
221201232400342023452154554354353535536252463345626432342652363255555242425543353242440134432103103
210032311140434341431423452253535242446256556466223466635264232223251545121524142114121403343313003
120033031102121020314222514435233222253442525525522546426665636231521441532113451340400133032210231
210023013101112320231215311434153455555125335452263535435665554254354533423243412221004001101231111
221223223131114201030343552243332413432225514566333324653532145252122232542252133334211422030222312
222331111212014202022011214444443411412221134525134425141412252142514152354243232311422120203312310
110131122101302404410231242111542122454123223331222324435451342542314134420104111021220102332003000
201221202213022021032201013424223253221544343453433115235543553513232252242121443333323311020103222
001200323302010132410244321011414224212135145444322543324442532241244022442341044312322333033210110
012221120210002201233041204141124034134123443133233422423453224352410321301023102020300131022311221

5
day8/sample_input.txt Normal file
View File

@ -0,0 +1,5 @@
30373
25512
65332
33549
35390

85
day8/src/main.rs Normal file
View File

@ -0,0 +1,85 @@
use std::borrow::BorrowMut;
fn directional_scenic_score(seen: &Vec<i16>, height: i16) -> u32 {
(match seen.iter().rev().position(|x| *x >= height) {
None => seen.len(),
Some(x) => x + 1,
}) as u32
}
fn main() {
const INPUT: &str = include_str!("../input.txt");
let mut grid: Vec<Vec<(i16, bool, u32)>> = Vec::new();
for row in INPUT.lines() {
grid.push(Vec::new());
let r = grid.last_mut().unwrap();
for col in row.chars() {
r.push((col.to_digit(10).unwrap().try_into().unwrap(), false, 1));
}
}
for row in grid.iter_mut() {
let mut max_seen: i16 = -1;
let mut seen: Vec<i16> = Vec::new();
for tree in row.iter_mut() {
tree.2 *= directional_scenic_score(&seen, tree.0);
seen.push(tree.0);
if tree.0 > max_seen {
max_seen = tree.0;
tree.1 = true;
}
}
max_seen = -1;
seen.clear();
for tree in row.iter_mut().rev() {
tree.2 *= directional_scenic_score(&seen, tree.0);
seen.push(tree.0);
if tree.0 > max_seen {
max_seen = tree.0;
tree.1 = true;
}
}
}
for i in 0..grid[0].len() {
let mut max_seen: i16 = -1;
let mut seen: Vec<i16> = Vec::new();
for j in 0..grid.len() {
let tree = grid[j][i].borrow_mut();
tree.2 *= directional_scenic_score(&seen, tree.0);
seen.push(tree.0);
if tree.0 > max_seen {
max_seen = tree.0;
tree.1 = true;
}
}
max_seen = -1;
seen.clear();
for j in (0..grid.len()).rev() {
let tree = grid[j][i].borrow_mut();
tree.2 *= directional_scenic_score(&seen, tree.0);
seen.push(tree.0);
if tree.0 > max_seen {
max_seen = tree.0;
tree.1 = true;
}
}
}
let n_trees_visible = grid
.iter()
.map(|v| -> usize { v.iter().filter(|(_, vis, _)| *vis).count() })
.sum::<usize>();
println!("{n_trees_visible}");
let max_scenic_score = grid
.iter()
.map(|v| v.iter().map(|(_, _, score)| score).max().unwrap())
.max()
.unwrap();
println!("{max_scenic_score}");
}

9
day9/Cargo.toml Normal file
View File

@ -0,0 +1,9 @@
[package]
name = "day9"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
nalgebra = "0.31.4"

2000
day9/input.txt Normal file

File diff suppressed because it is too large Load Diff

8
day9/sample_input.txt Normal file
View File

@ -0,0 +1,8 @@
R 5
U 8
L 8
D 3
R 17
D 10
L 25
U 20

64
day9/src/main.rs Normal file
View File

@ -0,0 +1,64 @@
use std::collections::HashSet;
use nalgebra::base::Vector2;
type IVec2 = Vector2<i32>;
const RIGHT: IVec2 = IVec2::new(1, 0);
const LEFT: IVec2 = IVec2::new(-1, 0);
const UP: IVec2 = IVec2::new(0, 1);
const DOWN: IVec2 = IVec2::new(0, -1);
const ZERO: IVec2 = IVec2::new(0, 0);
fn main() {
const INPUT: &str = include_str!("../input.txt");
let mut visited: HashSet<IVec2> = HashSet::new();
let mut knots: [IVec2; 10] = [ZERO; 10];
for line in INPUT.lines() {
let (dir, steps) = line.split_once(' ').unwrap();
let dir: IVec2 = match dir.chars().next().unwrap() {
'R' => RIGHT,
'L' => LEFT,
'U' => UP,
'D' => DOWN,
_ => ZERO,
};
let steps: u32 = steps.parse().unwrap();
for _ in 0..steps {
*knots.get_mut(0).unwrap() += dir;
for i in 1..knots.len() {
let diff: IVec2;
{
let knot = knots.get(i).unwrap();
let prev = knots.get(i - 1).unwrap();
diff = *prev - *knot;
}
let knot = knots.get_mut(i).unwrap();
if diff.x.abs() > 1 || diff.y.abs() > 1 {
// need to move
if diff.x == 0 {
knot.y += diff.y.signum();
} else if diff.y == 0 {
knot.x += diff.x.signum();
} else {
knot.x += diff.x.signum();
knot.y += diff.y.signum();
}
}
if i == 9 {
visited.insert(*knot);
}
}
}
}
println!("{}", visited.len());
}