summaryrefslogtreecommitdiff
path: root/03/src/part-2.rs
diff options
context:
space:
mode:
Diffstat (limited to '03/src/part-2.rs')
-rw-r--r--03/src/part-2.rs76
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);
+}