Browse Source

Add basic framework

Oliver Youle 3 years ago
commit
006b82ed88
5 changed files with 178 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 113 0
      Cargo.lock
  3. 8 0
      Cargo.toml
  4. 50 0
      src/main.rs
  5. 6 0
      src/solution/mod.rs

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/target

+ 113 - 0
Cargo.lock

@@ -0,0 +1,113 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "ansi_term"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "aoc_2020"
+version = "0.1.0"
+dependencies = [
+ "clap",
+]
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "clap"
+version = "2.33.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
+dependencies = [
+ "ansi_term",
+ "atty",
+ "bitflags",
+ "strsim",
+ "textwrap",
+ "unicode-width",
+ "vec_map",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
+
+[[package]]
+name = "strsim"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

+ 8 - 0
Cargo.toml

@@ -0,0 +1,8 @@
+[package]
+name = "aoc_2020"
+version = "0.1.0"
+authors = ["Oliver Youle <youle.oliver@gmail.com>"]
+edition = "2018"
+
+[dependencies]
+clap = "~2.33.3"

+ 50 - 0
src/main.rs

@@ -0,0 +1,50 @@
+extern crate clap;
+use clap::App;
+
+use std::fs;
+use std::process;
+
+pub mod solution;
+
+use solution::day1::Day1;
+use solution::Solution;
+
+fn main() {
+    let opts = App::new("Advent of Code Solutions 2020")
+        .author("Oliver Youle")
+        .args_from_usage(
+            "-d, --day=<DAY_OF_MONTH> 'The number of the solution to run'
+             -i, --input=<FILE_PATH>  'Path to the problem input'",
+        )
+        .get_matches();
+
+    let day: u8 = match opts.value_of("day").unwrap().parse::<u8>() {
+        Ok(n) => n,
+        Err(_e) => {
+            println!("The provided day is not a valid");
+            process::exit(1);
+        }
+    };
+
+    let filename = opts.value_of("input").unwrap();
+    let input_text = match fs::read_to_string(filename) {
+        Ok(i) => i,
+        Err(e) => {
+            println!("Error reading from input file: {}", e);
+            process::exit(1);
+        }
+    };
+
+    let input: Vec<&str> = input_text.split("\n").filter(|s| !s.is_empty()).collect();
+
+    let solution = match day {
+        1 => Day1 {},
+        _ => {
+            println!("Solution not available for day {}", day);
+            process::exit(1);
+        }
+    };
+
+    println!("part 1: {}", solution.part_1(&input));
+    println!("part 2: {}", solution.part_2(&input));
+}

+ 6 - 0
src/solution/mod.rs

@@ -0,0 +1,6 @@
+pub trait Solution {
+    fn part_1(&self, input: &Vec<&str>) -> String;
+    fn part_2(&self, input: &Vec<&str>) -> String;
+}
+
+pub mod day1;