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