day3: optimize
This commit is contained in:
parent
12140eb77e
commit
a9788018c6
|
@ -1,4 +1,6 @@
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
|
|
||||||
|
use std::ops::RangeBounds;
|
||||||
extern crate test;
|
extern crate test;
|
||||||
|
|
||||||
const INPUTS: [&[u8]; 2] = [
|
const INPUTS: [&[u8]; 2] = [
|
||||||
|
@ -6,6 +8,17 @@ const INPUTS: [&[u8]; 2] = [
|
||||||
include_bytes!("./input.txt"),
|
include_bytes!("./input.txt"),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const DIRS: [(i32, i32); 8] = [
|
||||||
|
(0, 1),
|
||||||
|
(1, 0),
|
||||||
|
(0, -1),
|
||||||
|
(-1, 0),
|
||||||
|
(1, 1),
|
||||||
|
(-1, 1),
|
||||||
|
(1, -1),
|
||||||
|
(-1, -1),
|
||||||
|
];
|
||||||
|
|
||||||
fn process(data: &[u8]) -> u64 {
|
fn process(data: &[u8]) -> u64 {
|
||||||
let mut total = 0;
|
let mut total = 0;
|
||||||
|
|
||||||
|
@ -20,54 +33,44 @@ fn process(data: &[u8]) -> u64 {
|
||||||
for i in 0..m {
|
for i in 0..m {
|
||||||
let mut j = 0;
|
let mut j = 0;
|
||||||
while j < n {
|
while j < n {
|
||||||
if (b'1'..=b'9').contains(&grid[i][j]) {
|
if !(b'1'..=b'9').contains(&grid[i][j]) {
|
||||||
let int: Vec<u8> = grid[i]
|
j += 1;
|
||||||
.iter()
|
continue;
|
||||||
.skip(j)
|
}
|
||||||
.take_while(|&c| c.is_ascii_digit())
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let mut valid = false;
|
let mut ey = j;
|
||||||
|
while ey < n && grid[i][ey].is_ascii_digit() {
|
||||||
|
ey += 1;
|
||||||
|
}
|
||||||
|
|
||||||
let dirs = [
|
let mut valid = false;
|
||||||
(0, 1),
|
|
||||||
(1, 0),
|
|
||||||
(0, -1),
|
|
||||||
(-1, 0),
|
|
||||||
(1, 1),
|
|
||||||
(-1, 1),
|
|
||||||
(1, -1),
|
|
||||||
(-1, -1),
|
|
||||||
];
|
|
||||||
|
|
||||||
'outer: for (a, b) in dirs {
|
'outer: for (a, b) in DIRS.iter() {
|
||||||
let x = i as i32 + a;
|
let x = i as i32 + a;
|
||||||
|
|
||||||
for p in j..j + int.len() {
|
for p in j..ey {
|
||||||
let y = p as i32 + b;
|
let y = p as i32 + b;
|
||||||
|
|
||||||
if x < 0 || y < 0 || x >= m as i32 || y >= n as i32 {
|
if x < 0 || y < 0 || x >= m as i32 || y >= n as i32 {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let c = grid[x as usize][y as usize];
|
let c = grid[x as usize][y as usize];
|
||||||
if c != b'.' && !c.is_ascii_digit() {
|
if c != b'.' && !c.is_ascii_digit() {
|
||||||
valid = true;
|
valid = true;
|
||||||
break 'outer;
|
break 'outer;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if valid {
|
|
||||||
let num = String::from_utf8_lossy(&int).parse::<u64>().unwrap();
|
|
||||||
total += num
|
|
||||||
}
|
|
||||||
|
|
||||||
j += int.len();
|
|
||||||
} else {
|
|
||||||
j += 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if valid {
|
||||||
|
let num = String::from_utf8_lossy(&grid[i][j..ey])
|
||||||
|
.parse::<u64>()
|
||||||
|
.unwrap();
|
||||||
|
total += num
|
||||||
|
}
|
||||||
|
|
||||||
|
j += ey - j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,17 @@ const INPUTS: [&[u8]; 2] = [
|
||||||
include_bytes!("./input.txt"),
|
include_bytes!("./input.txt"),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const DIRS: [(i32, i32); 8] = [
|
||||||
|
(0, 1),
|
||||||
|
(1, 0),
|
||||||
|
(0, -1),
|
||||||
|
(-1, 0),
|
||||||
|
(1, 1),
|
||||||
|
(-1, 1),
|
||||||
|
(1, -1),
|
||||||
|
(-1, -1),
|
||||||
|
];
|
||||||
|
|
||||||
fn process(data: &[u8]) -> u64 {
|
fn process(data: &[u8]) -> u64 {
|
||||||
let mut total = 0;
|
let mut total = 0;
|
||||||
|
|
||||||
|
@ -19,72 +30,58 @@ fn process(data: &[u8]) -> u64 {
|
||||||
let m = grid.len();
|
let m = grid.len();
|
||||||
let n = grid[0].len();
|
let n = grid[0].len();
|
||||||
|
|
||||||
let mut map = HashMap::new();
|
let mut map = HashMap::with_capacity(200);
|
||||||
|
|
||||||
for i in 0..m {
|
for i in 0..m {
|
||||||
let mut j = 0;
|
for j in 0..n {
|
||||||
while j < n {
|
let c = grid[i][j];
|
||||||
if (b'1'..=b'9').contains(&grid[i][j]) {
|
|
||||||
let int: Vec<u8> = grid[i]
|
|
||||||
.iter()
|
|
||||||
.skip(j)
|
|
||||||
.take_while(|&c| c.is_ascii_digit())
|
|
||||||
.cloned()
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let num = String::from_utf8_lossy(&int).parse::<u64>().unwrap();
|
if c != b'*' {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
let mut count = 0;
|
for (p, q) in DIRS.iter() {
|
||||||
|
let x = i as i32 + p;
|
||||||
|
let y = j as i32 + q;
|
||||||
|
|
||||||
let dirs = [
|
if x < 0
|
||||||
(0, 1),
|
|| y < 0
|
||||||
(1, 0),
|
|| x >= m as i32
|
||||||
(0, -1),
|
|| y >= n as i32
|
||||||
(-1, 0),
|
|| !grid[x as usize][y as usize].is_ascii_digit()
|
||||||
(1, 1),
|
{
|
||||||
(-1, 1),
|
continue;
|
||||||
(1, -1),
|
}
|
||||||
(-1, -1),
|
let x = x as usize;
|
||||||
];
|
let y = y as usize;
|
||||||
|
|
||||||
'outer: for (a, b) in dirs {
|
let mut sy = y;
|
||||||
let x = (i as i32 + a);
|
let mut ey = y;
|
||||||
|
|
||||||
for p in j..j + int.len() {
|
while sy > 0 && grid[x][sy - 1].is_ascii_digit() {
|
||||||
let y = (p as i32 + b);
|
sy -= 1;
|
||||||
|
}
|
||||||
if x < 0 || y < 0 || x >= m as i32 || y >= n as i32 {
|
while ey < n && grid[x][ey].is_ascii_digit() {
|
||||||
continue;
|
ey += 1;
|
||||||
}
|
|
||||||
|
|
||||||
let c = grid[x as usize][y as usize];
|
|
||||||
|
|
||||||
if c == b'*' {
|
|
||||||
map.entry((x, y))
|
|
||||||
.or_insert_with(HashSet::new)
|
|
||||||
.insert((num, i, j));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
j += int.len();
|
let num = String::from_utf8_lossy(&grid[x][sy..ey])
|
||||||
} else {
|
.parse::<u64>()
|
||||||
j += 1;
|
.unwrap();
|
||||||
|
|
||||||
|
map.entry((i, j))
|
||||||
|
.or_insert_with(HashSet::new)
|
||||||
|
.insert((num, x, sy, ey));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for v in map.values() {
|
for v in map.into_values() {
|
||||||
if v.len() < 2 {
|
if v.len() < 2 {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut product = 1;
|
total += v.into_iter().fold(1, |a, (b, _, _, _)| a * b);
|
||||||
for (num, _, _) in v.iter() {
|
|
||||||
product *= num;
|
|
||||||
}
|
|
||||||
|
|
||||||
total += product;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
total
|
total
|
||||||
|
|
Loading…
Reference in New Issue
Block a user