Skip to content

Commit eab7917

Browse files
committed
Miscellaneous improvements
1 parent 1b160fb commit eab7917

File tree

7 files changed

+138
-153
lines changed

7 files changed

+138
-153
lines changed

rs/src/day10.rs

+19-20
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ enum Direction {
1111
}
1212

1313
#[dynamic]
14-
static LUT: BTreeMap<(Direction, char), Direction> = [
15-
((Direction::U, '|'), Direction::U),
16-
((Direction::U, '7'), Direction::L),
17-
((Direction::U, 'F'), Direction::R),
18-
((Direction::L, '-'), Direction::L),
19-
((Direction::L, 'F'), Direction::D),
20-
((Direction::L, 'L'), Direction::U),
21-
((Direction::D, '|'), Direction::D),
22-
((Direction::D, 'L'), Direction::R),
23-
((Direction::D, 'J'), Direction::L),
24-
((Direction::R, '-'), Direction::R),
25-
((Direction::R, 'J'), Direction::U),
26-
((Direction::R, '7'), Direction::D),
14+
static LUT: BTreeMap<(Direction, u8), Direction> = [
15+
((Direction::U, b'|'), Direction::U),
16+
((Direction::U, b'7'), Direction::L),
17+
((Direction::U, b'F'), Direction::R),
18+
((Direction::L, b'-'), Direction::L),
19+
((Direction::L, b'F'), Direction::D),
20+
((Direction::L, b'L'), Direction::U),
21+
((Direction::D, b'|'), Direction::D),
22+
((Direction::D, b'L'), Direction::R),
23+
((Direction::D, b'J'), Direction::L),
24+
((Direction::R, b'-'), Direction::R),
25+
((Direction::R, b'J'), Direction::U),
26+
((Direction::R, b'7'), Direction::D),
2727
]
2828
.into();
2929

@@ -36,19 +36,18 @@ fn step((y, x): (usize, usize), dir: Direction) -> Option<(usize, usize)> {
3636
})
3737
}
3838

