mirror of
https://github.com/Ajetski/advent-of-code.git
synced 2025-09-30 07:03:19 -09:00
do day 7
This commit is contained in:
parent
2e8c82ce50
commit
545aa9e1fc
1105
2022/input/day_7.txt
Normal file
1105
2022/input/day_7.txt
Normal file
File diff suppressed because it is too large
Load Diff
23
2022/input/day_7_sample.txt
Normal file
23
2022/input/day_7_sample.txt
Normal 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 k
|
93
2022/src/day_7.rs
Normal file
93
2022/src/day_7.rs
Normal file
@ -0,0 +1,93 @@
|
||||
#[derive(Debug)]
|
||||
struct Command {
|
||||
input: String,
|
||||
output: Vec<String>,
|
||||
}
|
||||
#[derive(Debug)]
|
||||
struct File {
|
||||
location: String,
|
||||
size: i32,
|
||||
}
|
||||
type Data = Vec<Command>;
|
||||
type Output = i32;
|
||||
fn parse(input: &str) -> Data {
|
||||
let mut data = vec![];
|
||||
for line in input.lines() {
|
||||
const CMD_START: &str = "$ ";
|
||||
if line.starts_with(CMD_START) {
|
||||
let (_, cmd) = line.split_once(CMD_START).unwrap();
|
||||
data.push(Command {
|
||||
input: cmd.to_string(),
|
||||
output: vec![],
|
||||
});
|
||||
} else {
|
||||
data.last_mut().unwrap().output.push(line.to_string());
|
||||
}
|
||||
}
|
||||
data
|
||||
}
|
||||
fn get_dir_sizes_and_files(data: Data) -> (Vec<i32>, Vec<File>) {
|
||||
let mut files = vec![];
|
||||
let mut dirs = vec![];
|
||||
let mut cwd = vec!["/".to_owned()];
|
||||
for c in data {
|
||||
if c.input == "ls" {
|
||||
let cwd = cwd.join("/");
|
||||
for line in c.output {
|
||||
let (left, right) = line.split_once(' ').unwrap();
|
||||
if left == "dir" {
|
||||
dirs.push(cwd.clone() + "/" + right);
|
||||
} else {
|
||||
let size: i32 = left.parse().unwrap();
|
||||
files.push(File {
|
||||
size,
|
||||
location: cwd.clone() + "/" + right,
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if c.input.clone().starts_with("cd") {
|
||||
let (_, loc) = c.input.split_once(' ').unwrap();
|
||||
if loc == ".." {
|
||||
cwd.pop();
|
||||
} else {
|
||||
cwd.push(loc.to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
(
|
||||
dirs.into_iter()
|
||||
.map(|curr| {
|
||||
let mut sum = 0;
|
||||
for file in &files {
|
||||
if file.location.starts_with(&curr) {
|
||||
sum += file.size;
|
||||
}
|
||||
}
|
||||
sum
|
||||
})
|
||||
.collect(),
|
||||
files,
|
||||
)
|
||||
}
|
||||
fn part_one(data: Data) -> Output {
|
||||
let (dirs_sizes, _) = get_dir_sizes_and_files(data);
|
||||
dirs_sizes.into_iter().filter(|size| size <= &100_000).sum()
|
||||
}
|
||||
fn part_two(data: Data) -> Output {
|
||||
let (dirs_sizes, files) = get_dir_sizes_and_files(data);
|
||||
let total: i32 = files.iter().map(|f| f.size).sum();
|
||||
dirs_sizes
|
||||
.into_iter()
|
||||
.filter(|size| 70_000_000 - total + size >= 30_000_000)
|
||||
.min()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
advent_of_code_macro::generate_tests!(
|
||||
day 7,
|
||||
parse,
|
||||
part_one,
|
||||
part_two,
|
||||
sample tests [95437, 24_933_642],
|
||||
star tests [1_348_005, 12_785_886]
|
||||
);
|
@ -5,3 +5,4 @@ mod day_3;
|
||||
mod day_4;
|
||||
mod day_5;
|
||||
mod day_6;
|
||||
mod day_7;
|
||||
|
Loading…
x
Reference in New Issue
Block a user