aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/day1pt1.rs21
-rw-r--r--src/day1pt2.rs51
-rw-r--r--src/day2pt1.rs44
-rw-r--r--src/day2pt2.rs33
-rw-r--r--src/day3pt1.rs64
-rw-r--r--src/day3pt2.rs69
-rw-r--r--src/day4pt1.rs45
-rw-r--r--src/day4pt2.rs49
-rw-r--r--src/day5pt1.rs39
-rw-r--r--src/day5pt2.rs39
-rw-r--r--src/main.rs5
11 files changed, 459 insertions, 0 deletions
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::<Vec<_>>();
+ sum += capt.get(0).unwrap().as_str().parse::<u32>().unwrap() * 10
+ + capt
+ .get(capt.len() - 1)
+ .unwrap()
+ .as_str()
+ .parse::<u32>()
+ .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::<Vec<_>>();
+ let str_bw = String::from_iter(line.chars().rev());
+ let capt_bw = re_bw.find_iter(&str_bw).collect::<Vec<_>>();
+
+ 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::<u32>().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::<u32>().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<Broj> = vec![];
+ let mut vsim: Vec<Simbol> = 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::<Vec<_>>();
+ for i in m {
+ let broji = i.get(0).unwrap().as_str().parse::<u32>().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::<Vec<_>>();
+ 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<Broj> = vec![];
+ let mut vsim: Vec<Simbol> = 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::<Vec<_>>();
+ for i in m {
+ let broji = i.get(0).unwrap().as_str().parse::<u32>().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::<Vec<_>>();
+ 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::<Vec<&str>>()
+ .get(1)
+ .unwrap()
+ .split(" | ")
+ .collect::<Vec<&str>>();
+ for i in sec_pt.get(0).unwrap().split(r" ") {
+ if i == "" {
+ continue;
+ }
+ br1.push(i.parse::<u32>().unwrap());
+ }
+
+ for i in sec_pt.get(1).unwrap().split(r" ") {
+ if i == "" {
+ continue;
+ }
+ br2.push(i.parse::<u32>().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::<Vec<&str>>()
+ .get(1)
+ .unwrap()
+ .split(" | ")
+ .collect::<Vec<&str>>();
+ for i in sec_pt.get(0).unwrap().split(r" ") {
+ if i == "" {
+ continue;
+ }
+ br1.push(i.parse::<u32>().unwrap());
+ }
+
+ for i in sec_pt.get(1).unwrap().split(r" ") {
+ if i == "" {
+ continue;
+ }
+ br2.push(i.parse::<u32>().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<i64> = 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<i64> = 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::<Vec<_>>()
+ .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<i64> = 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<i64> = 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::<Vec<_>>()
+ .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();
+}