restructured for more days
This commit is contained in:
66
src/day01.rs
Normal file
66
src/day01.rs
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
use itertools::Itertools;
|
||||||
|
use std::fs::read_to_string;
|
||||||
|
|
||||||
|
pub fn day_main() {
|
||||||
|
let input = read_to_string("input/day01.txt").unwrap();
|
||||||
|
println!("part1: {}", part1(&input));
|
||||||
|
println!("part2: {}", part2(&input));
|
||||||
|
}
|
||||||
|
|
||||||
|
type Int = i32;
|
||||||
|
|
||||||
|
fn part1(input: &str) -> Int {
|
||||||
|
let (mut l, mut r) = make_lists(input);
|
||||||
|
|
||||||
|
l.sort();
|
||||||
|
r.sort();
|
||||||
|
|
||||||
|
l.into_iter()
|
||||||
|
.zip(r.into_iter())
|
||||||
|
.map(|(l, r)| (l - r).abs())
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> Int {
|
||||||
|
let (l, r) = make_lists(input);
|
||||||
|
|
||||||
|
l.iter()
|
||||||
|
.map(|l| r.iter().filter(|r| *r == l).count() as Int * l)
|
||||||
|
.sum()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_lists(input: &str) -> (Vec<Int>, Vec<Int>) {
|
||||||
|
input
|
||||||
|
.trim()
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.split_ascii_whitespace().collect_tuple().unwrap())
|
||||||
|
.map(|(x, y)| (x.parse::<Int>().unwrap(), y.parse::<Int>().unwrap()))
|
||||||
|
.fold((vec![], vec![]), |(mut v1, mut v2), (a, b)| {
|
||||||
|
v1.push(a);
|
||||||
|
v2.push(b);
|
||||||
|
(v1, v2)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::{part1, part2};
|
||||||
|
|
||||||
|
const TEST_INPUT: &str = r"
|
||||||
|
3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3
|
||||||
|
";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test1() {
|
||||||
|
assert_eq!(part1(TEST_INPUT), 11);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test2() {
|
||||||
|
assert_eq!(part2(TEST_INPUT), 31);
|
||||||
|
}
|
||||||
|
}
|
||||||
17
src/day02.rs
Normal file
17
src/day02.rs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
use std::fs::read_to_string;
|
||||||
|
|
||||||
|
pub fn day_main() {
|
||||||
|
let input = read_to_string("input/day01.txt").unwrap();
|
||||||
|
println!("part1: {}", part1(&input));
|
||||||
|
// println!("part2: {}", part2(&input));
|
||||||
|
}
|
||||||
|
|
||||||
|
type Int = i32;
|
||||||
|
|
||||||
|
fn part1(input: &str) -> Int {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
// fn part2(input: &str) -> Int {
|
||||||
|
// 0
|
||||||
|
// }
|
||||||
2
src/lib.rs
Normal file
2
src/lib.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pub mod day01;
|
||||||
|
pub mod day02;
|
||||||
69
src/main.rs
69
src/main.rs
@@ -1,66 +1,11 @@
|
|||||||
use itertools::Itertools;
|
use std::env::args;
|
||||||
use std::fs::read_to_string;
|
|
||||||
|
use advent_of_rust_2024::day01;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let input = read_to_string("input/day01.txt").unwrap();
|
let day: Option<u8> = args().nth(1).and_then(|a| a.parse().ok());
|
||||||
println!("part1: {}", part1(&input));
|
match day {
|
||||||
println!("part2: {}", part2(&input));
|
Some(1) => day01::day_main(),
|
||||||
}
|
_ => println!("hi"),
|
||||||
|
|
||||||
type Int = i32;
|
|
||||||
|
|
||||||
fn part1(input: &str) -> Int {
|
|
||||||
let (mut l, mut r) = make_lists(input);
|
|
||||||
|
|
||||||
l.sort();
|
|
||||||
r.sort();
|
|
||||||
|
|
||||||
l.into_iter()
|
|
||||||
.zip(r.into_iter())
|
|
||||||
.map(|(l, r)| (l - r).abs())
|
|
||||||
.sum()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn part2(input: &str) -> Int {
|
|
||||||
let (l, r) = make_lists(input);
|
|
||||||
|
|
||||||
l.iter()
|
|
||||||
.map(|l| r.iter().filter(|r| *r == l).count() as Int * l)
|
|
||||||
.sum()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_lists(input: &str) -> (Vec<Int>, Vec<Int>) {
|
|
||||||
input
|
|
||||||
.trim()
|
|
||||||
.lines()
|
|
||||||
.map(|line| line.split_ascii_whitespace().collect_tuple().unwrap())
|
|
||||||
.map(|(x, y)| (x.parse::<Int>().unwrap(), y.parse::<Int>().unwrap()))
|
|
||||||
.fold((vec![], vec![]), |(mut v1, mut v2), (a, b)| {
|
|
||||||
v1.push(a);
|
|
||||||
v2.push(b);
|
|
||||||
(v1, v2)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod test {
|
|
||||||
use crate::{part1, part2};
|
|
||||||
|
|
||||||
const TEST_INPUT: &str = r"
|
|
||||||
3 4
|
|
||||||
4 3
|
|
||||||
2 5
|
|
||||||
1 3
|
|
||||||
3 9
|
|
||||||
3 3
|
|
||||||
";
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test1() {
|
|
||||||
assert_eq!(part1(TEST_INPUT), 11);
|
|
||||||
}
|
|
||||||
#[test]
|
|
||||||
fn test2() {
|
|
||||||
assert_eq!(part2(TEST_INPUT), 31);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user