11advent_of_code:: solution!( 19 ) ;
22
3- use advent_of_code :: maneatingape :: hash :: * ;
3+ use advent_of_code_macros :: memoize ;
44
55fn parse_data ( input : & str ) -> ( Vec < & str > , Vec < & str > ) {
66 let ( left, right) = input. split_once ( "\n \n " ) . unwrap ( ) ;
@@ -23,24 +23,21 @@ fn validate_message(message: &str, towels: &[&str]) -> bool {
2323 . any ( |towel| validate_message ( & message[ towel. len ( ) ..] , towels) )
2424}
2525
26- fn count_valid_message ( cache : & mut FastMap < String , u64 > , message : & str , towels : & [ & str ] ) -> u64 {
26+ fn count_valid_message_cache_key ( message : & str , _: & [ & str ] ) -> String {
27+ String :: from ( message)
28+ }
29+
30+ #[ memoize( key_function = "count_valid_message_cache_key -> String" ) ]
31+ fn count_valid_message ( message : & str , towels : & [ & str ] ) -> u64 {
2732 if message. is_empty ( ) {
2833 return 1 ;
2934 }
3035
31- if let Some ( & result) = cache. get ( message) {
32- return result;
33- }
34-
3536 towels
3637 . iter ( )
3738 . filter ( |towel| message. len ( ) >= towel. len ( ) )
3839 . filter ( |towel| & & & message[ ..towel. len ( ) ] == towel)
39- . map ( |towel| {
40- let result = count_valid_message ( cache, & message[ towel. len ( ) ..] , towels) ;
41- cache. insert ( String :: from ( & message[ towel. len ( ) ..] ) , result) ;
42- result
43- } )
40+ . map ( |towel| count_valid_message ( & message[ towel. len ( ) ..] , towels) )
4441 . sum ( )
4542}
4643
@@ -58,11 +55,9 @@ pub fn part_one(input: &str) -> Option<u32> {
5855pub fn part_two ( input : & str ) -> Option < u64 > {
5956 let ( towels, messages) = parse_data ( input) ;
6057
61- let mut cache = FastMap :: new ( ) ;
62-
6358 let result = messages
6459 . into_iter ( )
65- . map ( |message| count_valid_message ( & mut cache , message, & towels) )
60+ . map ( |message| count_valid_message ( message, & towels) )
6661 . sum ( ) ;
6762
6863 Some ( result)
0 commit comments