2018-12-05 07:45:16 +01:00
use std ::fs ;
use std ::char ;
fn main ( ) {
let lines = fs ::read_to_string ( " input " ) . expect ( " Unable to read file " ) ;
//Part 1
println! ( " {} " , reduce ( lines . clone ( ) ) ) ;
//Part 2
let mut all_lengths : Vec < i32 > = Vec ::new ( ) ;
for i in 0 .. 26 {
let big_char = char ::from_u32 ( 65 + i ) . unwrap ( ) ;
let little_char = char ::from_u32 ( 97 + i ) . unwrap ( ) ;
let string = lines . clone ( ) . replace ( big_char , " " ) . replace ( little_char , " " ) ;
all_lengths . push ( reduce ( string ) ) ;
}
println! ( " {} " , all_lengths . iter ( ) . min ( ) . unwrap ( ) ) ;
}
fn reduce ( string : String ) -> i32 {
2018-12-05 08:22:03 +01:00
let all_chars : Vec < char > = string . chars ( ) . into_iter ( ) . collect ( ) ;
2018-12-05 07:45:16 +01:00
2018-12-05 08:22:03 +01:00
let mut stack : Vec < char > = Vec ::new ( ) ;
2018-12-05 07:45:16 +01:00
2018-12-05 08:22:03 +01:00
for c in all_chars {
if ! stack . is_empty ( ) {
let sub = * stack . last ( ) . unwrap ( ) as i32 - c as i32 ;
if sub = = 32 | | sub = = - 32 {
stack . pop ( ) ;
} else {
stack . push ( c . clone ( ) ) ;
2018-12-05 07:45:16 +01:00
}
2018-12-05 08:22:03 +01:00
} else {
stack . push ( c . clone ( ) ) ;
2018-12-05 07:45:16 +01:00
}
}
2018-12-05 08:22:03 +01:00
return stack . len ( ) as i32
}