1- use std:: {
2- collections:: { HashMap , HashSet } ,
3- convert:: identity,
4- } ;
1+ use std:: { collections:: HashMap , convert:: identity} ;
52
63use aoc_lib:: { direction:: cardinal:: Direction , matrix:: Grid } ;
74use common:: { Answer , solution} ;
8- use nd_vec:: vector;
5+ use nd_vec:: { Vec2 , vector} ;
96
107solution ! ( "Laboratories" , 7 ) ;
118
129fn part_a ( input : & str ) -> Answer {
13- let grid = Grid :: parse ( input, identity) ;
14- let start = grid. find ( 'S' ) . unwrap ( ) ;
15-
16- let mut beams = HashSet :: new ( ) ;
17- beams. insert ( start) ;
18-
19- let mut out = 0 ;
20-
21- loop {
22- let mut next_beams = HashSet :: new ( ) ;
23- for beam in beams. iter ( ) {
24- let next = Direction :: Down . advance ( * beam) ;
25- let Some ( tile) = grid. get ( next) else {
26- continue ;
27- } ;
28-
29- if * tile == '^' {
30- out += 1 ;
31- next_beams. insert ( next - vector ! ( 1 , 0 ) ) ;
32- next_beams. insert ( next + vector ! ( 1 , 0 ) ) ;
33- } else {
34- next_beams. insert ( next) ;
35- }
36- }
37-
38- if next_beams. is_empty ( ) {
39- break ;
40- }
41-
42- beams = next_beams;
43- }
44-
45- out. into ( )
10+ solve ( input) . 1 . into ( )
4611}
4712
4813fn part_b ( input : & str ) -> Answer {
14+ let ( beams, _) = solve ( input) ;
15+ beams. iter ( ) . map ( |x| x. 1 ) . sum :: < u64 > ( ) . into ( )
16+ }
17+
18+ fn solve ( input : & str ) -> ( HashMap < Vec2 < usize > , u64 > , u64 ) {
4919 let grid = Grid :: parse ( input, identity) ;
5020 let start = grid. find ( 'S' ) . unwrap ( ) ;
5121
22+ let mut out = 0 ;
5223 let mut beams = HashMap :: new ( ) ;
53- beams. insert ( start, 1_u64 ) ;
54-
55- // let mut out = 0;
24+ beams. insert ( start, 1 ) ;
5625
5726 loop {
5827 let mut next_beams = HashMap :: new ( ) ;
@@ -63,22 +32,22 @@ fn part_b(input: &str) -> Answer {
6332 } ;
6433
6534 if * tile == '^' {
35+ out += 1 ;
6636 * next_beams. entry ( next - vector ! ( 1 , 0 ) ) . or_default ( ) += * count;
6737 * next_beams. entry ( next + vector ! ( 1 , 0 ) ) . or_default ( ) += * count;
6838 } else {
6939 * next_beams. entry ( next) . or_default ( ) += * count;
7040 }
7141 }
7242
73- println ! ( "count : {}" , next_beams. len( ) ) ;
7443 if next_beams. is_empty ( ) {
7544 break ;
7645 }
7746
7847 beams = next_beams;
7948 }
8049
81- beams . iter ( ) . map ( |x| x . 1 ) . sum :: < u64 > ( ) . into ( )
50+ ( beams , out )
8251}
8352
8453#[ cfg( test) ]
0 commit comments