day16: added/optimized
This commit is contained in:
parent
fd68238398
commit
0da49cd4df
154
src/day16/1.rs
154
src/day16/1.rs
|
@ -1 +1,153 @@
|
|||
const INPUTS: [&'static str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||
#![feature(test)]
|
||||
extern crate test;
|
||||
|
||||
const INPUTS: [&[u8]; 2] = [
|
||||
include_bytes!("./sample.txt"),
|
||||
include_bytes!("./input.txt"),
|
||||
];
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Copy)]
|
||||
enum Direction {
|
||||
North = 0,
|
||||
South = 1,
|
||||
East = 2,
|
||||
West = 3,
|
||||
}
|
||||
|
||||
fn process(data: &[u8]) -> usize {
|
||||
let size = data.iter().filter(|&&x| x == b'\n').count();
|
||||
use Direction::*;
|
||||
|
||||
solve(data, size as i32, (0, 0, East))
|
||||
}
|
||||
|
||||
fn solve(grid: &[u8], size: i32, (sx, sy, dir): (i32, i32, Direction)) -> usize {
|
||||
use Direction::*;
|
||||
|
||||
let mut visited: BitSet<100> = BitSet::new();
|
||||
let mut seen: BitSet<400> = BitSet::new();
|
||||
|
||||
let mut stack = vec![];
|
||||
|
||||
stack.push((sx, sy, dir));
|
||||
|
||||
while let Some((sx, sy, dir)) = stack.pop() {
|
||||
if sx < 0 || sy < 0 || sx >= size || sy >= size {
|
||||
continue;
|
||||
}
|
||||
|
||||
if seen.get(size * size * dir as i32 + size * sx + sy) {
|
||||
continue;
|
||||
} else {
|
||||
seen.set(size * size * dir as i32 + size * sx + sy);
|
||||
}
|
||||
|
||||
visited.set(sx * size + sy);
|
||||
let c = grid[(sx * size + sy + sx) as usize];
|
||||
|
||||
let mut x = sx;
|
||||
let mut y = sy;
|
||||
|
||||
match (c, dir) {
|
||||
(b'\\', East) => stack.push((x + 1, y, South)),
|
||||
(b'\\', North) => stack.push((x, y - 1, West)),
|
||||
(b'\\', West) => stack.push((x - 1, y, North)),
|
||||
(b'\\', South) => stack.push((x, y + 1, East)),
|
||||
(b'/', East) => stack.push((x - 1, y, North)),
|
||||
(b'/', West) => stack.push((x + 1, y, South)),
|
||||
(b'/', South) => stack.push((x, y - 1, West)),
|
||||
(b'/', North) => stack.push((x, y + 1, East)),
|
||||
(b'|', North) => stack.push((x - 1, y, dir)),
|
||||
(b'|', South) => stack.push((x + 1, y, dir)),
|
||||
(b'|', _) => {
|
||||
stack.push((x - 1, y, North));
|
||||
stack.push((x + 1, y, South));
|
||||
}
|
||||
(b'-', East) => stack.push((x, y + 1, dir)),
|
||||
(b'-', West) => stack.push((x, y - 1, dir)),
|
||||
(b'-', _) => {
|
||||
stack.push((x, y + 1, East));
|
||||
stack.push((x, y - 1, West));
|
||||
}
|
||||
(b'.', _) => {
|
||||
let (r, s) = match dir {
|
||||
North => (-1, 0),
|
||||
South => (1, 0),
|
||||
East => (0, 1),
|
||||
West => (0, -1),
|
||||
};
|
||||
|
||||
loop {
|
||||
visited.set(x * size + y);
|
||||
x += r;
|
||||
y += s;
|
||||
if x < 0 || y < 0 || x >= size || y >= size {
|
||||
break;
|
||||
}
|
||||
let c = grid[(x * size + y + x) as usize];
|
||||
if c != b'.' {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if !(x < 0 || y < 0 || x >= size || y >= size) {
|
||||
stack.push((x, y, dir));
|
||||
}
|
||||
}
|
||||
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
visited.count()
|
||||
}
|
||||
|
||||
struct BitSet<const N: usize> {
|
||||
bits: [u128; N],
|
||||
}
|
||||
|
||||
impl<const N: usize> BitSet<N> {
|
||||
const fn new() -> Self {
|
||||
Self { bits: [0; N] }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn set(&mut self, loc: i32) {
|
||||
let idx = loc / 128;
|
||||
let b_idx = loc & 127;
|
||||
|
||||
self.bits[idx as usize] |= 1 << b_idx;
|
||||
}
|
||||
|
||||
#[inline]
|
||||
const fn get(&self, loc: i32) -> bool {
|
||||
let idx = loc / 128;
|
||||
let b_idx = loc & 127;
|
||||
|
||||
(self.bits[idx as usize] & (1 << b_idx)) > 0
|
||||
}
|
||||
|
||||
const fn count(&self) -> usize {
|
||||
let mut count = 0;
|
||||
let mut i = 0;
|
||||
while i < self.bits.len() * 128 {
|
||||
count += self.get(i as i32) as usize;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
count
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
for input in INPUTS.iter() {
|
||||
println!("answer = {}", process(input));
|
||||
}
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn part1(b: &mut test::Bencher) {
|
||||
b.iter(|| {
|
||||
let v = process(INPUTS[INPUTS.len() - 1]);
|
||||
test::black_box(v);
|
||||
});
|
||||
}
|
||||
|
|
188
src/day16/2.rs
188
src/day16/2.rs
|
@ -1 +1,187 @@
|
|||
const INPUTS: [&'static str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")];
|
||||
#![feature(test)]
|
||||
extern crate test;
|
||||
|
||||
const INPUTS: [&[u8]; 2] = [
|
||||
include_bytes!("./sample.txt"),
|
||||
include_bytes!("./input.txt"),
|
||||
];
|
||||
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Copy)]
|
||||
enum Direction {
|
||||
North = 0,
|
||||
South = 1,
|
||||
East = 2,
|
||||
West = 3,
|
||||
}
|
||||
|
||||
fn process(data: &[u8]) -> usize {
|
||||
let mut maximum = 0;
|
||||
|
||||
let size = data.iter().filter(|&&x| x == b'\n').count();
|
||||
|
||||
use Direction::*;
|
||||
let mut stack = vec![];
|
||||
|
||||
for j in 0..size {
|
||||
let visited = solve(&mut stack, data, size as i32, (0, j as i32, South));
|
||||
maximum = std::cmp::max(maximum, visited);
|
||||
|
||||
let visited = solve(
|
||||
&mut stack,
|
||||
data,
|
||||
size as i32,
|
||||
(size as i32 - 1, j as i32, North),
|
||||
);
|
||||
maximum = std::cmp::max(maximum, visited);
|
||||
}
|
||||
|
||||
for i in 0..size {
|
||||
let visited = solve(&mut stack, data, size as i32, (i as i32, 0, East));
|
||||
maximum = std::cmp::max(maximum, visited);
|
||||
|
||||
let visited = solve(
|
||||
&mut stack,
|
||||
data,
|
||||
size as i32,
|
||||
(i as i32, size as i32 - 1, West),
|
||||
);
|
||||
maximum = std::cmp::max(maximum, visited);
|
||||
}
|
||||
|
||||
maximum
|
||||
}
|
||||
|
||||
fn solve(
|
||||
stack: &mut Vec<(i32, i32, Direction)>,
|
||||
grid: &[u8],
|
||||
size: i32,
|
||||
(sx, sy, dir): (i32, i32, Direction),
|
||||
) -> usize {
|
||||
use Direction::*;
|
||||
|
||||
let mut visited: BitSet<100> = BitSet::new();
|
||||
let mut seen: BitSet<400> = BitSet::new();
|
||||
|
||||
stack.push((sx, sy, dir));
|
||||
|
||||
while let Some((sx, sy, dir)) = stack.pop() {
|
||||
if sx < 0 || sy < 0 || sx >= size || sy >= size {
|
||||
continue;
|
||||
}
|
||||
|
||||
if seen.get(size * size * dir as i32 + size * sx + sy) {
|
||||
continue;
|
||||
} else {
|
||||
seen.set(size * size * dir as i32 + size * sx + sy);
|
||||
}
|
||||
|
||||
visited.set(sx * size + sy);
|
||||
let c = grid[(sx * size + sy + sx) as usize];
|
||||
|
||||
let mut x = sx;
|
||||
let mut y = sy;
|
||||
|
||||
match (c, dir) {
|
||||
(b'\\', East) => stack.push((x + 1, y, South)),
|
||||
(b'\\', North) => stack.push((x, y - 1, West)),
|
||||
(b'\\', West) => stack.push((x - 1, y, North)),
|
||||
(b'\\', South) => stack.push((x, y + 1, East)),
|
||||
(b'/', East) => stack.push((x - 1, y, North)),
|
||||
(b'/', West) => stack.push((x + 1, y, South)),
|
||||
(b'/', South) => stack.push((x, y - 1, West)),
|
||||
(b'/', North) => stack.push((x, y + 1, East)),
|
||||
(b'|', North) => stack.push((x - 1, y, dir)),
|
||||
(b'|', South) => stack.push((x + 1, y, dir)),
|
||||
(b'|', _) => {
|
||||
stack.push((x - 1, y, North));
|
||||
stack.push((x + 1, y, South));
|
||||
}
|
||||
(b'-', East) => stack.push((x, y + 1, dir)),
|
||||
(b'-', West) => stack.push((x, y - 1, dir)),
|
||||
(b'-', _) => {
|
||||
stack.push((x, y + 1, East));
|
||||
stack.push((x, y - 1, West));
|
||||
}
|
||||
(b'.', _) => {
|
||||
let (r, s) = match dir {
|
||||
North => (-1, 0),
|
||||
South => (1, 0),
|
||||
East => (0, 1),
|
||||
West => (0, -1),
|
||||
};
|
||||
|
||||
loop {
|
||||
visited.set(x * size + y);
|
||||
x += r;
|
||||
y += s;
|
||||
if x < 0 || y < 0 || x >= size || y >= size {
|
||||
break;
|
||||
}
|
||||
|
||||
let c = grid[(x * size + y + x) as usize];
|
||||
if c != b'.' {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if !(x < 0 || y < 0 || x >= size || y >= size) {
|
||||
stack.push((x, y, dir));
|
||||
}
|
||||
}
|
||||
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
visited.count()
|
||||
}
|
||||
|
||||
struct BitSet<const N: usize> {
|
||||
bits: [u128; N],
|
||||
}
|
||||
|
||||
impl<const N: usize> BitSet<N> {
|
||||
const fn new() -> Self {
|
||||
Self { bits: [0; N] }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn set(&mut self, loc: i32) {
|
||||
let idx = loc / 128;
|
||||
let b_idx = loc & 127;
|
||||
|
||||
self.bits[idx as usize] |= 1 << b_idx;
|
||||
}
|
||||
|
||||
#[inline]
|
||||
const fn get(&self, loc: i32) -> bool {
|
||||
let idx = loc / 128;
|
||||
let b_idx = loc & 127;
|
||||
|
||||
(self.bits[idx as usize] & (1 << b_idx)) > 0
|
||||
}
|
||||
|
||||
const fn count(&self) -> usize {
|
||||
let mut count = 0;
|
||||
let mut i = 0;
|
||||
while i < self.bits.len() * 128 {
|
||||
count += self.get(i as i32) as usize;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
count
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
for input in INPUTS.iter() {
|
||||
println!("answer = {}", process(input));
|
||||
}
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn part2(b: &mut test::Bencher) {
|
||||
b.iter(|| {
|
||||
let v = process(INPUTS[INPUTS.len() - 1]);
|
||||
test::black_box(v);
|
||||
});
|
||||
}
|
||||
|
|
110
src/day16/input.txt
Normal file
110
src/day16/input.txt
Normal file
|
@ -0,0 +1,110 @@
|
|||
\..-.-..../.....|......\......................\............\.................|..............|........./.|.....
|
||||
...-\...|............|......../.|........-../................|.-..............-....\.|..|.....................
|
||||
.|..........\................\\|................../..........................\\../|...-...-.|..........\......
|
||||
..................|\....|.....-.......................-........\.............................|/...............
|
||||
.......-...........-......................./........../.......-............................\.....-.....-.../..
|
||||
./.\...../....../..........\..............|............|....|........................\..../.../...|\..........
|
||||
..................................../...............................................\..................-.\....
|
||||
......../.........................|...............................|...............\|\........\....|....\......
|
||||
.--.........................../.../.......-.\........../.\.........|...............\..|.....\-.....\....||\...
|
||||
......\............|......../..\................-..............\-..-...|\.../-............/.........|...\.....
|
||||
.........|.........-.........|............/............-..............\../.......-.|\\..|......./.............
|
||||
..........................\........|.....\...../..-......-............../.-|.............\.\...../.......\....
|
||||
.....\.................-........../........-....|.....-......|.....................................-......-\..
|
||||
......|\......................................./...../........|...|....../..................-....-.-..../.....
|
||||
.../......\...|./|..........\.......-./..-../.................\.....\......../........./..|......-...|.../....
|
||||
--|................\.................|........../......\|......|.........................\....................
|
||||
......../...........|./............../.....-.....-......../.................................-.....-...........
|
||||
........................-.../..../..\|..............................|\..|.|\................/........-...\...|
|
||||
\.........-....../...|.\............./......\.......\..../....\|./-|.........|......-.......\............|....
|
||||
....|..........-.....|..../..........-/...-.............\..\...................\................|......|......
|
||||
............-..|...........-..../...-........../.../...-....-....../\..............|........\..............--.
|
||||
.....\.../......|..-..............|..-........................|......|.......|.........\............/...\...-.
|
||||
|....................-.........../.....-........\.../..........|..............................................
|
||||
..-.............|..../............|........................|..../.........................\..........-..-.../.
|
||||
........-.|......\.........../................/..|..\................./.|....-................../...-......./.
|
||||
\|..-.......\..............\.|/......-|.........../........../.-...............\....\....\..|..|..............
|
||||
..........|.........\............\\.../../|...........-................|....................|....|-\/\...\....
|
||||
.-........\............-.......\............-.............\.\......./...........././.|.\-...-.\./..........-/.
|
||||
../.................-........//--...........|........./..../....|.....................................|....\..
|
||||
.............|....|........|........./.....\..../..-..................../........|.....././...................
|
||||
......................-....\..........--.....\..\........../...........................--/....................
|
||||
.|.../.......-.......\.......|.............................-.............\..-.\../.......|............|......\
|
||||
...../.......-......|.............../.../...........................................|......-..........-.......
|
||||
.............\............................................../......................\......../.................
|
||||
|....................-...-\..................\................/.../...........................................
|
||||
..|....-............/....................../......../...../......./.......\.-................/................
|
||||
.........../..-/...-...\..............-..../...............-|.........-............/........|.|.-...|...\.....
|
||||
....../..-../.........-|...../...........................\..............-..................--...-.............
|
||||
-.................-......../.....|....................\....................-../....................|./.....-..
|
||||
......./...\......../.|.|.........-.................................../....|..................................
|
||||
...|........\|\.........\...\...-......-...............................\.......//.|.....-.............../.....
|
||||
........................../.|-...|....\..........\...................-..-............../............../.......
|
||||
........../..-.......-....\.......\.............\.|................................|......../..............-..
|
||||
.......-................................-..................|../...\....................................-......
|
||||
...................................................................................../...\...................-
|
||||
..\.-...................................|..............-.....|.........\..................../.........-....\..
|
||||
...................../\......-...........--.../............|...........|.....\....//.....-........./...-|.....
|
||||
......||.........|.-.........................|.........|.||..-....-......|.................\.-../.............
|
||||
...|.........|.......\....\................................../.................../....\................\......
|
||||
..................../|...............||.-/........|../..................................../.\......\...-......
|
||||
......./........./..-............................-.................\...|...............-................-.....
|
||||
.............................--...-....\......................................|..........\...-......./........
|
||||
.......\...-.............../......\/.........................|........./..........|...........................
|
||||
.........|.................................|.........../.|................................../...........-....|
|
||||
...|...-...|...........................-....-.....................|../|........|...................../.....|..
|
||||
.......-.....-..................\.-........|...-..../........\.......................\......|..........-......
|
||||
|......................\..........-...............|........................../...........|....................
|
||||
................|....|..................-......-/.......-....|..\.../\.|.....-..../...................../.|..\
|
||||
............/........................../....-........-...............-...|...............|..\............./...
|
||||
................./................\.............../...........\........\....../............\.....|........./..
|
||||
..\......./.-.....................-............-./......|..........-.............\..../.......................
|
||||
/..../....-........\................................\....|.............../\-.............................-|...
|
||||
................\..................\.--.|......//....|..|....|....../..................|.|...|....-|-.........
|
||||
...................\............\....-............\...........................................-./.............
|
||||
.........................\../............|..\.........../................/..../.............-.................
|
||||
..-..\.........../............|..................................../............/.....-..............|.....|..
|
||||
..|/......\||.......\............/....|........|.-........./.............|.....................|./............
|
||||
..........-............../...........................................|.............|..-..../.|................
|
||||
..|.../..|......................./..-.-..............\../....................-..|............-...../.-........
|
||||
.-....../..............\..................\................./....-...\....\...-.....\.....-.-..............\./
|
||||
............./..../.\........-..\................................\....../.|.....|.......|.........|....\......
|
||||
.-.....\.-......-.|.-.........../..|...........\....................................\........|.//./.......-...
|
||||
......-.......-/.........................-...../........|............./..................../............-.....
|
||||
.............\....|......-../...........\...................../...............................................
|
||||
../.......................................-...../.|..\......|...-......../....|./..........\.........|........
|
||||
....../.............\...................................\........\....-.........../..../..\..................|
|
||||
.../...-.....-................/.........|....................|..............-.........\.......................
|
||||
...................../..............-.......|......................./...|.....|../.|............../..........\
|
||||
.././....../........-........|.../.........../|..........|....../......-.....\.............................\..
|
||||
............|........|................/....\..............\............/.....\../..............|....../.......
|
||||
|................\..../...........................|.......\......\.....\........../....../....................
|
||||
........./...-...\......./....................-...................................-............\........-..../
|
||||
............./............../.....................\.-..../.................\.........|.|............../.-...\\
|
||||
.........|......-\......\.................../..|.........|......\....\..-..\-.................................
|
||||
...............|../.......................-.../......\......|||................|..............................
|
||||
.|...-............./...........-.......................|...............................|..............\.......
|
||||
.|.............|.........................................-........|-.\.................-/.|...................
|
||||
.|.......-||.........../..\....\.....................-....-....-.......-......-.........-|........|...........
|
||||
.........\........-...|........../............/.................../......./........................-..........
|
||||
............\.........................../..\.......-............/.......................|.........\...........
|
||||
..\..\............/..................../..............-....../|.../...................|............./..../....
|
||||
..\.\....\.../............/.../.........................../.-.......-.....\......|........|...../.........|.\|
|
||||
.....-...........\..............-......-....-...../........-......|...../..\..|/........-............./.../...
|
||||
.....\.......-........\...-.............................................|....||.........|...-......\..........
|
||||
............|......................../.....-........././..............................................\.....\.
|
||||
.\.........\......../........................-.............|........\../.../...-......\................|.....-
|
||||
....|................|/.....................\........|........................./|.....\...-../.|......../-....
|
||||
/..............-......-..............|..|.|.....................-\.|../...\..............................|.../
|
||||
....\/.........|\....-..............\......-.....................\............\........................\......
|
||||
......-...................\...............-/../........-.../....................\./..........-................
|
||||
..........................\.......|......\.|\....../......\......../........-/............................/.|.
|
||||
.......-....\...................................../..............|../.......|......./..........|--.......-....
|
||||
...-...|.............................|........-.....-.|...........|.....|..............\..............-.......
|
||||
-.\...........\......|.\.............................\...........|.........\.............../\.................
|
||||
...../....................\../|...........................\.........|..................|........\.|..-../.....
|
||||
.-....-../.................................\....../......|....../..............-...........-../...\.../.......
|
||||
.\........-............................../..-...................|/..........|............................/....
|
||||
../|..........|.........../...-....../.....|.-./...\....-....\|.\.....|........./.-.....\.....|./........|....
|
||||
............\.....\...................-.\-.-\|...............................\...............\.....-..........
|
||||
...|................-......................\....|..\.-..........|............../.....-...................../..
|
10
src/day16/sample.txt
Normal file
10
src/day16/sample.txt
Normal file
|
@ -0,0 +1,10 @@
|
|||
.|...\....
|
||||
|.-.\.....
|
||||
.....|-...
|
||||
........|.
|
||||
..........
|
||||
.........\
|
||||
..../.\\..
|
||||
.-.-/..|..
|
||||
.|....-|.\
|
||||
..//.|....
|
Loading…
Reference in New Issue
Block a user