summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--day2/Cargo.lock4
-rw-r--r--day2/Cargo.toml6
-rw-r--r--day2/src/main.rs88
4 files changed, 101 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3e89409
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+target/
+**/*.rs.bk
+input.txt
diff --git a/day2/Cargo.lock b/day2/Cargo.lock
new file mode 100644
index 0000000..3faaae6
--- /dev/null
+++ b/day2/Cargo.lock
@@ -0,0 +1,4 @@
+[[package]]
+name = "day2"
+version = "0.1.0"
+
diff --git a/day2/Cargo.toml b/day2/Cargo.toml
new file mode 100644
index 0000000..4848f85
--- /dev/null
+++ b/day2/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "day2"
+version = "0.1.0"
+authors = ["Jan Tuomi <jan.tuomi@eficode.com>"]
+
+[dependencies]
diff --git a/day2/src/main.rs b/day2/src/main.rs
new file mode 100644
index 0000000..9a68b3a
--- /dev/null
+++ b/day2/src/main.rs
@@ -0,0 +1,88 @@
+use std::env;
+use std::io::BufReader;
+use std::io::BufRead;
+use std::fs::File;
+use std::process;
+use std::collections::HashSet;
+
+fn main() {
+ let args: Vec<String> = env::args().collect();
+ if args.len() != 2 {
+ println!("Wrong number of arguments. Provide just a file name.");
+ process::exit(1);
+ }
+ let filename = &args[1];
+ println!("Using file {} as input.", filename);
+ let f = match File::open(filename) {
+ Ok(file) => file,
+ Err(e) => {
+ println!("Failed to open file {}. {:?}", filename, e);
+ process::exit(1);
+ }
+ };
+ let file = BufReader::new(&f);
+
+ let mut strings: Vec<String> = Vec::new();
+ // exercise 1
+ for line in file.lines() {
+ let l = line.unwrap();
+ strings.push(l);
+ }
+
+ // exercise 1
+ let mut doubles = 0;
+ let mut triples = 0;
+
+ for string in &strings {
+ let chars: Vec<char> = string.chars().collect();
+ let mut is_double = false;
+ let mut is_triple = false;
+ for ch in &chars {
+ let exacts: Vec<&char> = chars.iter().filter(|&c| c == ch).collect();
+ let count = exacts.len();
+ match count {
+ 2 => { is_double = true; }
+ 3 => { is_triple = true; }
+ _ => {}
+ }
+ }
+
+ if is_double {
+ doubles += 1;
+ }
+
+ if is_triple {
+ triples += 1;
+ }
+ }
+
+ println!("Doubles: {}", doubles);
+ println!("Triples: {}", triples);
+ let checksum = doubles * triples;
+ println!("Checksum: {}", checksum);
+
+ // exercise 2
+ let n = strings.len();
+ for i in 0..n {
+ let string = &strings[i];
+ let s_chars: Vec<char> = string.chars().collect();
+
+ let char_count = s_chars.len();
+ for j in (i + 1)..n {
+ let other = &strings[j];
+ let o_chars: Vec<char> = other.chars().collect();
+
+ let mut commons: Vec<&char> = Vec::new();
+ for k in 0..char_count {
+ if s_chars[k] == o_chars[k] {
+ commons.push(&s_chars[k]);
+ }
+ }
+
+ if commons.len() == char_count - 1 {
+ let sol: String = commons.into_iter().collect();
+ println!("Solution: {}", sol);
+ }
+ }
+ }
+}