mirror of
https://github.com/Smaug123/advent-of-code-2017
synced 2025-10-07 04:28:39 +00:00
Day 6
This commit is contained in:
4
Cargo.lock
generated
4
Cargo.lock
generated
@@ -19,3 +19,7 @@ version = "0.1.0"
|
||||
[[package]]
|
||||
name = "day_5"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "day_6"
|
||||
version = "0.1.0"
|
||||
|
@@ -5,4 +5,5 @@ members = [
|
||||
"day_3",
|
||||
"day_4",
|
||||
"day_5",
|
||||
"day_6",
|
||||
]
|
||||
|
9
day_6/Cargo.toml
Normal file
9
day_6/Cargo.toml
Normal 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
1
day_6/input.txt
Normal 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
108
day_6/src/main.rs
Normal 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user