Reorganize Rust
This commit is contained in:
parent
f678f49ada
commit
4f8cda8c29
16 changed files with 177 additions and 80 deletions
|
@ -6,6 +6,9 @@
|
||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
"editor.wordBasedSuggestions": false,
|
"editor.wordBasedSuggestions": false,
|
||||||
"javascript.suggest.names": false
|
"javascript.suggest.names": false,
|
||||||
|
"rust-analyzer.linkedProjects": [
|
||||||
|
"./rust/Cargo.toml"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,13 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day1"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["GitHub <noreply@github.com>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
|
|
||||||
[[bin]]
|
|
||||||
name = "day1"
|
|
||||||
path = "main.rs"
|
|
|
@ -1,64 +0,0 @@
|
||||||
use std::fs::File;
|
|
||||||
use std::io;
|
|
||||||
use std::io::prelude::*;
|
|
||||||
use std::path::Path;
|
|
||||||
|
|
||||||
fn parse_input<B: BufRead>(buf: B) -> Vec<u64> {
|
|
||||||
buf.lines()
|
|
||||||
.map(|line| {
|
|
||||||
line.expect("Failed to read line.")
|
|
||||||
.parse()
|
|
||||||
.expect("Failed to parse line input.")
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn puzzle_a(nums: &[u64]) -> Option<u64> {
|
|
||||||
for a in nums {
|
|
||||||
for b in nums {
|
|
||||||
if a + b == 2020 {
|
|
||||||
return Some(a * b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
|
||||||
}
|
|
||||||
|
|
||||||
fn puzzle_b(nums: &[u64]) -> Option<u64> {
|
|
||||||
for a in nums {
|
|
||||||
for b in nums {
|
|
||||||
for c in nums {
|
|
||||||
if a + b + c == 2020 {
|
|
||||||
return Some(a * b * c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
None
|
|
||||||
}
|
|
||||||
|
|
||||||
fn open_file<P>(filename: P) -> io::Result<io::BufReader<File>>
|
|
||||||
where
|
|
||||||
P: AsRef<Path>,
|
|
||||||
{
|
|
||||||
let file = File::open(filename)?;
|
|
||||||
Ok(io::BufReader::new(file))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() -> Result<(), &'static str> {
|
|
||||||
let buffer = open_file("input").unwrap();
|
|
||||||
let puzzle_input = parse_input(buffer);
|
|
||||||
|
|
||||||
println!(
|
|
||||||
"Part A:\n{}",
|
|
||||||
puzzle_a(&puzzle_input).expect("No solution for A found.")
|
|
||||||
);
|
|
||||||
println!("--------");
|
|
||||||
println!(
|
|
||||||
"Part B:\n{}",
|
|
||||||
puzzle_b(&puzzle_input).expect("No solution for B found.")
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
0
Rust/.gitignore → rust/.gitignore
vendored
0
Rust/.gitignore → rust/.gitignore
vendored
6
Rust/day1/Cargo.lock → rust/Cargo.lock
generated
6
Rust/day1/Cargo.lock → rust/Cargo.lock
generated
|
@ -1,5 +1,7 @@
|
||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "day1"
|
name = "advent-of-code"
|
||||||
version = "0.1.0"
|
version = "20.1.2"
|
28
rust/Cargo.toml
Normal file
28
rust/Cargo.toml
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[package]
|
||||||
|
name = "advent-of-code"
|
||||||
|
version = "20.1.2"
|
||||||
|
edition = "2021"
|
||||||
|
resolver = "2"
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
strip = "symbols"
|
||||||
|
lto = "fat"
|
||||||
|
opt-level = 3
|
||||||
|
codegen-units = 1
|
||||||
|
|
||||||
|
[profile.dev.package."*"]
|
||||||
|
opt-level = 3
|
||||||
|
codegen-units = 1
|
||||||
|
[profile.release.package."*"]
|
||||||
|
opt-level = 3
|
||||||
|
codegen-units = 1
|
||||||
|
[profile.dev.build-override]
|
||||||
|
opt-level = 3
|
||||||
|
codegen-units = 1
|
||||||
|
[profile.release.build-override]
|
||||||
|
opt-level = 3
|
||||||
|
codegen-units = 1
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "day01"
|
||||||
|
path = "src/day01/main.rs"
|
1
rust/src/day00/input.txt
Normal file
1
rust/src/day00/input.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Placeholder input
|
11
rust/src/day00/main.rs
Normal file
11
rust/src/day00/main.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
const INPUT: &str = include_str!("input.txt");
|
||||||
|
|
||||||
|
mod part_1;
|
||||||
|
use part_1::part_1;
|
||||||
|
mod part_2;
|
||||||
|
use part_2::part_2;
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
part_1(INPUT);
|
||||||
|
part_2(INPUT);
|
||||||
|
}
|
24
rust/src/day00/part_1.rs
Normal file
24
rust/src/day00/part_1.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
pub(crate) fn part_1(_input: &'static str) -> u64 {
|
||||||
|
todo!("Part 1")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
const SAMPLE_INPUT: &str = include_str!("sample_input.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_sample_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
super::part_1(SAMPLE_INPUT),
|
||||||
|
todo!("Add result from example part 1")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
super::part_1(crate::INPUT),
|
||||||
|
todo!("Add result for solved part 1")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
24
rust/src/day00/part_2.rs
Normal file
24
rust/src/day00/part_2.rs
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
pub(crate) fn part_2(_input: &'static str) -> u64 {
|
||||||
|
todo!("Part 2")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
const SAMPLE_INPUT: &str = include_str!("sample_input.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_sample_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
super::part_2(SAMPLE_INPUT),
|
||||||
|
todo!("Add result from example part 2")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_solution() {
|
||||||
|
assert_eq!(
|
||||||
|
super::part_2(crate::INPUT),
|
||||||
|
todo!("Add result for solved part 2")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
0
rust/src/day00/sample_input.txt
Normal file
0
rust/src/day00/sample_input.txt
Normal file
19
rust/src/day01/main.rs
Normal file
19
rust/src/day01/main.rs
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
const INPUT: &str = include_str!("input.txt");
|
||||||
|
|
||||||
|
mod part_1;
|
||||||
|
use part_1::part_1;
|
||||||
|
mod part_2;
|
||||||
|
use part_2::part_2;
|
||||||
|
|
||||||
|
fn parse_input(input: &'static str) -> Vec<u64> {
|
||||||
|
input
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.parse().expect("Failed to parse line input."))
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
let input = parse_input(INPUT);
|
||||||
|
part_1(&input);
|
||||||
|
part_2(&input);
|
||||||
|
}
|
27
rust/src/day01/part_1.rs
Normal file
27
rust/src/day01/part_1.rs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
pub(crate) fn part_1(nums: &[u64]) -> u64 {
|
||||||
|
for a in nums {
|
||||||
|
for b in nums {
|
||||||
|
if a + b == 2020 {
|
||||||
|
let result = a * b;
|
||||||
|
println!("Part 1: {result}");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unreachable!("No solution found for part 1");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
const SAMPLE_INPUT: &str = include_str!("sample_input.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_sample_solution() {
|
||||||
|
assert_eq!(super::part_1(&crate::parse_input(SAMPLE_INPUT)), 514579);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_solution() {
|
||||||
|
assert_eq!(super::part_1(&crate::parse_input(crate::INPUT)), 964875);
|
||||||
|
}
|
||||||
|
}
|
29
rust/src/day01/part_2.rs
Normal file
29
rust/src/day01/part_2.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
pub(crate) fn part_2(nums: &[u64]) -> u64 {
|
||||||
|
for a in nums {
|
||||||
|
for b in nums {
|
||||||
|
for c in nums {
|
||||||
|
if a + b + c == 2020 {
|
||||||
|
let result = a * b * c;
|
||||||
|
println!("Part 2: {result}");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unreachable!("No solution found for part 2")
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
const SAMPLE_INPUT: &str = include_str!("sample_input.txt");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_sample_solution() {
|
||||||
|
assert_eq!(super::part_2(&crate::parse_input(SAMPLE_INPUT)), 241861950);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_with_solution() {
|
||||||
|
assert_eq!(super::part_2(&crate::parse_input(crate::INPUT)), 158661360);
|
||||||
|
}
|
||||||
|
}
|
6
rust/src/day01/sample_input.txt
Normal file
6
rust/src/day01/sample_input.txt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
1721
|
||||||
|
979
|
||||||
|
366
|
||||||
|
299
|
||||||
|
675
|
||||||
|
1456
|
Loading…
Reference in a new issue