Day 1 solution
This commit is contained in:
parent
683d7ef7a3
commit
0340f23360
|
@ -17,11 +17,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1669418739,
|
"lastModified": 1669764884,
|
||||||
"narHash": "sha256-T86oFvcUIRwHWBWUt7WjaP4BP/3lDGbv5AppQSI1FkI=",
|
"narHash": "sha256-1qWR/5+WtqxSedrFbUbM3zPMO7Ec2CGWaxtK4z4DdvY=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "695b3515251873e0a7e2021add4bba643c56cde3",
|
"rev": "0244e143dc943bcf661fdaf581f01eb0f5000fcf",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
"nixpkgs": "nixpkgs_2"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"narHash": "sha256-xMOq9ifVo63/aBA1VIHQQ4riuRJGyup7F1orjekAwpk=",
|
"narHash": "sha256-/ar+cbAKAxd2Ng9b7EhrIMz9CP353RbmLecvyOidyUM=",
|
||||||
"type": "tarball",
|
"type": "tarball",
|
||||||
"url": "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"
|
"url": "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"
|
||||||
},
|
},
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,25 +1,100 @@
|
||||||
const PART1: &str = include_str!("../data/day1a.txt");
|
const PART1: &str = include_str!("../data/day1a.txt");
|
||||||
|
|
||||||
pub fn part1() -> String {
|
pub fn part1() -> String {
|
||||||
let lines = PART1.lines();
|
format!("{}", max_calories(sum_calories(input_data(PART1))).1)
|
||||||
|
|
||||||
let depths: Vec<i32> = lines.map(|l| l.parse::<i32>().unwrap()).collect();
|
|
||||||
|
|
||||||
let depths_a = depths.iter();
|
|
||||||
let depths_b = depths.iter().skip(1);
|
|
||||||
let depth_cmp = depths_a.zip(depths_b);
|
|
||||||
|
|
||||||
let increases = depth_cmp.fold(0, |cur, (a, b)| {
|
|
||||||
println!("{} < {}? {}", a, b, a < b);
|
|
||||||
if a < b {
|
|
||||||
cur + 1
|
|
||||||
} else {
|
|
||||||
cur
|
|
||||||
}
|
|
||||||
});
|
|
||||||
format!("{}", increases)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn part2() -> String {
|
pub fn part2() -> String {
|
||||||
"no response".to_owned()
|
format!("{}", max_three_calories(sum_calories(input_data(PART1))))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn input_data(data: &str) -> Vec<Vec<u32>> {
|
||||||
|
data.lines()
|
||||||
|
.collect::<Vec<&str>>()
|
||||||
|
.split(|l| *l == "")
|
||||||
|
.map(|v| {
|
||||||
|
v.into_iter()
|
||||||
|
.map(|element| element.parse::<u32>().unwrap())
|
||||||
|
.collect::<Vec<u32>>()
|
||||||
|
})
|
||||||
|
.collect::<Vec<Vec<u32>>>()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sum_calories(food_lists: Vec<Vec<u32>>) -> Vec<(usize, u32)> {
|
||||||
|
food_lists
|
||||||
|
.into_iter()
|
||||||
|
.map(|list| list.into_iter().fold(0, |cur, val| cur + val))
|
||||||
|
.enumerate()
|
||||||
|
.collect::<Vec<(usize, u32)>>()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn elf_with_most_calories(batch_calories: Vec<(usize, u32)>) -> usize {
|
||||||
|
let (idx, _) = max_calories(batch_calories);
|
||||||
|
// Elves are 1-indexed
|
||||||
|
return idx + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn max_calories(mut batch_calories: Vec<(usize, u32)>) -> (usize, u32) {
|
||||||
|
batch_calories.sort_by(|(_, val1), (_, val2)| val1.cmp(val2));
|
||||||
|
batch_calories.reverse();
|
||||||
|
batch_calories[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn max_three_calories(mut batch_calories: Vec<(usize, u32)>) -> u32 {
|
||||||
|
batch_calories.sort_by(|(_, val1), (_, val2)| val1.cmp(val2));
|
||||||
|
batch_calories.reverse();
|
||||||
|
batch_calories
|
||||||
|
.into_iter()
|
||||||
|
.take(3)
|
||||||
|
.fold(0, |cur, (_, val)| cur + val)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
const TEST_DATA1: &str = "1000
|
||||||
|
2000
|
||||||
|
3000
|
||||||
|
|
||||||
|
4000
|
||||||
|
|
||||||
|
5000
|
||||||
|
6000
|
||||||
|
|
||||||
|
7000
|
||||||
|
8000
|
||||||
|
9000
|
||||||
|
|
||||||
|
10000";
|
||||||
|
#[test]
|
||||||
|
fn find_most_elf() {
|
||||||
|
let input = input_data(TEST_DATA1);
|
||||||
|
let food_batches = sum_calories(input);
|
||||||
|
assert_eq!(
|
||||||
|
food_batches,
|
||||||
|
vec![6000, 4000, 11000, 24000, 10000]
|
||||||
|
.into_iter()
|
||||||
|
.enumerate()
|
||||||
|
.collect::<Vec<(usize, u32)>>()
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(elf_with_most_calories(food_batches.clone()), 4);
|
||||||
|
assert_eq!(max_calories(food_batches), (3, 24000));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn batch_with_one_element() {
|
||||||
|
let input = input_data("50057");
|
||||||
|
let food_batches = sum_calories(input);
|
||||||
|
assert_eq!(food_batches, vec![(0, 50057)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn find_max_three() {
|
||||||
|
assert_eq!(
|
||||||
|
max_three_calories(sum_calories(input_data(TEST_DATA1))),
|
||||||
|
45000
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,13 +2,12 @@ mod day1;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let day = std::env::args().skip(1).next();
|
let day = std::env::args().skip(1).next();
|
||||||
println!("day: {:?}", day);
|
|
||||||
|
|
||||||
let result = match day.as_ref().map(|v| v.as_ref()) {
|
let result = match day.as_ref().map(|v| v.as_ref()) {
|
||||||
Some("day1a") => day1::part1(),
|
Some("1a") => day1::part1(),
|
||||||
Some("day1b") => day1::part2(),
|
Some("1b") => day1::part2(),
|
||||||
_ => panic!("unrecognized day"),
|
_ => panic!("unrecognized day"),
|
||||||
};
|
};
|
||||||
|
|
||||||
println!("{:?} Result: {}", day, result);
|
println!("[{}] {}", day.unwrap(), result);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue