summaryrefslogtreecommitdiff
path: root/2023/day5/src
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2024-02-09 11:42:04 +0100
committerSanto Cariotti <santo@dcariotti.me>2024-02-09 11:42:04 +0100
commitdb2686c798378738020a0951a521358586e21aa0 (patch)
tree8d585ceb9bdc302ae10a2458cc343be40d60acb7 /2023/day5/src
parent67dff579e91c13ef40ecb17d14497d145861c5e7 (diff)
Add day2 in OCaml
Diffstat (limited to '2023/day5/src')
-rw-r--r--2023/day5/src/lib.rs159
1 files changed, 0 insertions, 159 deletions
diff --git a/2023/day5/src/lib.rs b/2023/day5/src/lib.rs
deleted file mode 100644
index fb3ef96..0000000
--- a/2023/day5/src/lib.rs
+++ /dev/null
@@ -1,159 +0,0 @@
-use std::str::Split;
-
-fn get_data(data: &mut Split<&str>) -> Vec<Vec<u64>> {
- data.nth(0)
- .unwrap()
- .split(':')
- .nth(1)
- .unwrap()
- .trim_start()
- .split('\n')
- .map(|x| x.split(' ').map(|y| y.parse::<u64>().unwrap()).collect())
- .collect()
-}
-
-pub fn part1(input: &str) -> u64 {
- let mut input = input.trim().split("\n\n");
-
- let mut seeds: Vec<u64> = input
- .nth(0)
- .unwrap()
- .split(':')
- .nth(1)
- .unwrap()
- .trim()
- .split(' ')
- .map(|x| x.parse::<u64>().unwrap())
- .collect();
-
- let mut data: Vec<Vec<Vec<u64>>> = vec![];
- for _ in 0..7 {
- let x: Vec<Vec<u64>> = get_data(&mut input);
-
- data.push(x);
- }
- // 0 -> seed-to-soil
- // 1 -> soil-to-fertilizer
- // 2 -> fertilizer-to-water
- // 3 -> water-to-light
- // 4 -> light-to-temperature
- // 5 -> temperature-to-humidity
- // 6 -> humidity-to-location
-
- for d in &data {
- let mut checked: Vec<u64> = vec![];
- for i in d {
- let drs = i[0];
- let srs = i[1];
- let incr = i[2];
-
- for seed in &mut seeds {
- if !checked.contains(&*seed) && *seed >= srs && *seed <= srs + incr {
- *seed = *seed - srs + drs;
- checked.push(*seed);
- }
- }
- }
- }
-
- *seeds.iter().min().unwrap()
-}
-
-pub fn part2(input: &str) -> u64 {
- let mut input = input.trim().split("\n\n");
-
- let s: Vec<u64> = input
- .nth(0)
- .unwrap()
- .split(':')
- .nth(1)
- .unwrap()
- .trim()
- .split(' ')
- .map(|x| x.parse::<u64>().unwrap())
- .collect();
-
- assert_eq!(s.len() % 2, 0);
- let mut seeds: Vec<u64> = vec![];
- let mut i = 0;
- while i < s.len() {
- for j in s[i] as usize..(s[i] + s[i + 1]) as usize {
- seeds.push(j as u64);
- }
-
- i += 2;
- }
- println!("{seeds:?}");
-
- let mut data: Vec<Vec<Vec<u64>>> = vec![];
- for _ in 0..7 {
- let x: Vec<Vec<u64>> = get_data(&mut input);
-
- data.push(x);
- }
- // 0 -> seed-to-soil
- // 1 -> soil-to-fertilizer
- // 2 -> fertilizer-to-water
- // 3 -> water-to-light
- // 4 -> light-to-temperature
- // 5 -> temperature-to-humidity
- // 6 -> humidity-to-location
-
- for d in &data {
- let mut checked: Vec<u64> = vec![];
- for i in d {
- let drs = i[0];
- let srs = i[1];
- let incr = i[2];
-
- for seed in &mut seeds {
- if !checked.contains(&*seed) && *seed >= srs && *seed <= srs + incr {
- *seed = *seed - srs + drs;
- checked.push(*seed);
- }
- }
- }
- }
-
- let mut res = seeds[0];
- for seed in seeds {
- if seed < res {
- res = seed;
- }
- }
-
- res
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn example_part1() {
- let input = include_str!("../example.txt");
- let result = part1(input);
- assert_eq!(result, 35);
- }
-
- #[test]
- fn input_part1() {
- let input = include_str!("../input.txt");
- let result = part1(input);
- assert_eq!(result, 251346198);
- }
-
- // #[test]
- // fn example_part2() {
- // let input = include_str!("../example.txt");
- // let result = part2(input);
- // assert_eq!(result, 46);
- // }
- //
- // #[test]
- // fn input_part2() {
- // let input = include_str!("../input.txt");
- // let result = part2(input);
- // assert_eq!(result, 71585);
- // }
-}