This commit is contained in:
Smaug123
2021-05-09 13:42:34 +01:00
parent 6537f253e0
commit 8d3c01986b
5 changed files with 123 additions and 0 deletions

4
Cargo.lock generated
View File

@@ -19,3 +19,7 @@ version = "0.1.0"
[[package]]
name = "day_5"
version = "0.1.0"
[[package]]
name = "day_6"
version = "0.1.0"

View File

@@ -5,4 +5,5 @@ members = [
"day_3",
"day_4",
"day_5",
"day_6",
]

9
day_6/Cargo.toml Normal file
View File

@@ -0,0 +1,9 @@
[package]
name = "day_6"
version = "0.1.0"
authors = ["Smaug123 <patrick+github@patrickstevens.co.uk>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

1
day_6/input.txt Normal file
View File

@@ -0,0 +1 @@
11 11 13 7 0 15 5 5 4 4 1 1 7 1 15 11

108
day_6/src/main.rs Normal file
View File

@@ -0,0 +1,108 @@
use std::collections::HashMap;
use std::collections::HashSet;
fn input() -> Vec<u32> {
let input = include_str!("../input.txt");
input
.trim()
.split_whitespace()
.map(|i| {
i.parse()
.unwrap_or_else(|_| panic!("{} wasn't a valid u32", i))
})
.collect::<Vec<u32>>()
}
pub fn part_1(v: &mut [u32]) -> u32 {
let len = v.len() as u32;
let mut seen: HashSet<Vec<u32>> = HashSet::new();
let mut count = 0;
let (mut max_pos, mut max) = v
.iter()
.cloned()
.enumerate()
.max_by_key(|(_, x)| *x)
.unwrap();
while seen.insert(v.to_vec()) {
let extras = max % len;
let all = max / len;
v[max_pos] = 0;
for i in 0..(extras as usize) {
v[(max_pos + i + 1) % v.len()] += 1;
}
max = 0;
for (i, item) in v.iter_mut().enumerate() {
*item += all;
if *item > max {
max = *item;
max_pos = i;
}
}
count += 1;
}
count
}
pub fn part_2(v: &mut [u32]) -> u32 {
let len = v.len() as u32;
let mut seen: HashMap<Vec<u32>, u32> = HashMap::new();
let mut count = 0;
let (mut max_pos, mut max) = v
.iter()
.cloned()
.enumerate()
.max_by_key(|(_, x)| *x)
.unwrap();
loop {
if let Some(existing) = seen.insert(v.to_vec(), count) {
return count - existing;
}
let extras = max % len;
let all = max / len;
v[max_pos] = 0;
for i in 0..(extras as usize) {
v[(max_pos + i + 1) % v.len()] += 1;
}
max = 0;
for (i, item) in v.iter_mut().enumerate() {
*item += all;
if *item > max {
max = *item;
max_pos = i;
}
}
count += 1;
}
}
fn main() {
let input = input();
println!("part 1 => {}", part_1(&mut input.clone()));
let mut input = input;
println!("part 2 => {}", part_2(&mut input));
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn part1_known() {
assert_eq!(part_1(&mut vec![0, 2, 7, 0]), 5);
}
#[test]
fn part2_known() {
assert_eq!(part_2(&mut vec![0, 2, 7, 0]), 4);
}
#[test]
fn test_day_6() {
let input = input();
let answer = part_1(&mut input.clone());
assert_eq!(answer, 4074);
let mut input = input;
let answer = part_2(&mut input);
assert_eq!(answer, 2793);
}
}