@@ -12,24 +12,25 @@ use std::ops::RangeInclusive;
1212use itertools:: Itertools ;
1313use num:: Integer ;
1414
15- use crate :: AoCError ;
15+ use crate :: { AoCError , AoCResult } ;
1616
17- pub fn part_1 ( data : crate :: DataIn ) -> crate :: AoCResult < String > {
17+ fn rangify ( data : crate :: DataIn ) -> AoCResult < Vec < RangeInclusive < u64 > > > {
1818 // damn references
1919 let lines = data. collect_vec ( ) ;
20- let ranges : Vec < RangeInclusive < u64 > > = lines
20+ lines
2121 . iter ( )
2222 . flat_map ( |line| line. split ( ',' ) )
2323 . map ( |raw| {
2424 raw. split_once ( '-' )
2525 . ok_or_else ( || AoCError :: new ( format ! ( "Line {raw} is missing a -!" ) ) )
2626 . and_then ( |( start, end) | Ok ( ( start. parse ( ) ?) ..=( end. parse ( ) ?) ) )
2727 } )
28- . try_collect ( ) ? ;
29-
30- log :: debug! ( "Collected ranges: {ranges:?}" ) ;
28+ . try_collect ( )
29+ . inspect ( |ranges| log :: debug! ( "Collected ranges: {ranges:?}" ) )
30+ }
3131
32- let ret: u64 = ranges
32+ pub fn part_1 ( data : crate :: DataIn ) -> crate :: AoCResult < String > {
33+ let ret: u64 = rangify ( data) ?
3334 . into_iter ( )
3435 . flat_map ( |range| {
3536 range. filter ( |num| {
@@ -50,12 +51,43 @@ pub fn part_1(data: crate::DataIn) -> crate::AoCResult<String> {
5051 Ok ( ret. to_string ( ) )
5152}
5253
54+ pub fn part_2 ( data : crate :: DataIn ) -> crate :: AoCResult < String > {
55+ let ret: u64 = rangify ( data) ?
56+ . into_iter ( )
57+ . flat_map ( |range| {
58+ range. filter ( |num| {
59+ // safety: this string is made of numbers which are all going to be ascii
60+ // characters unless something has gone catastrophically wrong
61+ let numstr = num. to_string ( ) ;
62+ let len = numstr. len ( ) ;
63+ let max_len = len / 2 ;
64+
65+ // This takes 6 seconds but whatever 😭
66+ ( 1 ..=max_len) . any ( |size| {
67+ let substr = & numstr[ 0 ..size] ;
68+ numstr
69+ . chars ( )
70+ . chunks ( size)
71+ . into_iter ( )
72+ . all ( |window| window. collect :: < String > ( ) == substr)
73+ } )
74+ } )
75+ } )
76+ . inspect ( |serial| log:: debug!( "Found invalid serial number {serial}" ) )
77+ . sum ( ) ;
78+
79+ Ok ( ret. to_string ( ) )
80+ }
81+
5382inventory:: submit!( crate :: AoCDay {
5483 year: "2025" ,
5584 day: "2" ,
5685 part_1: crate :: AoCPart {
5786 main: part_1,
5887 example: part_1
5988 } ,
60- part_2: None
89+ part_2: Some ( crate :: AoCPart {
90+ main: part_2,
91+ example: part_2
92+ } )
6193} ) ;
0 commit comments