Implementation of d02 in rust
This commit is contained in:
parent
cfbaaf8126
commit
b487214421
7
d02/Cargo.lock
generated
Normal file
7
d02/Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "d02"
|
||||||
|
version = "0.1.0"
|
8
d02/Cargo.toml
Normal file
8
d02/Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "d02"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
1000
d02/input.txt
Normal file
1000
d02/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
6
d02/input_short.txt
Normal file
6
d02/input_short.txt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
forward 5
|
||||||
|
down 5
|
||||||
|
forward 8
|
||||||
|
up 3
|
||||||
|
down 8
|
||||||
|
forward 2
|
131
d02/src/main.rs
Normal file
131
d02/src/main.rs
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
use std::fmt;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{self, BufRead};
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
|
||||||
|
where
|
||||||
|
P: AsRef<Path>,
|
||||||
|
{
|
||||||
|
let file = File::open(filename)?;
|
||||||
|
Ok(io::BufReader::new(file).lines())
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Coord(i32, i32);
|
||||||
|
|
||||||
|
impl fmt::Display for Coord {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(f, "(x={}, y={})", self.0, self.1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1() {
|
||||||
|
let result = read_lines("input.txt")
|
||||||
|
.expect("Expected a file to read")
|
||||||
|
.map(|line| line.expect("Could not read line"))
|
||||||
|
.map(|line| {
|
||||||
|
let mut parts = line.split_whitespace();
|
||||||
|
let direction = parts
|
||||||
|
.next()
|
||||||
|
.expect(format!("Missing direction on line: {}", line).as_str());
|
||||||
|
let distance = parts
|
||||||
|
.next()
|
||||||
|
.map(|value| {
|
||||||
|
value.parse::<i32>().expect(
|
||||||
|
format!("Expect distance to be a value instead got: {}", value).as_str(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.expect(format!("Missing distance on line: {}", line).as_str());
|
||||||
|
if parts.next().is_some() {
|
||||||
|
panic!("More than 2 parts in line: {}", line);
|
||||||
|
}
|
||||||
|
match direction {
|
||||||
|
"forward" => Coord(distance, 0),
|
||||||
|
"down" => Coord(0, -1 * distance),
|
||||||
|
"up" => Coord(0, distance),
|
||||||
|
&_ => panic!("Unknown direction {}", direction),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.reduce(|location, delta| Coord(location.0 + delta.0, location.1 + delta.1))
|
||||||
|
.expect("No value reduced");
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"Part 1 location: {}, result: {}",
|
||||||
|
result,
|
||||||
|
result.0 * result.1 * -1
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Position {
|
||||||
|
location: Coord,
|
||||||
|
aim: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2() {
|
||||||
|
let result = read_lines("input.txt")
|
||||||
|
.expect("Expected a file to read")
|
||||||
|
.map(|line| line.expect("Could not read line"))
|
||||||
|
.map(|line| {
|
||||||
|
let mut parts = line.split_whitespace();
|
||||||
|
let direction = parts
|
||||||
|
.next()
|
||||||
|
.expect(format!("Missing direction on line: {}", line).as_str());
|
||||||
|
let value = parts
|
||||||
|
.next()
|
||||||
|
.map(|value| {
|
||||||
|
value.parse::<i32>().expect(
|
||||||
|
format!("Expect distance to be a value instead got: {}", value).as_str(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.expect(format!("Missing distance on line: {}", line).as_str());
|
||||||
|
if parts.next().is_some() {
|
||||||
|
panic!("More than 2 parts in line: {}", line);
|
||||||
|
}
|
||||||
|
match direction {
|
||||||
|
// Increase aim
|
||||||
|
"down" => Position {
|
||||||
|
location: Coord(0, 0),
|
||||||
|
aim: value,
|
||||||
|
},
|
||||||
|
// Decrease aim
|
||||||
|
"up" => Position {
|
||||||
|
location: Coord(0, 0),
|
||||||
|
aim: -1 * value,
|
||||||
|
},
|
||||||
|
// Increase horiziontal and depty by aim
|
||||||
|
"forward" => Position {
|
||||||
|
location: Coord(value, value),
|
||||||
|
aim: 0,
|
||||||
|
},
|
||||||
|
&_ => panic!("Unknown direction {}", direction),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.fold(
|
||||||
|
Position {
|
||||||
|
location: Coord(0, 0),
|
||||||
|
aim: 0,
|
||||||
|
},
|
||||||
|
|position, delta| {
|
||||||
|
let aim = position.aim + delta.aim;
|
||||||
|
let x = position.location.0 + delta.location.0;
|
||||||
|
let y = position.location.1 - (aim * delta.location.1);
|
||||||
|
let coord = Coord(x, y);
|
||||||
|
println!("Coord: {}, aim: {}", coord, aim);
|
||||||
|
Position {
|
||||||
|
location: coord,
|
||||||
|
aim: aim,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"Part 2 location: {}, result: {}",
|
||||||
|
result.location,
|
||||||
|
result.location.0 * result.location.1 * -1
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
part1();
|
||||||
|
part2();
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user