Day 7 part 1

This commit is contained in:
Wesley Moore 2019-12-07 23:15:36 +11:00
parent 1f34121f0a
commit 21c50bd8e8
No known key found for this signature in database
GPG key ID: BF67766C0BC2D0EE
5 changed files with 111 additions and 11 deletions

1
2019/input/day7.txt Normal file
View file

@ -0,0 +1 @@
3,8,1001,8,10,8,105,1,0,0,21,42,55,64,77,94,175,256,337,418,99999,3,9,102,4,9,9,1001,9,5,9,102,2,9,9,101,3,9,9,4,9,99,3,9,102,2,9,9,101,5,9,9,4,9,99,3,9,1002,9,4,9,4,9,99,3,9,102,4,9,9,101,5,9,9,4,9,99,3,9,102,5,9,9,1001,9,3,9,1002,9,5,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,99

View file

@ -1,3 +1,4 @@
use advent_of_code::number_to_digits;
use std::ops::RangeInclusive;
const INPUT: RangeInclusive<u32> = 356261..=846303;
@ -43,16 +44,6 @@ fn meets_criteria_part2(number: &u32) -> bool {
chunks.iter().any(|chunk| chunk.len() == 2) && digits.windows(2).all(|pair| pair[1] >= pair[0])
}
fn number_to_digits(mut number: u32) -> [u8; 6] {
let mut digits = [0; 6];
digits.iter_mut().rev().for_each(|digit| {
*digit = (number % 10) as u8;
number /= 10;
});
digits
}
#[cfg(test)]
mod tests {
use super::*;

76
2019/src/bin/day7.rs Normal file
View file

@ -0,0 +1,76 @@
use std::{fs, io};
use advent_of_code::{computer, input};
const AMPLIFIERS: usize = 5;
fn main() -> io::Result<()> {
let source = fs::read_to_string("input/day7.txt")?;
let data = input::read_separated_line(',', &source)?;
let max = phase_settings()
.iter()
.map(|settings| {
let mut output = 0;
for phase_setting in settings.iter() {
let input = vec![output, *phase_setting];
let mut program = data.clone();
let mut computer = computer::Computer::new(&mut program, input);
computer.run(None, None);
output = computer.output()[0];
}
output
})
.max()
.unwrap();
println!("Part 1: {}", max);
Ok(())
}
fn phase_settings() -> Vec<[i32; AMPLIFIERS]> {
let mut permutations = Vec::new();
let mut indexes = [0i32; AMPLIFIERS];
let mut elements = [0i32; AMPLIFIERS];
for i in 0i32..=4 {
elements[i as usize] = i;
}
permutations.push(elements);
let mut i = 0;
while i < AMPLIFIERS {
if indexes[i] < i as i32 {
elements.swap(if i % 2 == 0 { 0 } else { indexes[i] as usize }, i);
permutations.push(elements);
indexes[i] += 1;
i = 0;
} else {
indexes[i] = 0;
i += 1;
}
}
permutations
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_phase_setting_generation() {
let settings = phase_settings();
assert_eq!(
&settings[0..6],
&[
[0, 1, 2, 3, 4],
[1, 0, 2, 3, 4],
[2, 0, 1, 3, 4],
[0, 2, 1, 3, 4],
[1, 2, 0, 3, 4],
[2, 1, 0, 3, 4]
]
);
}
}

View file

@ -188,7 +188,7 @@ mod tests {
fn test_day2() {
let input = fs::read_to_string("input/day2.txt").unwrap();
let mut data = input::read_separated_line(',', &input).unwrap();
let mut program = Computer::new(&mut data);
let mut program = Computer::new(&mut data, vec![]);
// Check that day2 still works wirh run through this implementation
program.run(Some(12), Some(2));

View file

@ -1,3 +1,35 @@
pub mod computer;
pub mod input;
pub mod point;
pub fn number_to_digits(mut number: u32) -> [u8; 6] {
let mut digits = [0; 6];
digits.iter_mut().rev().for_each(|digit| {
*digit = (number % 10) as u8;
number /= 10;
});
digits
}
pub fn quinary(upto: u32) -> Vec<[u8; 5]> {
let limit = number_to_digits(upto);
let mut result = Vec::new();
let mut counter = [0; 5];
while &counter != &limit[1..] {
result.push(counter);
counter[0] += 1;
for i in 0..5 {
if counter[i] == 5 {
counter[i] = 0;
counter[i + 1] += 1;
} else {
break;
}
}
}
result.push(counter);
result
}