day18 part1

This commit is contained in:
2020-12-18 14:47:38 -08:00
parent d21b0dbe7b
commit f756bc105f
7 changed files with 459 additions and 2 deletions

View File

@@ -258,7 +258,7 @@ mod avx2 {
let mut candidates = [_mm256_set1_epi32((1i32 << rules.len()) - 1); 4];
let mut scratch_space = [_mm256_set1_epi32(1); 4];
for line in nearby_tickets.split('\n') {
let scratch_slice = &mut * (&mut scratch_space as *mut _ as *mut [u32; 32]);
let scratch_slice = &mut *(&mut scratch_space as *mut _ as *mut [u32; 32]);
for (field, scratch) in line.split(',').zip(scratch_slice.iter_mut()) {
let field = field.parse().unwrap();
*scratch = rule_eval.eval(field);
@@ -275,7 +275,7 @@ mod avx2 {
}
}
let candidates = &mut * (&mut candidates as *mut _ as *mut [u32; 32]);
let candidates = &mut *(&mut candidates as *mut _ as *mut [u32; 32]);
let candidates = &mut candidates[..rules.len()];
while candidates.iter().copied().any(|x| x.count_ones() > 1) {
for idx in 0..candidates.len() {

6
src/day17.rs Normal file
View File

@@ -0,0 +1,6 @@
use aoc_runner_derive::aoc;
#[aoc(day17, part1)]
fn solve_d17_p1(input: &str) -> usize {
42
}

67
src/day18.rs Normal file
View File

@@ -0,0 +1,67 @@
use aoc_runner_derive::aoc;
use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::character::complete::{char, digit1, space0};
use nom::combinator::map_res;
use nom::multi::fold_many0;
use nom::sequence::{delimited, pair};
use nom::IResult;
use std::str::FromStr;
fn num(i: &str) -> IResult<&str, usize> {
map_res(delimited(space0, digit1, space0), FromStr::from_str)(i)
}
fn paren_expr(i: &str) -> IResult<&str, usize> {
delimited(space0, delimited(tag("("), expr, tag(")")), space0)(i)
}
fn num_or_paren_expr(i: &str) -> IResult<&str, usize> {
alt((num, paren_expr))(i)
}
fn expr(i: &str) -> IResult<&str, usize> {
let (i, lhs) = num_or_paren_expr(i)?;
fold_many0(
pair(
alt((char('+'), char('-'), char('*'), char('/'))),
num_or_paren_expr,
),
lhs,
|lhs, (op, rhs)| match op {
'+' => lhs + rhs,
'-' => lhs - rhs,
'*' => lhs * rhs,
'/' => lhs * rhs,
_ => unreachable!("invalid op"),
},
)(i)
}
#[aoc(day18, part1)]
fn solve_d18_p1(input: &str) -> usize {
input.split('\n').map(|line| expr(line).unwrap().1).sum()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_expr() {
assert_eq!(expr("2+2"), Ok(("", 4)));
assert_eq!(expr("1 + 2 * 3 + 4 * 5 + 6"), Ok(("", 71)));
assert_eq!(expr("1 + (2 * 3) + (4 * (5 + 6))"), Ok(("", 51)));
assert_eq!(expr("2 * 3 + (4 * 5)"), Ok(("", 26)));
assert_eq!(expr("5 + (8 * 3 + 9 + 3 * 4 * 3)"), Ok(("", 437)));
assert_eq!(
expr("5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))"),
Ok(("", 12240))
);
assert_eq!(
expr("((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2"),
Ok(("", 13632))
);
}
}

View File

@@ -6,6 +6,8 @@ pub mod day13;
pub mod day14;
pub mod day15;
pub mod day16;
pub mod day17;
pub mod day18;
pub mod day2;
pub mod day3;
pub mod day4;