11use std:: cmp:: min;
22use std:: collections:: HashMap ;
3- use rayon:: iter:: { IntoParallelRefIterator , ParallelIterator } ;
43use std:: str:: FromStr ;
54use std:: sync:: OnceLock ;
6- use itertools :: Itertools ;
5+
76use aoclp:: anyhow:: Context ;
87use aoclp:: regex:: Regex ;
98use aoclp:: solvers_impl:: input:: safe_get_input_as_many;
9+ use itertools:: Itertools ;
10+ use rayon:: iter:: { IntoParallelRefIterator , ParallelIterator } ;
1011
1112pub fn part_1 ( ) -> usize {
1213 input ( ) . iter ( ) . map ( Machine :: fewest_presses_for_lights) . sum ( )
1314}
1415
1516pub fn part_2 ( ) -> usize {
16- input ( ) . par_iter ( ) . map ( Machine :: fewest_presses_for_joltage) . sum ( )
17+ input ( )
18+ . par_iter ( )
19+ . map ( Machine :: fewest_presses_for_joltage)
20+ . sum ( )
1721}
1822
1923#[ derive( Debug , Clone ) ]
@@ -35,15 +39,13 @@ impl Machine {
3539 states = states
3640 . into_iter ( )
3741 . flat_map ( |l| {
38- self . button_wirings
39- . iter ( )
40- . map ( move |wiring| {
41- let mut next = l. clone ( ) ;
42- for w in wiring {
43- next[ * w] = !next[ * w]
44- }
45- next
46- } )
42+ self . button_wirings . iter ( ) . map ( move |wiring| {
43+ let mut next = l. clone ( ) ;
44+ for w in wiring {
45+ next[ * w] = !next[ * w]
46+ }
47+ next
48+ } )
4749 } )
4850 . unique ( )
4951 . collect ( ) ;
@@ -53,30 +55,44 @@ impl Machine {
5355
5456 fn fewest_presses_for_joltage ( & self ) -> usize {
5557 let mut cache = HashMap :: new ( ) ;
56- let presses = self . fewest_presses_for_joltage_from ( vec ! [ 0 ; self . joltage_reqs. len( ) ] , 0 , usize:: MAX , & mut cache) ;
58+ let presses = self . fewest_presses_for_joltage_from (
59+ vec ! [ 0 ; self . joltage_reqs. len( ) ] ,
60+ 0 ,
61+ usize:: MAX ,
62+ & mut cache,
63+ ) ;
5764 println ! ( "{presses}" ) ;
5865 presses
5966 }
6067
61- fn fewest_presses_for_joltage_from ( & self , cur : Vec < usize > , steps : usize , max_steps : usize , _cache : & mut HashMap < Vec < usize > , usize > ) -> usize {
68+ fn fewest_presses_for_joltage_from (
69+ & self ,
70+ cur : Vec < usize > ,
71+ steps : usize ,
72+ max_steps : usize ,
73+ _cache : & mut HashMap < Vec < usize > , usize > ,
74+ ) -> usize {
6275 if * cur == self . joltage_reqs {
6376 return steps;
6477 // } else if let Some(presses) = cache.get(&cur) {
6578 // return *presses;
66- } else if steps == max_steps || cur. iter ( ) . zip ( self . joltage_reqs . iter ( ) ) . any ( |( cur, req) | * cur > * req) {
79+ } else if steps == max_steps
80+ || cur
81+ . iter ( )
82+ . zip ( self . joltage_reqs . iter ( ) )
83+ . any ( |( cur, req) | * cur > * req)
84+ {
6785 return max_steps;
6886 }
6987
70- let presses = self . button_wirings
71- . iter ( )
72- . fold ( max_steps, |max, wiring| {
73- let mut next = cur. clone ( ) ;
74- for w in wiring {
75- next[ * w] += 1 ;
76- }
77- let next_presses = self . fewest_presses_for_joltage_from ( next, steps + 1 , max, _cache) ;
78- min ( max, next_presses)
79- } ) ;
88+ let presses = self . button_wirings . iter ( ) . fold ( max_steps, |max, wiring| {
89+ let mut next = cur. clone ( ) ;
90+ for w in wiring {
91+ next[ * w] += 1 ;
92+ }
93+ let next_presses = self . fewest_presses_for_joltage_from ( next, steps + 1 , max, _cache) ;
94+ min ( max, next_presses)
95+ } ) ;
8096 // cache.insert(cur, presses);
8197 presses
8298 }
@@ -91,16 +107,27 @@ impl FromStr for Machine {
91107 Regex :: new ( r"^\s*\[(?<lights>[.#]+)]\s+(?<buttons>(?:\((?:\d+,?)+\)\s+)+)\s*\{(?<joltage>(?:\d+,?)+)}\s*$" ) . unwrap ( )
92108 } ) ;
93109
94- let captures = re. captures ( s) . with_context ( || format ! ( "invalid machine spec: {s}" ) ) ?;
110+ let captures = re
111+ . captures ( s)
112+ . with_context ( || format ! ( "invalid machine spec: {s}" ) ) ?;
95113 let target_lights = & captures[ "lights" ] ;
96114 let button_wirings = & captures[ "buttons" ] ;
97115 let joltage_reqs = & captures[ "joltage" ] ;
98116
99117 let target_lights = target_lights. chars ( ) . map ( |c| c == '#' ) . collect ( ) ;
100- let button_wirings = button_wirings. split_ascii_whitespace ( ) . map ( |bw| {
101- bw[ 1 ..bw. len ( ) - 1 ] . split ( ',' ) . map ( |l| l. parse :: < usize > ( ) ) . try_collect ( )
102- } ) . try_collect ( ) ?;
103- let joltage_reqs = joltage_reqs. split ( ',' ) . map ( |j| j. parse :: < usize > ( ) ) . try_collect ( ) ?;
118+ let button_wirings = button_wirings
119+ . split_ascii_whitespace ( )
120+ . map ( |bw| {
121+ bw[ 1 ..bw. len ( ) - 1 ]
122+ . split ( ',' )
123+ . map ( |l| l. parse :: < usize > ( ) )
124+ . try_collect ( )
125+ } )
126+ . try_collect ( ) ?;
127+ let joltage_reqs = joltage_reqs
128+ . split ( ',' )
129+ . map ( |j| j. parse :: < usize > ( ) )
130+ . try_collect ( ) ?;
104131
105132 Ok ( Self { target_lights, button_wirings, joltage_reqs } )
106133 }
0 commit comments