mirror of
https://github.com/cupcakearmy/advent-of-code.git
synced 2024-12-21 15:46:28 +00:00
day 2
This commit is contained in:
parent
406b6fd197
commit
f1755e2bd3
11
2023/02/README.md
Normal file
11
2023/02/README.md
Normal file
@ -0,0 +1,11 @@
|
||||
# 02
|
||||
|
||||
Learned about callbacks in rust.
|
||||
|
||||
<details>
|
||||
<summary>Solutions</summary>
|
||||
<ol>
|
||||
<li>2348</li>
|
||||
<li>76008</li>
|
||||
</ol>
|
||||
</details>
|
106
2023/02/rust/main.rs
Normal file
106
2023/02/rust/main.rs
Normal file
@ -0,0 +1,106 @@
|
||||
#![feature(test)]
|
||||
|
||||
use std::cmp;
|
||||
|
||||
extern crate test;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use test::Bencher;
|
||||
|
||||
#[bench]
|
||||
fn bench_a(b: &mut Bencher) {
|
||||
b.iter(|| part_a(INPUT));
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_b(b: &mut Bencher) {
|
||||
b.iter(|| part_b(INPUT));
|
||||
}
|
||||
}
|
||||
|
||||
const INPUT: &str = include_str!("../input.txt");
|
||||
const TEST: &str = include_str!("../test.txt");
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Round {
|
||||
red: usize,
|
||||
blue: usize,
|
||||
green: usize,
|
||||
}
|
||||
|
||||
fn max_for_game(s: &str, calc: impl Fn(Round) -> usize) -> usize {
|
||||
let max = s
|
||||
.split(";")
|
||||
.map(|round| {
|
||||
// Max count
|
||||
let mut r = Round {
|
||||
blue: 0,
|
||||
green: 0,
|
||||
red: 0,
|
||||
};
|
||||
for pick in round.split(",") {
|
||||
let parts: Vec<&str> = pick.trim().split(" ").collect();
|
||||
let num: usize = parts[0].parse().unwrap();
|
||||
match parts[1] {
|
||||
"blue" => r.blue = num,
|
||||
"green" => r.green = num,
|
||||
"red" => r.red = num,
|
||||
_ => panic!("Invalid color {}", parts[1]),
|
||||
}
|
||||
}
|
||||
r
|
||||
})
|
||||
.reduce(|a, b| Round {
|
||||
red: cmp::max(a.red, b.red),
|
||||
blue: (cmp::max(a.blue, b.blue)),
|
||||
green: (cmp::max(a.green, b.green)),
|
||||
})
|
||||
.unwrap();
|
||||
calc(max)
|
||||
}
|
||||
|
||||
fn parse_game_b(s: &str) -> usize {
|
||||
let splitted: Vec<&str> = s.split(":").collect();
|
||||
max_for_game(splitted[1], |x| x.blue * x.green * x.red)
|
||||
}
|
||||
|
||||
fn part_a(input: &str) {
|
||||
let result: usize = input
|
||||
.trim()
|
||||
.split("\n")
|
||||
.map(|line| {
|
||||
let splitted: Vec<&str> = line.split(":").collect();
|
||||
max_for_game(splitted[1], |r| {
|
||||
if r.red <= 12 && r.green <= 13 && r.blue <= 14 {
|
||||
splitted[0].split_at(5).1.parse().unwrap()
|
||||
} else {
|
||||
0
|
||||
}
|
||||
})
|
||||
})
|
||||
.sum();
|
||||
println!("{result}");
|
||||
}
|
||||
|
||||
fn part_b(input: &str) {
|
||||
let result: usize = input
|
||||
.trim()
|
||||
.split("\n")
|
||||
.map(|line| {
|
||||
return parse_game_b(line);
|
||||
})
|
||||
.sum();
|
||||
println!("{result}");
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Part A:");
|
||||
part_a(TEST);
|
||||
part_a(INPUT);
|
||||
|
||||
println!("\nPart B:");
|
||||
part_b(TEST);
|
||||
part_b(INPUT);
|
||||
}
|
Loading…
Reference in New Issue
Block a user