File tree Expand file tree Collapse file tree 2 files changed +47
-0
lines changed
Expand file tree Collapse file tree 2 files changed +47
-0
lines changed Original file line number Diff line number Diff line change 1+ Button A: X+94, Y+34
2+ Button B: X+22, Y+67
3+ Prize: X=8400, Y=5400
4+
5+ Button A: X+26, Y+66
6+ Button B: X+67, Y+21
7+ Prize: X=12748, Y=12176
8+
9+ Button A: X+17, Y+86
10+ Button B: X+84, Y+37
11+ Prize: X=7870, Y=6450
12+
13+ Button A: X+69, Y+23
14+ Button B: X+27, Y+71
15+ Prize: X=18641, Y=10279
Original file line number Diff line number Diff line change 1+ use regex:: Regex ;
2+
3+ advent_of_code:: solution!( 13 ) ;
4+
5+ #[ rustfmt:: skip]
6+ pub fn part_one ( input : & str ) -> Option < u64 > {
7+ Some ( input. split ( "\n \n " ) . map ( |machine|{ Regex :: new ( r"(?s)(\d+).+\+(\d+).+\+(\d+).+\+(\d+).+=(\d+).+=(\d+)" ) . unwrap ( ) . captures ( machine) . unwrap ( ) . iter ( ) . skip ( 1 ) . map ( |n|n. unwrap ( ) . as_str ( ) . parse :: < f64 > ( ) . unwrap ( ) ) . collect :: < Vec < _ > > ( ) } ) . map ( |m|{ let b=( m[ 5 ] * m[ 0 ] -m[ 4 ] * m[ 1 ] ) /( m[ 0 ] * m[ 3 ] -m[ 2 ] * m[ 1 ] ) ; if b. fract ( ) ==0.0 { let a=( m[ 4 ] -b* m[ 2 ] ) /m[ 0 ] ; return if a. fract ( ) ==0.0 { ( 3.0 * a+b) as u64 } else { 0 } } 0 } ) . sum ( ) )
8+ }
9+
10+ const D : f64 = 10000000000000.0 ;
11+
12+ #[ rustfmt:: skip]
13+ pub fn part_two ( input : & str ) -> Option < u64 > {
14+ Some ( input. split ( "\n \n " ) . map ( |machine|{ Regex :: new ( r"(?s)(\d+).+\+(\d+).+\+(\d+).+\+(\d+).+=(\d+).+=(\d+)" ) . unwrap ( ) . captures ( machine) . unwrap ( ) . iter ( ) . skip ( 1 ) . map ( |n|n. unwrap ( ) . as_str ( ) . parse :: < f64 > ( ) . unwrap ( ) ) . collect :: < Vec < _ > > ( ) } ) . map ( |m|{ let b=( ( D +m[ 5 ] ) * m[ 0 ] -( D +m[ 4 ] ) * m[ 1 ] ) /( m[ 0 ] * m[ 3 ] -m[ 2 ] * m[ 1 ] ) ; if b. fract ( ) ==0.0 { let a=( ( D +m[ 4 ] ) -b* m[ 2 ] ) /m[ 0 ] ; return if a. fract ( ) ==0.0 { ( 3.0 * a+b) as u64 } else { 0 } } 0 } ) . sum ( ) )
15+ }
16+
17+ #[ cfg( test) ]
18+ mod tests {
19+ use super :: * ;
20+
21+ #[ test]
22+ fn test_part_one ( ) {
23+ let result = part_one ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
24+ assert_eq ! ( result, Some ( 480 ) ) ;
25+ }
26+
27+ #[ test]
28+ fn test_part_two ( ) {
29+ let result = part_two ( & advent_of_code:: template:: read_file ( "examples" , DAY ) ) ;
30+ assert_eq ! ( result, Some ( 875318608908 ) ) ;
31+ }
32+ }
You can’t perform that action at this time.
0 commit comments