diff options
Diffstat (limited to '03/src/part-1.rs')
-rw-r--r-- | 03/src/part-1.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/03/src/part-1.rs b/03/src/part-1.rs new file mode 100644 index 0000000..f682ef3 --- /dev/null +++ b/03/src/part-1.rs @@ -0,0 +1,54 @@ +use std::io::{BufRead}; + +fn main() { + let stdin = std::io::stdin(); + let mut handle = stdin.lock(); + + let mut buf: Vec<u8> = Vec::new(); + + let mut result: usize = 0; + loop { + buf.clear(); + let num_bytes = handle.read_until(b'\n', &mut buf).expect("IO error"); + if num_bytes == 0 { break; } + + assert!(buf.len() >= 2); + assert_eq!((buf.len() - 1) % 2, 0); + + let half_idx: usize = (buf.len() - 1) / 2; + + let half_0: & [u8] = &(buf[0..half_idx]); + let half_1: & [u8] = &(buf[half_idx..buf.len()-1]); + + let mut set_0: u64 = 0; + let mut set_1: u64 = 0; + + for c in half_0 { + if *c <= 90 { + set_0 |= 1 << (*c - b'A'); + } + else { + set_0 |= 1 << (*c - b'a' + 26); + } + } + for c in half_1 { + if *c <= 90 { + set_1 |= 1 << (*c - b'A'); + } + else { + set_1 |= 1 << (*c - b'a' + 26); + } + } + + let common: u64 = set_0 & set_1; + for i in 0..26 { + if common & (1 << i) != 0 { + result += 26 + i + 1; + } + if common & (1 << (26 + i)) != 0 { + result += i + 1; + } + } + } + println!("{}", result); +} |