First 2 days and a half
This commit is contained in:
parent
812bc86697
commit
f22ef7f7ba
7 changed files with 245 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
target
|
||||
*-input.txt
|
6
Cargo.lock
generated
Normal file
6
Cargo.lock
generated
Normal file
|
@ -0,0 +1,6 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
|
9
Cargo.toml
Normal file
9
Cargo.toml
Normal file
|
@ -0,0 +1,9 @@
|
|||
[package]
|
||||
name = "aoc"
|
||||
version = "0.1.0"
|
||||
authors = ["Vladan Popovic <vladan.popovic@ericsson.com>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
29
src/day_one.rs
Normal file
29
src/day_one.rs
Normal file
|
@ -0,0 +1,29 @@
|
|||
fn fuel_for(mass: u64) -> u64 {
|
||||
(mass / 3).saturating_sub(2)
|
||||
}
|
||||
|
||||
fn total_fuel(mass: u64) -> u64 {
|
||||
std::iter::successors(Some(fuel_for(mass)), |&fuel| Some(fuel_for(fuel)))
|
||||
.take_while(|&fuel| fuel > 0)
|
||||
.sum()
|
||||
}
|
||||
|
||||
pub fn main(masses: Vec<u64>) {
|
||||
let total: u64 = masses.into_iter().map(total_fuel).sum();
|
||||
println!("Fuel needed for bringing Santa home is: {}", total);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part1() {
|
||||
assert_eq!(fuel_for(12), 2);
|
||||
assert_eq!(fuel_for(14), 2);
|
||||
assert_eq!(fuel_for(1969), 654);
|
||||
assert_eq!(fuel_for(100756), 33583);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part2() {
|
||||
assert_eq!(total_fuel(14), 2);
|
||||
assert_eq!(total_fuel(1969), 966);
|
||||
assert_eq!(total_fuel(100756), 50346);
|
||||
}
|
82
src/day_three.rs
Normal file
82
src/day_three.rs
Normal file
|
@ -0,0 +1,82 @@
|
|||
use std::collections::BTreeSet;
|
||||
use std::fs::File;
|
||||
use std::io::{self, BufRead, BufReader};
|
||||
use std::iter::{repeat, successors};
|
||||
|
||||
fn next(c: (i32, i32), direction: &str) -> (i32, i32) {
|
||||
match direction {
|
||||
"R" => (c.0 + 1, c.1),
|
||||
"L" => (c.0 - 1, c.1),
|
||||
"U" => (c.0, c.1 + 1),
|
||||
"D" => (c.0, c.1 - 1),
|
||||
_ => panic!("Wrong direction format!"),
|
||||
}
|
||||
}
|
||||
|
||||
fn direction_length(entry: String) -> (String, usize) {
|
||||
/// Creates a (direction, length) pair to later produce a string
|
||||
/// on a direction with the given length. E.g. given "R10" the output of
|
||||
(
|
||||
entry.chars().nth(0).unwrap().to_string(),
|
||||
entry[1..].parse().unwrap(),
|
||||
)
|
||||
}
|
||||
|
||||
fn to_coordinates(entries: Vec<String>) -> BTreeSet<(i32, i32)> {
|
||||
let mut wire = BTreeSet::new();
|
||||
|
||||
let mut it = entries
|
||||
.into_iter()
|
||||
.map(direction_length)
|
||||
.flat_map(|(direction, length)| repeat(direction).take(length));
|
||||
|
||||
successors(
|
||||
it.next()
|
||||
.map(|direction| (next((0, 0), direction.as_ref()))),
|
||||
|c| it.next().map(|direction| (next(*c, direction.as_ref()))),
|
||||
)
|
||||
.for_each(|c| {
|
||||
wire.insert(c);
|
||||
});
|
||||
|
||||
wire
|
||||
}
|
||||
|
||||
fn distance(position: (i32, i32)) -> i32 {
|
||||
position.0.abs() + position.1.abs()
|
||||
}
|
||||
|
||||
pub fn main() -> io::Result<()> {
|
||||
let f = BufReader::new(File::open("day3-input.txt")?);
|
||||
let entries: Vec<BTreeSet<(i32, i32)>> = f
|
||||
.lines()
|
||||
.map(|line| line.unwrap().split(",").map(String::from).collect())
|
||||
.map(to_coordinates)
|
||||
.collect();
|
||||
|
||||
let closest: Option<i32> = entries[0]
|
||||
.intersection(&entries[1])
|
||||
.cloned()
|
||||
.map(distance)
|
||||
.min();
|
||||
println!("{:?}", closest);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_coordinates_for_entry() {
|
||||
let mut expected: BTreeSet<(i32, i32)> = BTreeSet::new();
|
||||
for i in 1..11 {
|
||||
expected.insert((i, 0));
|
||||
}
|
||||
assert_eq!(to_coordinates(vec!["R10".to_owned()]), expected);
|
||||
|
||||
expected = BTreeSet::new();
|
||||
expected.insert((1, 0));
|
||||
expected.insert((2, 0));
|
||||
expected.insert((2, 1));
|
||||
expected.insert((2, 2));
|
||||
let input = "R2,U2".to_owned().split(",").map(String::from).collect();
|
||||
assert_eq!(to_coordinates(input), expected);
|
||||
}
|
95
src/day_two.rs
Normal file
95
src/day_two.rs
Normal file
|
@ -0,0 +1,95 @@
|
|||
use std;
|
||||
|
||||
fn compute_intcode(p: &mut Vec<usize>) -> Vec<usize> {
|
||||
for idx in (0..(p.len())).step_by(4) {
|
||||
match p[idx] {
|
||||
1 => {
|
||||
let left = p[idx + 1];
|
||||
let right = p[idx + 2];
|
||||
let res = p[idx + 3];
|
||||
p[res] = p[left] + p[right];
|
||||
}
|
||||
2 => {
|
||||
let left = p[idx + 1];
|
||||
let right = p[idx + 2];
|
||||
let res = p[idx + 3];
|
||||
p[res] = p[left] * p[right];
|
||||
}
|
||||
99 => break,
|
||||
_ => panic!("Something went wrong!"),
|
||||
}
|
||||
}
|
||||
p.to_vec()
|
||||
}
|
||||
|
||||
pub fn part_one() {
|
||||
let mut input: Vec<usize> = std::include_str!("../day2-input.txt")
|
||||
.trim()
|
||||
.split(",")
|
||||
.map(|x| x.parse().unwrap())
|
||||
.collect();
|
||||
|
||||
input[1] = 12;
|
||||
input[2] = 2;
|
||||
|
||||
println!("Intcode [0] is: {}", compute_intcode(&mut input)[0]);
|
||||
}
|
||||
|
||||
pub fn part_two() {
|
||||
let mut input: Vec<usize> = std::include_str!("../day2-input.txt")
|
||||
.trim()
|
||||
.split(",")
|
||||
.map(|x| x.parse().unwrap())
|
||||
.collect();
|
||||
|
||||
input[1] = 0;
|
||||
input[2] = 0;
|
||||
|
||||
let lookup_num = 19690720;
|
||||
let mut found = false;
|
||||
|
||||
for i in 0..99 {
|
||||
input[1] = i;
|
||||
for j in 0..99 {
|
||||
input[2] = j;
|
||||
let mut input_guess = input.clone();
|
||||
let computed = compute_intcode(&mut input_guess);
|
||||
|
||||
found = computed[0] == lookup_num;
|
||||
|
||||
if found {
|
||||
let (noun, verb) = (computed[1], computed[2]);
|
||||
println!(
|
||||
"100 * noun({}) + verb({}) = {}",
|
||||
noun,
|
||||
verb,
|
||||
100 * noun + verb
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if found {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_part_one() {
|
||||
assert_eq!(
|
||||
compute_intcode(&mut vec!(1, 0, 0, 0, 99)),
|
||||
vec!(2, 0, 0, 0, 99)
|
||||
);
|
||||
assert_eq!(
|
||||
compute_intcode(&mut vec!(2, 3, 0, 3, 99)),
|
||||
vec!(2, 3, 0, 6, 99)
|
||||
);
|
||||
assert_eq!(
|
||||
compute_intcode(&mut vec!(2, 4, 4, 5, 99, 0)),
|
||||
vec!(2, 4, 4, 5, 99, 9801)
|
||||
);
|
||||
assert_eq!(
|
||||
compute_intcode(&mut vec!(1, 1, 1, 4, 99, 5, 6, 0, 99)),
|
||||
vec!(30, 1, 1, 4, 2, 5, 6, 0, 99)
|
||||
);
|
||||
}
|
22
src/main.rs
Normal file
22
src/main.rs
Normal file
|
@ -0,0 +1,22 @@
|
|||
mod day_one;
|
||||
mod day_three;
|
||||
mod day_two;
|
||||
|
||||
use std::fs::File;
|
||||
use std::io::{self, BufRead, BufReader};
|
||||
|
||||
fn main() -> io::Result<()> {
|
||||
let f = BufReader::new(File::open("day1-input.txt")?);
|
||||
let masses: Vec<u64> = f
|
||||
.lines()
|
||||
.map(|line| line.unwrap().parse().unwrap())
|
||||
.collect();
|
||||
day_one::main(masses);
|
||||
|
||||
day_two::part_one();
|
||||
day_two::part_two();
|
||||
|
||||
day_three::main()?;
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Add table
Reference in a new issue