diff --git a/2019/01/Cargo.lock b/2019/01/Cargo.lock new file mode 100644 index 0000000..b5e2f12 --- /dev/null +++ b/2019/01/Cargo.lock @@ -0,0 +1,6 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-01" +version = "0.1.0" + diff --git a/2019/01/Cargo.toml b/2019/01/Cargo.toml new file mode 100644 index 0000000..fa814c4 --- /dev/null +++ b/2019/01/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day-01" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2019/01/input b/2019/01/input new file mode 100644 index 0000000..727243b --- /dev/null +++ b/2019/01/input @@ -0,0 +1,100 @@ +83285 +96868 +121640 +51455 +128067 +128390 +141809 +52325 +68310 +140707 +124520 +149678 +87961 +52040 +133133 +52203 +117483 +85643 +84414 +86558 +65402 +122692 +88565 +61895 +126271 +128802 +140363 +109764 +53600 +114391 +98973 +124467 +99574 +69140 +144856 +56809 +149944 +138738 +128823 +82776 +77557 +51994 +74322 +64716 +114506 +124074 +73096 +97066 +96731 +149307 +135626 +121413 +69575 +98581 +50570 +60754 +94843 +72165 +146504 +53290 +63491 +50936 +79644 +119081 +70218 +85849 +133228 +114550 +131943 +67288 +68499 +80512 +148872 +99264 +119723 +68295 +90348 +146534 +52661 +99146 +95993 +130363 +78956 +126736 +82065 +77227 +129950 +97946 +132345 +107137 +79623 +148477 +88928 +118911 +75277 +97162 +80664 +149742 +88983 +74518 diff --git a/2019/01/src/main.rs b/2019/01/src/main.rs new file mode 100644 index 0000000..757a2c2 --- /dev/null +++ b/2019/01/src/main.rs @@ -0,0 +1,49 @@ +use std::env; +use std::fs::File; +use std::io::{BufRead, BufReader}; + +fn main() { + let input = env::args().nth(1).expect("need an input file"); + + let reader = File::open(&input) + .map(BufReader::new) + .expect("failed to open input file"); + + let modules = reader + .lines() + .filter_map(Result::ok) + .map(|value| { + value + .parse::() + .expect("failed to convert value to i32") + }) + .collect::>(); + + let total_fuel: i32 = modules.iter().map(|value| (value / 3) - 2).sum(); + + println!("part_one={}", total_fuel); + + let total_fuel: i32 = modules + .iter() + .map(|value| { + let mut total_fuel = 0; + + let mut input = *value; + + loop { + let fuel = (input / 3) - 2; + + if fuel <= 0 { + break; + } + + total_fuel += fuel; + input = fuel; + } + + total_fuel + }) + .sum(); + + println!("part_two={}", total_fuel); +} diff --git a/2019/02/Cargo.lock b/2019/02/Cargo.lock new file mode 100644 index 0000000..3538742 --- /dev/null +++ b/2019/02/Cargo.lock @@ -0,0 +1,6 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "day-02" +version = "0.1.0" + diff --git a/2019/02/Cargo.toml b/2019/02/Cargo.toml new file mode 100644 index 0000000..8920e6c --- /dev/null +++ b/2019/02/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day-02" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2019/02/input b/2019/02/input new file mode 100644 index 0000000..2793642 --- /dev/null +++ b/2019/02/input @@ -0,0 +1 @@ +1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,6,19,2,19,6,23,1,23,5,27,1,9,27,31,1,31,10,35,2,35,9,39,1,5,39,43,2,43,9,47,1,5,47,51,2,51,13,55,1,55,10,59,1,59,10,63,2,9,63,67,1,67,5,71,2,13,71,75,1,75,10,79,1,79,6,83,2,13,83,87,1,87,6,91,1,6,91,95,1,10,95,99,2,99,6,103,1,103,5,107,2,6,107,111,1,10,111,115,1,115,5,119,2,6,119,123,1,123,5,127,2,127,6,131,1,131,5,135,1,2,135,139,1,139,13,0,99,2,0,14,0 diff --git a/2019/02/src/main.rs b/2019/02/src/main.rs new file mode 100644 index 0000000..77cd6f1 --- /dev/null +++ b/2019/02/src/main.rs @@ -0,0 +1,106 @@ +use std::env; +use std::fs; + +fn main() { + let input = env::args().nth(1).expect("need an input file"); + + let data = fs::read_to_string(&input).expect("failed to read input file"); + + let intcode = data + .split(',') + .map(|value| { + value + .trim() + .parse::() + .expect("failed to convert value to u8") + }) + .collect::>(); + + let mut program = intcode.clone(); + + program[1] = 12; + program[2] = 2; + + let mut pc = 0; + + loop { + match program[pc] { + 1 => { + let a_addr = program[pc + 1]; + let b_addr = program[pc + 2]; + let x_addr = program[pc + 3]; + + program[x_addr] = program[a_addr] + program[b_addr]; + pc += 4; + } + 2 => { + let a_addr = program[pc + 1]; + let b_addr = program[pc + 2]; + let x_addr = program[pc + 3]; + + program[x_addr] = program[a_addr] * program[b_addr]; + pc += 4; + } + 99 => { + break; + } + _ => panic!("invalid op code"), + } + } + + println!("part_one={}", program[0]); + + let mut noun = 0; + let mut verb = 0; + + loop { + let mut program = intcode.clone(); + + program[1] = noun; + program[2] = verb; + + let mut pc = 0; + + loop { + match program[pc] { + 1 => { + let a_addr = program[pc + 1]; + let b_addr = program[pc + 2]; + let x_addr = program[pc + 3]; + + program[x_addr] = program[a_addr] + program[b_addr]; + pc += 4; + } + 2 => { + let a_addr = program[pc + 1]; + let b_addr = program[pc + 2]; + let x_addr = program[pc + 3]; + + program[x_addr] = program[a_addr] * program[b_addr]; + pc += 4; + } + 99 => { + break; + } + _ => panic!("invalid op code"), + } + } + + if program[0] == 19690720 { + break; + } + + noun += 1; + + if noun > 99 { + noun = 0; + verb += 1; + + if verb > 99 { + panic!("failed to find a valid input pair"); + } + } + } + + println!("part_two={}", 100 * noun + verb); +}