diff options
Diffstat (limited to '03/src/part-2.rs')
-rw-r--r-- | 03/src/part-2.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/03/src/part-2.rs b/03/src/part-2.rs new file mode 100644 index 0000000..e3cda54 --- /dev/null +++ b/03/src/part-2.rs @@ -0,0 +1,76 @@ +use std::io::{BufRead}; + +const GROUP_SIZE: usize = 3; + +fn main() { + let stdin = std::io::stdin(); + let mut handle = stdin.lock(); + + let all_ones: u64 = { + let mut ret: u64 = 0; + for i in 0..64 { + ret |= 1 << i; + } + ret + }; + + let mut result: usize = 0; + let mut buf: Vec<u8> = Vec::new(); + let mut done: bool = false; + + loop { + let mut set: u64 = all_ones; + + for i in 0..GROUP_SIZE { + buf.clear(); + let num_bytes = handle.read_until(b'\n', &mut buf).expect("IO error"); + if num_bytes == 0 { + if i == 0 { + done = true; + break; + } + else { panic!("Malformed input"); } + } + + let stripped_buf: & [u8] = { + if buf[buf.len() - 1] == b'\n' { + & buf[0..buf.len()-1] + } + else { + & buf + } + }; + + assert!(!stripped_buf.is_empty()); + + let mut seen: u64 = 0; + + for &c in stripped_buf { + assert!((c >= 65 && c <= 90) || (c >= 97 && c <= 122)); + if c <= 90 { + seen |= 1 << (c - b'A'); + } + else { + seen |= 1 << (c - b'a' + 26); + } + } + set &= seen; + } + + if done { break; } + + assert_eq!(set.count_ones(), 1); + + for i in 0..26 { + if set & (1 << i) != 0 { + result += 26 + i + 1; + break; + } + if set & (1 << (26 + i)) != 0 { + result += i + 1; + break; + } + } + } + println!("{}", result); +} |