From 8089545c22b1ae4a98e967f070c3e298e6808961 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Wed, 6 Dec 2023 01:45:05 +0100 Subject: Initial commit --- src/day1pt1.rs | 21 ++++++++++++++++++ src/day1pt2.rs | 51 +++++++++++++++++++++++++++++++++++++++++++ src/day2pt1.rs | 44 +++++++++++++++++++++++++++++++++++++ src/day2pt2.rs | 33 ++++++++++++++++++++++++++++ src/day3pt1.rs | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/day3pt2.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/day4pt1.rs | 45 ++++++++++++++++++++++++++++++++++++++ src/day4pt2.rs | 49 +++++++++++++++++++++++++++++++++++++++++ src/day5pt1.rs | 39 +++++++++++++++++++++++++++++++++ src/day5pt2.rs | 39 +++++++++++++++++++++++++++++++++ src/main.rs | 5 +++++ 11 files changed, 459 insertions(+) create mode 100644 src/day1pt1.rs create mode 100644 src/day1pt2.rs create mode 100644 src/day2pt1.rs create mode 100644 src/day2pt2.rs create mode 100644 src/day3pt1.rs create mode 100644 src/day3pt2.rs create mode 100644 src/day4pt1.rs create mode 100644 src/day4pt2.rs create mode 100644 src/day5pt1.rs create mode 100644 src/day5pt2.rs create mode 100644 src/main.rs (limited to 'src') diff --git a/src/day1pt1.rs b/src/day1pt1.rs new file mode 100644 index 0000000..643fcd6 --- /dev/null +++ b/src/day1pt1.rs @@ -0,0 +1,21 @@ +use regex::Regex; + +pub fn main() { + let mut sum: u32 = 0; + + let txt = std::fs::read_to_string("./input/day1.txt").unwrap(); + let re = Regex::new(r"\d").unwrap(); + + for line in txt.lines() { + let capt = re.find_iter(line).collect::>(); + sum += capt.get(0).unwrap().as_str().parse::().unwrap() * 10 + + capt + .get(capt.len() - 1) + .unwrap() + .as_str() + .parse::() + .unwrap(); + } + + println!("{}", sum); +} diff --git a/src/day1pt2.rs b/src/day1pt2.rs new file mode 100644 index 0000000..99407dd --- /dev/null +++ b/src/day1pt2.rs @@ -0,0 +1,51 @@ +use regex::Regex; + +fn parse(s: &str) -> u32 { + match s { + "zero" => 0, + "one" => 1, + "two" => 2, + "three" => 3, + "four" => 4, + "five" => 5, + "six" => 6, + "seven" => 7, + "eight" => 8, + "nine" => 9, + br => br.parse().unwrap(), + } +} + +fn parse_bw(s: &str) -> u32 { + match s { + "orez" => 0, + "eno" => 1, + "owt" => 2, + "eerht" => 3, + "ruof" => 4, + "evif" => 5, + "xis" => 6, + "neves" => 7, + "thgie" => 8, + "enin" => 9, + br => br.parse().unwrap(), + } +} + +pub fn main() { + let mut sum: u32 = 0; + let re = Regex::new(r"\d|zero|one|two|three|four|five|six|seven|eight|nine").unwrap(); + let re_bw = Regex::new(r"\d|ozer|eno|owt|eerht|ruof|evif|xis|neves|thgie|enin").unwrap(); + + let txt = std::fs::read_to_string("./input/day1.txt").unwrap(); + for line in txt.lines() { + let capt = re.find_iter(line).collect::>(); + let str_bw = String::from_iter(line.chars().rev()); + let capt_bw = re_bw.find_iter(&str_bw).collect::>(); + + let x = + parse(capt.get(0).unwrap().as_str()) * 10 + parse_bw(capt_bw.get(0).unwrap().as_str()); + sum += x; + } + println!("{}", sum) +} diff --git a/src/day2pt1.rs b/src/day2pt1.rs new file mode 100644 index 0000000..c1dad9c --- /dev/null +++ b/src/day2pt1.rs @@ -0,0 +1,44 @@ +pub fn main() { + let _max_red: u32 = 12; + let _max_green: u32 = 13; + let _max_blue: u32 = 14; + + let mut sum: u32 = 0; + let mut idx: u32 = 1; + + let txt = std::fs::read_to_string("./input/day2.txt").unwrap(); + for line in txt.lines() { + let pline = line.split(": ").last().unwrap(); + + // za svaku liniju + let mut ind: bool = true; + + for i in pline.split("; ") { + for boje in i.split(", ") { + let broj = boje.split(" ").nth(0).unwrap().parse::().unwrap(); + let boja = boje.split(" ").last().unwrap(); + + ind = match boja { + "red" => _max_red >= broj, + "green" => _max_green >= broj, + "blue" => _max_blue >= broj, + _ => ind, + }; + if ind == false { + break; + } + } + if ind == false { + break; + } + } + + if ind { + sum += idx; + } + + idx += 1; + } + + println!("{}", sum); +} diff --git a/src/day2pt2.rs b/src/day2pt2.rs new file mode 100644 index 0000000..86ba306 --- /dev/null +++ b/src/day2pt2.rs @@ -0,0 +1,33 @@ +use std::cmp; + +pub fn main() { + let mut sum: u32 = 0; + + let txt = std::fs::read_to_string("./input/day2.txt").unwrap(); + for line in txt.lines() { + let pline = line.split(": ").last().unwrap(); + + // za svaku liniju + let mut _max_red: u32 = 0; + let mut _max_green: u32 = 0; + let mut _max_blue: u32 = 0; + + for i in pline.split("; ") { + for boje in i.split(", ") { + let broj = boje.split(" ").nth(0).unwrap().parse::().unwrap(); + let boja = boje.split(" ").last().unwrap(); + + match boja { + "red" => _max_red = cmp::max(_max_red, broj), + "green" => _max_green = cmp::max(_max_green, broj), + "blue" => _max_blue = cmp::max(_max_blue, broj), + _ => println!("jbg"), + }; + } + } + + sum += _max_red * _max_green * _max_blue; + } + + println!("{}", sum); +} diff --git a/src/day3pt1.rs b/src/day3pt1.rs new file mode 100644 index 0000000..7fd9059 --- /dev/null +++ b/src/day3pt1.rs @@ -0,0 +1,64 @@ +use regex::Regex; + +struct Broj { + broj: u32, + x: i32, + y: i32, + len: i32, +} + +struct Simbol { + x: i32, + y: i32, +} + +pub fn main() { + let txt = std::fs::read_to_string("./input/day3.txt").unwrap(); + let brojevi = Regex::new(r"\d+").unwrap(); + let simboli = Regex::new(r"[^0-9.]+").unwrap(); + + let mut vbr: Vec = vec![]; + let mut vsim: Vec = vec![]; + let mut w = 0; + let mut h = 0; + + for line in txt.lines() { + if w == 0 { + w = line.len(); + } + + let m = brojevi.captures_iter(line).collect::>(); + for i in m { + let broji = i.get(0).unwrap().as_str().parse::().unwrap(); + let xi = i32::try_from(i.get(0).unwrap().start()).unwrap(); + let leni = i32::try_from(i.get(0).unwrap().as_str().len()).unwrap(); + vbr.push(Broj { + broj: broji, + x: xi, + y: h, + len: leni, + }); + } + + let s = simboli.captures_iter(line).collect::>(); + for i in s { + let xi = i32::try_from(i.get(0).unwrap().start()).unwrap(); + vsim.push(Simbol { x: xi, y: h }); + } + + h += 1; + } + + let mut sum: u32 = 0; + + for br in vbr.as_slice() { + for sim in vsim.as_slice() { + if i32::abs(sim.y - br.y) < 2 && br.x - 1 <= sim.x && sim.x <= br.x + br.len { + sum += br.broj; + break; + } + } + } + + println!("{}", sum); +} diff --git a/src/day3pt2.rs b/src/day3pt2.rs new file mode 100644 index 0000000..61d0fd1 --- /dev/null +++ b/src/day3pt2.rs @@ -0,0 +1,69 @@ +use regex::Regex; + +struct Broj { + broj: u32, + x: i32, + y: i32, + len: i32, +} + +struct Simbol { + x: i32, + y: i32, +} + +pub fn main() { + let txt = std::fs::read_to_string("./input/day3.txt").unwrap(); + let brojevi = Regex::new(r"\d+").unwrap(); + let simboli = Regex::new(r"[^0-9.]+").unwrap(); + + let mut vbr: Vec = vec![]; + let mut vsim: Vec = vec![]; + let mut w = 0; + let mut h = 0; + + for line in txt.lines() { + if w == 0 { + w = line.len(); + } + + let m = brojevi.captures_iter(line).collect::>(); + for i in m { + let broji = i.get(0).unwrap().as_str().parse::().unwrap(); + let xi = i32::try_from(i.get(0).unwrap().start()).unwrap(); + let leni = i32::try_from(i.get(0).unwrap().as_str().len()).unwrap(); + vbr.push(Broj { + broj: broji, + x: xi, + y: h, + len: leni, + }); + } + + let s = simboli.captures_iter(line).collect::>(); + for i in s { + let xi = i32::try_from(i.get(0).unwrap().start()).unwrap(); + vsim.push(Simbol { x: xi, y: h }); + } + + h += 1; + } + + let mut sum: u32 = 0; + + for sim in vsim.as_slice() { + let mut cnt: u32 = 0; + let mut ratio: u32 = 1; + for br in vbr.as_slice() { + if i32::abs(sim.y - br.y) < 2 && br.x - 1 <= sim.x && sim.x <= br.x + br.len { + cnt += 1; + ratio *= br.broj; + } + } + if cnt == 2 { + sum += ratio; + } + } + + println!("{}", sum); +} diff --git a/src/day4pt1.rs b/src/day4pt1.rs new file mode 100644 index 0000000..5a622a8 --- /dev/null +++ b/src/day4pt1.rs @@ -0,0 +1,45 @@ +pub fn main() { + let txt = std::fs::read_to_string("./input/day4.txt").unwrap(); + let mut sum: u32 = 0; + for line in txt.lines() { + let mut cnt: u32 = 0; + + let mut br1 = vec![]; + let mut br2 = vec![]; + + let sec_pt = line + .split(": ") + .collect::>() + .get(1) + .unwrap() + .split(" | ") + .collect::>(); + for i in sec_pt.get(0).unwrap().split(r" ") { + if i == "" { + continue; + } + br1.push(i.parse::().unwrap()); + } + + for i in sec_pt.get(1).unwrap().split(r" ") { + if i == "" { + continue; + } + br2.push(i.parse::().unwrap()); + } + + for i in &br1 { + for j in &br2 { + if i == j { + cnt += 1; + } + } + } + + if cnt > 0 { + sum += 2u32.pow(cnt - 1); + } + } + + println!("{}", sum); +} diff --git a/src/day4pt2.rs b/src/day4pt2.rs new file mode 100644 index 0000000..765e992 --- /dev/null +++ b/src/day4pt2.rs @@ -0,0 +1,49 @@ +pub fn main() { + let txt = std::fs::read_to_string("./input/day4.txt").unwrap(); + let mut sum: u32 = 0; + let mut a = vec![1; 256]; + + for (idx, line) in txt.lines().enumerate() { + let mut cnt: u32 = 0; + + let mut br1 = vec![]; + let mut br2 = vec![]; + + let sec_pt = line + .split(": ") + .collect::>() + .get(1) + .unwrap() + .split(" | ") + .collect::>(); + for i in sec_pt.get(0).unwrap().split(r" ") { + if i == "" { + continue; + } + br1.push(i.parse::().unwrap()); + } + + for i in sec_pt.get(1).unwrap().split(r" ") { + if i == "" { + continue; + } + br2.push(i.parse::().unwrap()); + } + + for i in &br1 { + for j in &br2 { + if i == j { + cnt += 1; + } + } + } + + for i in 1..cnt + 1 { + a[idx + i as usize] += a[idx]; + } + + sum += a[idx]; + } + + println!("{}", sum); +} diff --git a/src/day5pt1.rs b/src/day5pt1.rs new file mode 100644 index 0000000..a50a66a --- /dev/null +++ b/src/day5pt1.rs @@ -0,0 +1,39 @@ +pub fn main() { + let txt = std::fs::read_to_string("./input/day5.txt").unwrap(); + + let mut seeds: Vec = vec![]; + let mut rules: Vec<(i64, i64, i64)> = vec![]; + + for (i, line) in txt.lines().enumerate() { + if line != "" { + // dodaj u vec + if i != 0 && line.chars().nth(line.len() - 1).unwrap() != ':' { + let br: Vec = line.split(" ").map(|s| s.parse().unwrap()).collect(); + rules.push((br[0], br[1], br[2])); + } + } else { + // obradi + for i in 0..seeds.len() { + for rule in &rules { + if rule.1 <= seeds[i] && seeds[i] < rule.1 + rule.2 { + seeds[i] += rule.0 - rule.1; + break; + } + } + } + rules.clear(); + } + + if seeds.is_empty() && line != "" { + seeds = line + .split(": ") + .collect::>() + .get(1) + .unwrap() + .split(" ") + .map(|s| s.parse().unwrap()) + .collect(); + } + } + println!("{}", seeds.iter().min().unwrap()); +} diff --git a/src/day5pt2.rs b/src/day5pt2.rs new file mode 100644 index 0000000..8f95d3d --- /dev/null +++ b/src/day5pt2.rs @@ -0,0 +1,39 @@ +pub fn main() { + let txt = std::fs::read_to_string("./input/day5.txt").unwrap(); + + let mut seeds: Vec = vec![]; + let mut rules: Vec<(i64, i64, i64)> = vec![]; + + for (i, line) in txt.lines().enumerate() { + if line != "" { + // dodaj u vec + if i != 0 && line.chars().nth(line.len() - 1).unwrap() != ':' { + let br: Vec = line.split(" ").map(|s| s.parse().unwrap()).collect(); + rules.push((br[0], br[1], br[2])); + } + } else { + // obradi + for i in 0..seeds.len() { + for rule in &rules { + if rule.1 <= seeds[i] && seeds[i] < rule.1 + rule.2 { + seeds[i] += rule.0 - rule.1; + break; + } + } + } + rules.clear(); + } + + if seeds.is_empty() && line != "" { + seeds = line + .split(": ") + .collect::>() + .get(1) + .unwrap() + .split(" ") + .map(|s| s.parse().unwrap()) + .collect(); + } + } + println!("{}", 0); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..b3ad2f6 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,5 @@ +mod day5pt2; + +fn main() { + day5pt2::main(); +} -- cgit v1.2.3