File tree Expand file tree Collapse file tree 3 files changed +112
-1
lines changed Expand file tree Collapse file tree 3 files changed +112
-1
lines changed Original file line number Diff line number Diff line change @@ -35,8 +35,9 @@ Solutions for [Advent of Code](https://adventofcode.com/) in [Rust](https://www.
35
35
| [ Day 22] ( ./src/bin/22.rs ) | ` 624.7µs ` | ` 8.1ms ` |
36
36
| [ Day 23] ( ./src/bin/23.rs ) | ` 157.2µs ` | ` 620.5µs ` |
37
37
| [ Day 24] ( ./src/bin/24.rs ) | ` 61.8µs ` | ` 16.9µs ` |
38
+ | [ Day 25] ( ./src/bin/25.rs ) | ` 88.7µs ` | ` 84.3µs ` |
38
39
39
- ** Total: 26.27ms **
40
+ ** Total: 26.45ms **
40
41
<!-- - benchmarking table --->
41
42
42
43
---
Original file line number Diff line number Diff line change
1
+ #####
2
+ .####
3
+ .####
4
+ .####
5
+ .#.#.
6
+ .#...
7
+ .....
8
+
9
+ #####
10
+ ##.##
11
+ .#.##
12
+ ...##
13
+ ...#.
14
+ ...#.
15
+ .....
16
+
17
+ .....
18
+ #....
19
+ #....
20
+ #...#
21
+ #.#.#
22
+ #.###
23
+ #####
24
+
25
+ .....
26
+ .....
27
+ #.#..
28
+ ###..
29
+ ###.#
30
+ ###.#
31
+ #####
32
+
33
+ .....
34
+ .....
35
+ .....
36
+ #....
37
+ #.#..
38
+ #.#.#
39
+ #####
Original file line number Diff line number Diff line change
1
+ use itertools:: Itertools ;
2
+
3
+ advent_of_code:: solution!( 25 ) ;
4
+
5
+ const WIDTH : usize = 5 ;
6
+ const HEIGHT : usize = 6 ;
7
+
8
+ fn parse_input ( input : & str ) -> ( Vec < [ usize ; WIDTH ] > , Vec < [ usize ; WIDTH ] > ) {
9
+ let mut keys = Vec :: new ( ) ;
10
+ let mut padlocks = Vec :: new ( ) ;
11
+
12
+ for block in input. split ( "\n \n " ) {
13
+ let mut data = [ 0 ; WIDTH ] ;
14
+ for line in block. lines ( ) . filter ( |l| !l. is_empty ( ) ) {
15
+ for ( i, c) in line. chars ( ) . enumerate ( ) {
16
+ if c == '#' {
17
+ data[ i] += 1 ;
18
+ }
19
+ }
20
+ }
21
+ let is_padlock = block. lines ( ) . next ( ) . unwrap ( ) == "#" . repeat ( WIDTH ) ;
22
+
23
+ if is_padlock {
24
+ padlocks. push ( data) ;
25
+ } else {
26
+ keys. push ( data) ;
27
+ }
28
+ }
29
+
30
+ ( keys, padlocks)
31
+ }
32
+
33
+ pub fn part_one ( input : & str ) -> Option < usize > {
34
+ let ( keys, padlocks) = parse_input ( input) ;
35
+
36
+ let overlaps = keys
37
+ . iter ( )
38
+ . cartesian_product ( padlocks. iter ( ) )
39
+ . filter ( |( & key, & padlock) | {
40
+ let overlap = key
41
+ . iter ( )
42
+ . zip ( padlock. iter ( ) )
43
+ . any ( |( k, p) | * k + * p > ( HEIGHT + 1 ) ) ;
44
+
45
+ !overlap
46
+ } )
47
+ . count ( ) ;
48
+
49
+ Some ( overlaps)
50
+ }
51
+
52
+ pub fn part_two ( input : & str ) -> Option < usize > {
53
+ part_one ( input)
54
+ }
55
+
56
+ #[ cfg( test) ]
57
+ mod tests {
58
+ use super :: * ;
59
+
60
+ #[ test]
61
+ fn test_part_one ( ) {
62
+ let result = part_one ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
63
+ assert_eq ! ( result, Some ( 3 ) ) ;
64
+ }
65
+
66
+ #[ test]
67
+ fn test_part_two ( ) {
68
+ let result = part_two ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
69
+ assert_eq ! ( result, Some ( 3 ) ) ;
70
+ }
71
+ }
You can’t perform that action at this time.
0 commit comments