39-
fn part1_helper(maze: &[&str]) -> Option<Vec<(usize, usize)>> {
39+
fn part1_helper(maze: &[&[u8]]) -> Option<Vec<(usize, usize)>> {
4040
for (y, line) in maze.iter().enumerate() {
41-
for (x, char) in line.char_indices() {
42-
if char != 'S' {
41+
for (x, char) in line.iter().enumerate() {
42+
if *char != b'S' {
4343
continue;
4444
}
4545
let start_pos = (y, x);
4646
for mut dir in [Direction::U, Direction::L, Direction::D, Direction::R] {
4747
let mut pos = start_pos;
4848
let mut path = iter::from_fn(|| {
4949
pos = step(pos, dir)?;
50-
dir =
51-
*LUT.get(&(dir, maze[pos.0..].iter().next()?[pos.1..].chars().next()?))?;
50+
dir = *LUT.get(&(dir, maze[pos.0][pos.1]))?;
5251
Some(pos)
5352
})
5453
.collect::<Vec<_>>();
@@ -63,11 +62,11 @@ fn part1_helper(maze: &[&str]) -> Option<Vec<(usize, usize)>> {
6362
}
6463

6564
pub fn part1(data: &str) -> Option<usize> {
66-
Some(part1_helper(&data.lines().collect::<Vec<_>>())?.len() / 2)
65+
Some(part1_helper(&data.lines().map(|line| line.as_bytes()).collect::<Vec<_>>())?.len() / 2)
6766
}
6867

6968
pub fn part2(data: &str) -> Option<usize> {
70-
let path = part1_helper(&data.lines().collect::<Vec<_>>())?;
69+
let path = part1_helper(&data.lines().map(|line| line.as_bytes()).collect::<Vec<_>>())?;
7170
let (n, m) = path
7271
.iter()
7372
.zip(path[1..].iter().chain(path.iter()))

rs/src/day11.rs

+14-18
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
fn solve(data: &str, n: usize) -> usize {
2-
let lines = data.lines().collect::<Vec<_>>();
2+
let mut counts = Vec::<usize>::new();
33
solve1(
4-
&lines
5-
.iter()
6-
.map(|line| line.chars().filter(|&c| c == '#').count())
7-
.collect::<Vec<_>>(),
8-
n,
9-
) + solve1(
10-
&(0..lines
11-
.iter()
12-
.map(|line| line.len())
13-
.max()
14-
.unwrap_or_default())
15-
.map(|x| {
16-
lines
17-
.iter()
18-
.filter(|line| line[x..].starts_with('#'))
19-
.count()
4+
&data
5+
.lines()
6+
.map(|line| {
7+
let mut count = 0;
8+
counts.extend(std::iter::repeat(0).take(line.len()).skip(counts.len()));
9+
for (i, c) in line.char_indices() {
10+
if c == '#' {
11+
counts[i] += 1;
12+
count += 1;
13+
}
14+
}
15+
count
2016
})
2117
.collect::<Vec<_>>(),
2218
n,
23-
)
19+
) + solve1(&counts, n)
2420
}
2521

2622
fn solve1(data: &[usize], n: usize) -> usize {

rs/src/day12.rs

+11-10
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ fn solve<const N: usize>(line: &str) -> Option<usize> {
88
.map(|x| x.parse::<usize>().ok())
99
.collect::<Option<Vec<_>>>()?;
1010
let string = Itertools::intersperse([&lhs; N].into_iter(), &"?")
11-
.flat_map(|s| s.chars())
11+
.flat_map(|s| s.as_bytes())
12+
.copied()
1213
.collect::<Vec<_>>();
1314
let runs = [&rhs; N].into_iter().flatten().copied().collect::<Vec<_>>();
1415
let last_run = runs.last()?;
1516
let counts = runs.iter().rev().skip(1).fold(
1617
(0..string.len())
1718
.map(|i| {
1819
if i + last_run > string.len()
19-
|| i != 0 && string[i - 1] == '#'
20-
|| string[i..i + last_run].iter().any(|&c| c == '.')
21-
|| string[i + last_run..].iter().any(|&c| c == '#')
20+
|| i != 0 && string[i - 1] == b'#'
21+
|| string[i..i + last_run].iter().any(|&c| c == b'.')
22+
|| string[i + last_run..].iter().any(|&c| c == b'#')
2223
{
2324
0
2425
} else {
@@ -30,9 +31,9 @@ fn solve<const N: usize>(line: &str) -> Option<usize> {
3031
(0..string.len())
3132
.map(|i| {
3233
if i + run >= string.len()
33-
|| i != 0 && string[i - 1] == '#'
34-
|| string[i..i + run].iter().any(|&c| c == '.')
35-
|| string[i + run] == '#'
34+
|| i != 0 && string[i - 1] == b'#'
35+
|| string[i..i + run].iter().any(|&c| c == b'.')
36+
|| string[i + run] == b'#'
3637
{
3738
0
3839
} else {
@@ -41,8 +42,8 @@ fn solve<const N: usize>(line: &str) -> Option<usize> {
4142
.zip(
4243
string[i + run + 1..]
4344
.iter()
44-
.take_while(|&&c| c != '#')
45-
.chain([&'#']),
45+
.take_while(|&&c| c != b'#')
46+
.chain([&b'#']),
4647
)
4748
.map(|(&count, _)| count)
4849
.sum()
@@ -54,7 +55,7 @@ fn solve<const N: usize>(line: &str) -> Option<usize> {
5455
Some(
5556
counts
5657
.into_iter()
57-
.zip(string.into_iter().take_while(|&c| c != '#').chain(['#']))
58+
.zip(string.into_iter().take_while(|&c| c != b'#').chain([b'#']))
5859
.map(|(count, _)| count)
5960
.sum(),
6061
)

rs/src/day13.rs

+23-18
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,14 @@ fn find_reflection<T: Eq, F: Fn(&[T], &[T]) -> bool>(data: &[T], eq: F) -> usize
44
.unwrap_or_default()
55
}
66

7-
fn solve<F: Fn(&[&str], &[&str]) -> bool>(lines: &[&str], eq: F) -> usize {
7+
fn solve<F: Fn(&[&[u8]], &[&[u8]]) -> bool>(lines: &[&[u8]], eq: F) -> usize {
88
let width = lines
99
.iter()
1010
.map(|line| line.len())
1111
.max()
1212
.unwrap_or_default();
1313
let transpose = (0..width)
14-
.map(|i| {
15-
lines
16-
.iter()
17-
.flat_map(|line| line[i..i + 1].chars())
18-
.collect::<String>()
19-
})
14+
.map(|i| lines.iter().map(|line| line[i]).collect::<Vec<_>>())
2015
.collect::<Vec<_>>();
2116
let transpose = transpose.iter().map(|line| &line[..]).collect::<Vec<_>>();
2217

@@ -26,24 +21,34 @@ fn solve<F: Fn(&[&str], &[&str]) -> bool>(lines: &[&str], eq: F) -> usize {
2621
pub fn part1(data: &str) -> usize {
2722
data.split("\n\n")
2823
.map(|group| {
29-
solve(&group.lines().collect::<Vec<_>>(), |x, y| {
30-
x.iter().rev().zip(y.iter()).all(|(a, b)| a == b)
31-
})
24+
solve(
25+
&group
26+
.lines()
27+
.map(|line| line.as_bytes())
28+
.collect::<Vec<_>>(),
29+
|x, y| x.iter().rev().zip(y.iter()).all(|(a, b)| a == b),
30+
)
3231
})
3332
.sum()
3433
}
3534

3635
pub fn part2(data: &str) -> usize {
3736
data.split("\n\n")
3837
.map(|group| {
39-
solve(&group.lines().collect::<Vec<_>>(), |x, y| {
40-
let mut iter = x
41-
.iter()
42-
.rev()
43-
.zip(y.iter())
44-
.flat_map(|(a, b)| a.chars().zip(b.chars()).filter(|(c, d)| c != d));
45-
iter.next().is_some() && iter.next().is_none()
46-
})
38+
solve(
39+
&group
40+
.lines()
41+
.map(|line| line.as_bytes())
42+
.collect::<Vec<_>>(),
43+
|x, y| {
44+
let mut iter = x
45+
.iter()
46+
.rev()
47+
.zip(y.iter())
48+
.flat_map(|(a, b)| a.iter().zip(b.iter()).filter(|(c, d)| c != d));
49+
iter.next().is_some() && iter.next().is_none()
50+
},
51+
)
4752
})
4853
.sum()
4954
}

rs/src/day16.rs

+22-20
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@ enum Direction {
1212
}
1313

1414
#[dynamic]
15-
static LUT: BTreeMap<(Direction, char), &'static [Direction]> = {
15+
static LUT: BTreeMap<(Direction, u8), &'static [Direction]> = {
1616
static DIRECTIONS: [Direction; 4] = [Direction::U, Direction::D, Direction::L, Direction::R];
1717
[
18-
((Direction::U, '/'), &DIRECTIONS[3..4]),
19-
((Direction::U, '\\'), &DIRECTIONS[2..3]),
20-
((Direction::U, '-'), &DIRECTIONS[2..4]),
21-
((Direction::L, '/'), &DIRECTIONS[1..2]),
22-
((Direction::L, '\\'), &DIRECTIONS[0..1]),
23-
((Direction::L, '|'), &DIRECTIONS[0..2]),
24-
((Direction::D, '/'), &DIRECTIONS[2..3]),
25-
((Direction::D, '\\'), &DIRECTIONS[3..4]),
26-
((Direction::D, '-'), &DIRECTIONS[2..4]),
27-
((Direction::R, '/'), &DIRECTIONS[0..1]),
28-
((Direction::R, '\\'), &DIRECTIONS[1..2]),
29-
((Direction::R, '|'), &DIRECTIONS[0..2]),
18+
((Direction::U, b'/'), &DIRECTIONS[3..4]),
19+
((Direction::U, b'\\'), &DIRECTIONS[2..3]),
20+
((Direction::U, b'-'), &DIRECTIONS[2..4]),
21+
((Direction::L, b'/'), &DIRECTIONS[1..2]),
22+
((Direction::L, b'\\'), &DIRECTIONS[0..1]),
23+
((Direction::L, b'|'), &DIRECTIONS[0..2]),
24+
((Direction::D, b'/'), &DIRECTIONS[2..3]),
25+
((Direction::D, b'\\'), &DIRECTIONS[3..4]),
26+
((Direction::D, b'-'), &DIRECTIONS[2..4]),
27+
((Direction::R, b'/'), &DIRECTIONS[0..1]),
28+
((Direction::R, b'\\'), &DIRECTIONS[1..2]),
29+
((Direction::R, b'|'), &DIRECTIONS[0..2]),
3030
]
3131
.into()
3232
};
@@ -40,14 +40,11 @@ fn step(y: usize, x: usize, dir: Direction) -> Option<(usize, usize)> {
4040
})
4141
}
4242

43-
fn fill(data: &[&str], y: usize, x: usize, d: Direction) -> Option<usize> {
43+
fn fill(data: &[&[u8]], y: usize, x: usize, d: Direction) -> Option<usize> {
4444
let mut stack = vec![(y, x, d)];
4545
let mut visited = stack.iter().copied().collect::<BTreeSet<_>>();
4646
while let Some((y, x, d)) = stack.pop() {
47-
for &d in *LUT
48-
.get(&(d, data[y][x..].chars().next()?))
49-
.unwrap_or(&&[d][..])
50-
{
47+
for &d in *LUT.get(&(d, data[y][x])).unwrap_or(&&[d][..]) {
5148
let Some((y, x)) = step(y, x, d) else {
5249
continue;
5350
};
@@ -66,11 +63,16 @@ fn fill(data: &[&str], y: usize, x: usize, d: Direction) -> Option<usize> {
6663
}
6764

6865
pub fn part1(data: &str) -> Option<usize> {
69-
fill(&data.lines().collect::<Vec<_>>(), 0, 0, Direction::R)
66+
fill(
67+
&data.lines().map(|line| line.as_bytes()).collect::<Vec<_>>(),
68+
0,
69+
0,
70+
Direction::R,
71+
)
7072
}
7173

7274
pub fn part2(data: &str) -> Option<usize> {
73-
let data = data.lines().collect::<Vec<_>>();
75+
let data = data.lines().map(|line| line.as_bytes()).collect::<Vec<_>>();
7476
(0..data.len())
7577
.map(|y| (y, 0, Direction::R))
7678
.chain((0..data.first()?.len()).map(|x| (0, x, Direction::D)))

rs/src/day17.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ where
4242
P: Fn(usize) -> bool,
4343
F: Fn(Direction, usize) -> T,
4444
T: IntoIterator,
45-
<T as IntoIterator>::Item: Into<Direction>,
45+
T::Item: Into<Direction>,
4646
{
4747
let maze = data
4848
.lines()

0 commit comments

Comments
 (0)