finally solve day 6
This commit is contained in:
@@ -3,7 +3,7 @@ use color_eyre::Report;
|
|||||||
|
|
||||||
fn main() -> Result<(), Report> {
|
fn main() -> Result<(), Report> {
|
||||||
color_eyre::install()?;
|
color_eyre::install()?;
|
||||||
let data = day06::data("inputs/day06example.txt")?;
|
let data = day06::data("inputs/day06.txt")?;
|
||||||
let code1 = day06::part1(&data)?;
|
let code1 = day06::part1(&data)?;
|
||||||
let code2 = day06::part2(&data)?;
|
let code2 = day06::part2(&data)?;
|
||||||
println!("code1: {code1}");
|
println!("code1: {code1}");
|
||||||
|
|||||||
158
src/day06.rs
158
src/day06.rs
@@ -12,6 +12,21 @@ enum Symbol {
|
|||||||
Mul,
|
Mul,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Either {
|
||||||
|
Num(usize),
|
||||||
|
Symbol(Symbol),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Either {
|
||||||
|
fn is_symbol(&self) -> bool {
|
||||||
|
matches!(self, Either::Symbol(_))
|
||||||
|
}
|
||||||
|
fn is_num(&self) -> bool {
|
||||||
|
matches!(self, Either::Num(_))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Symbol {
|
impl Symbol {
|
||||||
fn apply(&self, data: &Vec<usize>) -> usize {
|
fn apply(&self, data: &Vec<usize>) -> usize {
|
||||||
let mut val = 0;
|
let mut val = 0;
|
||||||
@@ -28,44 +43,63 @@ impl Symbol {
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct MultGrid {
|
pub struct MultGrid {
|
||||||
data: Vec<usize>,
|
data: Vec<Vec<usize>>,
|
||||||
symbols: Vec<Symbol>,
|
symbols: Vec<Symbol>,
|
||||||
width: usize,
|
width: usize,
|
||||||
num_height: usize,
|
num_height: usize,
|
||||||
sym_height: usize,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<R: BufRead> TryFrom<Lines<R>> for MultGrid {
|
impl<R: BufRead> TryFrom<Lines<R>> for MultGrid {
|
||||||
type Error = Report;
|
type Error = Report;
|
||||||
fn try_from(value: Lines<R>) -> Result<Self, Self::Error> {
|
fn try_from(value: Lines<R>) -> Result<Self, Self::Error> {
|
||||||
|
let lines = value.collect::<Result<Vec<String>, _>>()?;
|
||||||
let mut data = Vec::new();
|
let mut data = Vec::new();
|
||||||
let mut symbols = Vec::new();
|
let mut symbols = Vec::new();
|
||||||
let mut width = 0;
|
let mut num_height = 0;
|
||||||
|
let mut widths = Vec::new();
|
||||||
|
let parts: Vec<char> = lines.last().unwrap().chars().collect();
|
||||||
|
let mut length = 0;
|
||||||
|
for c in parts {
|
||||||
|
if c.is_ascii_digit() || c.is_whitespace() {
|
||||||
|
length += 1;
|
||||||
|
} else {
|
||||||
|
symbols.push(match c {
|
||||||
|
'+' => Symbol::Add,
|
||||||
|
'*' => Symbol::Mul,
|
||||||
|
v => {
|
||||||
|
panic!("unexpected symbol: {v:?}")
|
||||||
|
}
|
||||||
|
});
|
||||||
|
widths.push(length);
|
||||||
|
length = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
widths.remove(0);
|
||||||
|
widths.push(length + 1);
|
||||||
|
|
||||||
for line in value {
|
for line in lines.iter().rev().skip(1).rev() {
|
||||||
let line = line?;
|
let parts: Vec<char> = line.chars().collect();
|
||||||
let parts = line.split(' ').collect::<Vec<&str>>();
|
num_height += 1;
|
||||||
width = parts.len();
|
let mut widths_index = 0;
|
||||||
for char in parts {
|
for w in &widths {
|
||||||
println!("char: {char:?}");
|
let part = parts[widths_index..widths_index + *w]
|
||||||
let num = char.parse::<usize>();
|
.iter()
|
||||||
match (char, num) {
|
.map(|v| {
|
||||||
(_, Ok(num)) => {
|
if v.is_ascii_digit() {
|
||||||
data.push(num);
|
v.to_digit(10).unwrap() as usize
|
||||||
}
|
} else {
|
||||||
("", _) => data.push(0),
|
0
|
||||||
("+", _) => symbols.push(Symbol::Add),
|
|
||||||
("*", _) => symbols.push(Symbol::Mul),
|
|
||||||
_ => {
|
|
||||||
panic!("FUCK");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<usize>>();
|
||||||
|
|
||||||
|
data.push(part);
|
||||||
|
widths_index += w + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
width,
|
width: widths.len(),
|
||||||
num_height: data.len() / width,
|
num_height,
|
||||||
sym_height: symbols.len() / width,
|
|
||||||
data,
|
data,
|
||||||
symbols,
|
symbols,
|
||||||
})
|
})
|
||||||
@@ -73,10 +107,10 @@ impl<R: BufRead> TryFrom<Lines<R>> for MultGrid {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl MultGrid {
|
impl MultGrid {
|
||||||
pub fn get_num_col(&self, index: usize) -> Vec<usize> {
|
pub fn get_num_col(&self, index: usize) -> Vec<&Vec<usize>> {
|
||||||
(0..self.num_height)
|
(0..self.num_height)
|
||||||
.map(|x| (x * self.width) + index)
|
.map(|x| (x * self.width) + index)
|
||||||
.map(|i| self.data[i])
|
.map(|i| &self.data[i])
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -84,7 +118,20 @@ impl MultGrid {
|
|||||||
pub fn part1(data: &MultGrid) -> Result<u64, Report> {
|
pub fn part1(data: &MultGrid) -> Result<u64, Report> {
|
||||||
let mut total = 0;
|
let mut total = 0;
|
||||||
for i in 0..data.width {
|
for i in 0..data.width {
|
||||||
let col = data.get_num_col(i);
|
let col = data
|
||||||
|
.get_num_col(i)
|
||||||
|
.into_iter()
|
||||||
|
.map(|v| v.iter().filter(|v| v != &&0).collect::<Vec<&usize>>())
|
||||||
|
.collect::<Vec<Vec<&usize>>>();
|
||||||
|
let col = col
|
||||||
|
.iter()
|
||||||
|
.map(|val| {
|
||||||
|
val.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(i, v)| **v * 10_usize.pow(val.len() as u32 - i as u32 - 1))
|
||||||
|
.sum::<usize>()
|
||||||
|
})
|
||||||
|
.collect::<Vec<usize>>();
|
||||||
let sym = &data.symbols[i];
|
let sym = &data.symbols[i];
|
||||||
let val = sym.apply(&col);
|
let val = sym.apply(&col);
|
||||||
total += val;
|
total += val;
|
||||||
@@ -93,58 +140,31 @@ pub fn part1(data: &MultGrid) -> Result<u64, Report> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn part2(data: &MultGrid) -> Result<u64, Report> {
|
pub fn part2(data: &MultGrid) -> Result<u64, Report> {
|
||||||
println!("{data:?}");
|
|
||||||
// let ranges = data.dedup_ranges();
|
|
||||||
let mut total = 0;
|
let mut total = 0;
|
||||||
for i in 0..data.width {
|
for i in 0..data.width {
|
||||||
let mut col = data
|
let mut matrix = data.get_num_col(i);
|
||||||
.get_num_col(i)
|
let rows = matrix.len();
|
||||||
.into_iter()
|
let cols = matrix[0].len();
|
||||||
.map(|v| {
|
|
||||||
let len = (v.checked_ilog10().unwrap_or(0) + 1) as usize;
|
|
||||||
let mut digits = vec![0; len];
|
|
||||||
let mut temp = v;
|
|
||||||
for i in 1..=len {
|
|
||||||
digits[len - i] = temp % 10;
|
|
||||||
temp /= 10;
|
|
||||||
}
|
|
||||||
digits
|
|
||||||
})
|
|
||||||
.collect::<Vec<Vec<usize>>>();
|
|
||||||
println!("{col:?}");
|
|
||||||
let mut vals = Vec::new();
|
|
||||||
while !col.is_empty() {
|
|
||||||
let mut val = Vec::new();
|
|
||||||
for c in col.iter_mut() {
|
|
||||||
let v = c.pop();
|
|
||||||
if let Some(v) = v {
|
|
||||||
println!("{v}");
|
|
||||||
val.push(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
println!("...");
|
let new = (0..cols)
|
||||||
col.retain(|v| !v.is_empty());
|
.rev()
|
||||||
|
.map(|col| (0..rows).map(|row| matrix[row][col]).collect::<Vec<_>>())
|
||||||
|
.map(|v| v.into_iter().filter(|v| v != &0).collect::<Vec<usize>>())
|
||||||
|
.collect::<Vec<Vec<_>>>();
|
||||||
|
|
||||||
let num = val
|
let new = new
|
||||||
.iter()
|
.iter()
|
||||||
|
.map(|val| {
|
||||||
|
val.iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(i, v)| v * 10_usize.pow(val.len() as u32 - i as u32 - 1))
|
.map(|(i, v)| *v * 10_usize.pow(val.len() as u32 - i as u32 - 1))
|
||||||
.sum::<usize>();
|
.sum::<usize>()
|
||||||
vals.push(num);
|
})
|
||||||
}
|
.collect::<Vec<usize>>();
|
||||||
|
|
||||||
let sym = &data.symbols[i];
|
let sym = &data.symbols[i];
|
||||||
let val = sym.apply(&vals);
|
let val = sym.apply(&new);
|
||||||
|
|
||||||
println!("{col:?} {sym:?} {val}");
|
|
||||||
total += val;
|
total += val;
|
||||||
}
|
}
|
||||||
// for (start, end) in &ranges {
|
|
||||||
// let v = end - start + 1;
|
|
||||||
// // println!("{start}-{end} => {v}");
|
|
||||||
// total += v;
|
|
||||||
// }
|
|
||||||
Ok(total as u64)
|
Ok(total as u64)
|
||||||
}
|
}
|
||||||
pub fn data(filepath: &str) -> Result<MultGrid, Report> {
|
pub fn data(filepath: &str) -> Result<MultGrid, Report> {
|
||||||
|
|||||||
Reference in New Issue
Block a user