2022-12-20 22:14:25 +01:00
#![ feature(test) ]
extern crate test ;
use aoc2022 ::{ boilerplate , common ::* } ;
use std ::{ collections ::VecDeque , iter ::repeat } ;
const DAY : usize = 20 ;
2022-12-20 22:39:21 +01:00
type Parsed = Vec < isize > ;
2022-12-20 22:14:25 +01:00
fn parse_input ( raw : & str ) -> Parsed {
2022-12-20 22:39:21 +01:00
raw . lines ( ) . map ( | l | l . parse ( ) . unwrap ( ) ) . collect ( )
2022-12-20 22:14:25 +01:00
}
fn part1 ( parsed : & Parsed ) -> isize {
2022-12-20 22:39:21 +01:00
let mut xs : VecDeque < _ > = parsed . iter ( ) . copied ( ) . zip ( repeat ( false ) ) . collect ( ) ;
2022-12-20 22:14:25 +01:00
let mut moved = 0 ;
while moved < parsed . len ( ) {
let x = xs . pop_front ( ) . unwrap ( ) ;
if x . 1 {
xs . push_back ( x ) ;
} else {
xs . insert ( ( ( x . 0 + ( xs . len ( ) * 2 ) as isize ) % xs . len ( ) as isize ) as usize , ( x . 0 , true ) ) ;
moved + = 1 ;
}
}
let i = xs . iter ( ) . position ( | ( x , _ ) | x = = & 0 ) . unwrap ( ) ;
xs . rotate_left ( i ) ;
xs . rotate_left ( 1000 % parsed . len ( ) ) ;
let a = xs . front ( ) . unwrap ( ) . 0 ;
xs . rotate_left ( 1000 % parsed . len ( ) ) ;
let b = xs . front ( ) . unwrap ( ) . 0 ;
xs . rotate_left ( 1000 % parsed . len ( ) ) ;
let c = xs . front ( ) . unwrap ( ) . 0 ;
a + b + c
}
2022-12-20 22:39:21 +01:00
const DECRYPTION_KEY : isize = 811589153 ;
fn part2 ( parsed : & Parsed ) -> isize {
let mut xs : VecDeque < _ > = parsed . iter ( ) . enumerate ( ) . map ( | ( p , x ) | ( p , x * DECRYPTION_KEY ) ) . collect ( ) ;
for i in 0 .. 10 {
dbg! ( i , & xs ) ;
let mut moved = 0 ;
while moved < parsed . len ( ) {
let i = xs . iter ( ) . position ( | ( x , _ ) | x = = & moved ) . unwrap ( ) ;
xs . rotate_left ( i ) ;
let x = xs . pop_front ( ) . unwrap ( ) ;
let idx = ( ( x . 1 + ( xs . len ( ) * 2 * DECRYPTION_KEY as usize ) as isize ) % xs . len ( ) as isize ) as usize ;
dbg! ( " Inserting at " , idx ) ;
xs . insert ( idx , x ) ;
moved + = 1 ;
}
}
let i = xs . iter ( ) . position ( | ( _ , x ) | x = = & 0 ) . unwrap ( ) ;
xs . rotate_left ( i ) ;
xs . rotate_left ( 1000 % parsed . len ( ) ) ;
let a = xs . front ( ) . unwrap ( ) . 1 ;
xs . rotate_left ( 1000 % parsed . len ( ) ) ;
let b = xs . front ( ) . unwrap ( ) . 1 ;
xs . rotate_left ( 1000 % parsed . len ( ) ) ;
let c = xs . front ( ) . unwrap ( ) . 1 ;
a + b + c
2022-12-20 22:14:25 +01:00
}
boilerplate! {
TEST_INPUT = = " 1
2
- 3
3
- 2
0
4 " ,
tests : {
part1 : { TEST_INPUT = > 3 } ,
2022-12-20 22:39:21 +01:00
part2 : { TEST_INPUT = > 1623178306 } ,
2022-12-20 22:14:25 +01:00
} ,
bench1 = = 23321 ,
2022-12-20 22:39:21 +01:00
bench2 = = 1428396909280 ,
bench_parse : Vec ::len = > 5000 ,
2022-12-20 22:14:25 +01:00
}