diff --git a/aoc_12a/.gitignore b/aoc_12a/.gitignore new file mode 100644 index 0000000..62bd1a4 --- /dev/null +++ b/aoc_12a/.gitignore @@ -0,0 +1,12 @@ +# ---> Rust +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + diff --git a/aoc_12a/Cargo.toml b/aoc_12a/Cargo.toml new file mode 100644 index 0000000..9142f44 --- /dev/null +++ b/aoc_12a/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "aoc_12a" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/aoc_12a/input b/aoc_12a/input new file mode 100644 index 0000000..9dfe1f5 --- /dev/null +++ b/aoc_12a/input @@ -0,0 +1,41 @@ +abccccccccccccccccccccccccccaaaaaaaaacccccccccccaaacccccccccccccccccccccccccaaaaaaaaccccccccaaaaaaccaaccccccccccccccccccccccccaaaaacaacaaaacccccccccccccccccccccccccccccccccccccaaaaa +abccaaacccccccccccccccccccccaaaaaaaaacccccccccaaaaaacccccccccccccccccccccaaaaaaaaaaaccccccccaaaaaaccaaaaaacccaacaaccccccccccccaaaaaaaacaaaaaaccccccccccccccccccccccccccccccccccaaaaaa +abccaaaaccccccccccccccccccccaaaaaaaaccccccccccaaaaaaccccaaaaaccccccccccccaaaaaaaaaaacccccccccaaaaaccaaaaaccccaaaacccccccccccccccaaaaacccaaaaaccccccccccccccccccccaaccccccccccccaaaaaa +abccaaaacccccccaaaccccccccccaaaaaaacccccccccccaaaaaaccccaaaaaccccccccccccacaaaaaaaaaacccccccaaaaacaaaaaaacccaaaaaccccccccccccccaaaaacccaaaaaccccccccccccccccccccaaaaccccccccccccccaaa +abccaaaccccccaaaaaacccccccccaccaaaccccccccccccaaaaacccccaaaaaaccccaaaacccccaaaaaaaaaaaccccccaaaaacaaaaaaacccaaaaaacccccccccccccaacaaaccaccaacccccccccccccccaaaccaaaaccccccccccccccaaa +abcccccccccccaaaaaacccccccccccccaaacccccccccccaaaaacccccaaaaaaccccaaaaccccccaaaaacaaaaccccccccccccccaaaaaaccacaaaaccccaaaaacccccccaaccccccccccccccccccccccaaaackkkaccccccccccccccccaa +abcccccccccccaaaaaacccccccccccccccaaacccccccccccccccccccaaaaaaccccaaaacccccaaaaaccccaaccccccccccccccaaccaaccccaaccccccaaaaaccccccccccccccccccccccccccccccccaakkkkkkkccccccccccccccccc +abaccccccccccaaaaaccccccccccccccccaaaaccccccccccccccccccccaaaccccccaaccccccccaaaccccccccccccccccccccaacccccccccccccccaaaaaacccccccccccccccccccccaaacccccccccjkkkkkkkkccccccccaacccccc +abaccccccccccaaaaacccccaacccccccccaaaaccccccccccccaacccccccccccccccccccccccccaaacccccccccccccccccccccaaccccccaccaccccaaaaaaaaaccaccccccccccccccaaaaccccccccjjkkoopkkkkaccaacaaacccccc +abaccccccccccccccccaaaaaacccccccccaaacccccccccccccaaaaaacccccccccccccccccccccccccccccccccccccccccccccaaaaaaccaaaaccccaaaaaaaaacaaccccccccccccccaaaacccccccjjjkoooppkkkaccaaaaaaaacccc +abcccccccccccccccccaaaaaaaaccccccccccccccccaccccccaaaaaaccccccccccccccccccccccccaaccaacccccccccccccccaaaaaacaaaaacccccaaacccaaaaacccccccccccccccaaacccccjjjjjoooppppkklccaaaaaaaacccc +abcccccccccccccccccaaaaaaaacccccccccccccccaaacccaaaaaaaccccaacccacccccccccccccccaaaaaaccccccccaaaccaaaaaaaccaaaaaaccccccccaaaaaacccccccccccccccccccccjjjjjjjoooouuppplllccaccaaaacccc +abccccccccccccccccccaaaaaaaccccaacccccaaacaaacccaaaaaaaccccaaacaacccccccccccccccaaaaaacccccccccaaaaaaaaaaaacaaaaaaccccccccaaaaaaaaccccccccccccccccciijjjjjjooouuuupppllllcccccccccccc +abccccccccccccccccccaaaaaccccccaacccccaaaaaaaaaaccaaaaaaccccaaaaaccccccccccccccaaaaaaacccccccaaaaaaaaaaaaaacccaaccccccccccaacaaaaacccccccccccccccciiiijoooooouuuuuuppplllllcccccccccc +abcccccccccccccccccaaaaaacccaacaaaaacccaaaaaaaaaccaaccaaccaaaaaacccccccccccccccaaaaaaaaccccccaaaaacccaaaaaacccaccccccccccccccaacccccccccccccccccciiiinnoooooouuxuuuupppplllllcccccccc +abcccccccccccccccccccccaacccaaaaaaaaccccaaaaaaccccaaccccccaaaaaaaaccaaaccccccccaaaaaaaacccccccaaaaaccaacaaaaaaaacccaaccccccccacccccccccaaaccccccciiinnnnntttuuuxxuuuppppqqllllccccccc +abccccccccccccaacccccccccccccaaaaaccccccaaaaaacccccaaaccccaaaaaaaaccaaaacccccccccaaaccccccccccaaccaccccccaaaaaacccaaaaaaccccccccccccccaaaaccccaaiiinnnntttttuuxxxxuuvpqqqqqllmmcccccc +abccccccccccaaaaaaccccccccccccaaaaaccccaaaaaaacccccaaacccccccaacccccaaaaccccaaccccaacccccccccccccccccccccaaaaaaccccaaaaaccccccccccccccaaaaccccaaiiinnnttttxxxxxxxyuvvvvvqqqqmmmcccccc +abccaaacccccaaaaaacccccccccccaaacaaccccaaacaaacccccaaaaaaacccaccccccaaaccccaaaacccccccccccccccccccccccccaaaaaaaacaaaaaaacccccccccaaacccaaaccccaaaiinnntttxxxxxxxxyyyyvvvvqqqmmmcccccc +abcaaaacccccaaaaaccccccccccccaaaccaccccccccccacccaaaaaaaaaaccccccccccccccccaaaaccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaccccccccaaaaaacccccaaaaaiiinnnttxxxxxxxyyyyyyvvvqqqmmmcccccc +SbcaaaaccccccaaaaacccccaaaccccccaaacccccccccaaccaaaaaaaaaaaacccccccccccccccaaaaccccccccccccccccccccccccaaaaaaaaaaaaaaaaaacccccccaaaaaaacccccaaaaaiiinnntttxxxxEzzyyyyvvvqqqmmmdddcccc +abccaaaccccccaaaaacccccaaaaccccaaaaaaccccccaaaaccaaaaaaacaaacccccaaccccccccccccccccccccccccccccccccccccacaaaaacccccaaacacccccccaaaaaaaccccccaaaaaahhhnnntttxxxyyyyyyvvvvqqmmmmdddcccc +abcccccccccccccccccccccaaaaccccaaaaaaccccccaaaaccccaaaaaaaaaaaaaaaacacccccccccccccccccccccccccccccccccccccaaaacccccaaccccccccccaaaaaaaccccccccaaaahhhnnnnttxxxyyyyyvvvqqqqmmmdddccccc +abcccccccccccccccaacaacaaacccccaaaaaaccccccaaaacccaaaaaaaaaaaaaaaaaaacccccccccccccccccaacaaccccccccccccccccaaccccccccccccccccccccaaaaaacccccccaaccchhhmmmttxwyyyyyyvvrqqqmmmddddccccc +abcccccccccccccccaaaacccccccccccaaaaacccccccccccaaaaaaaaaaaaaaccaaaaccccaacccccaacccccaaaaaccccccccccccccccccccccccccccccccaaaaccaaaaaacccccccaaccahhhmmssswwywwwyyyvvrqmmmmdddcccccc +abccccccccccccccaaaaacccccccccccaacaacccccccccccaaaaaacaaaaaacccaaaaaaacaaccccaaaccccccaaaaacccccccacccccccccccccccccccccccaaaaccaacccccccccccaaaaahhhmmsswwwwwwwwywwvrrnnmdddccccccc +abccccccccccccccaaaaaaccaaccccccccccccccccccccccaaaaaaaaaaaaacccacaacaaaaaccccaaacaaacaaaaaacaaacaaacccccccacccaaccccaaccccaaaacccccccccaaaccccaaaahhhmmssswwwwswwwwwwrrnnndddccccccc +abaaccccccccccccacaaaacaaaaaaaccccccccccaacccccccaaaaaaaacaaaccccccccaaaaaaaaaaaaaaaacaaaacccaaaaaaacccccccaacaaaaaaaaacccccaaccccccccccaaacccaaaaahhhmmsssswsssrrwwwrrrnneddaccccccc +abaaccccccccaaccccaaccccaaaaacccccccccccaacccccccaaaacccccccacccccccaaaaaaaaaaaaaaaaacccaaccccaaaaaacccccccaaaaacaaaaaaacccccccccccccaaaaaaaaaaaaaahhhmmssssssssrrrrrrrrnneedaaaacccc +abacccccccccaaaaccccccaaaaaaaccccccccaaaaaaaacccccccccccccccccccccccaaaaaaaacaaaaaacccaaacccccaaaaaaaacccccaaaaaacaaaaaaaccccccccccccaaaaaaaaaaaaaahhhmmmsssssllrrrrrrrnnneeeaaaacccc +abaaacccccaaaaaaccccccaaaaaaaacccaaccaaaaaaaaccccaaaaaccccccccccccccaaaaaacccaaaaaaccccaaaccaaaaaaaaaaccccaaaaaaaaaaaaaaaccccccccccccccaaaaaccccaachhgmmmmmlllllllrrrrrnnneeeaaaacccc +abaaacccccaaaaaccccaccaaaaaaaacaaaaaaccaaaaccccccaaaaacccccccccccccccccaaacccaaaaaaaccaaaaaaaaaaaaaaaaccccaaaaaaaaaaaaacccccccccccccccaaaaaaccccaaccgggmmmllllllllllnnnnneeeaaaaccccc +abcccccccccaaaaacccaaacaaaacaacaaaaaacaaaaaccccccaaaaaaccccccccccccccccccccccaaacaaacccaaaaaaaacaaaccccccccccaaccaaaaaacccccccccccccccaaaaaacaacccccgggggmlllfffflllnnnnneeeaaaaccccc +abcccccccccaaccacccaaaaaaacccccaaaaaacaacaaacccccaaaaaaccccccccccccccccccccccaccaaccaaaaaaaaacccaaaccccccccccaaccccccaacccccaaaaccccccaccaaaaaaccccccggggggggfffffflnnneeeeeacaaacccc +abaaaccccccccccccccaaaaaacccccccaaaaacacccaaaacccaaaaaacccccccccccccccccccaaacccaaccaaaaaaaaacccaaccccccccccccccccccccccccccaaaaccccaaaccaaaaaacccccccgggggggfffffffffeeeeeaacccccccc +abaaaaacccccccccccaaaaaaaaccccccaaaacccccccaaacccccaacccccccaaacccccccccccaaaacaaacccaaaaaaaacccccccccccccccccccccccccccccccaaaaccccaaacccaaaaaaacccccccccgccaaaafffffeeeeccccccccccc +abaaaaaccccccaaccaaaaaaaaaacccccaaacaaaaaacaaaccccccccccccaaaaaccccccccccaaaaacaaacccccaaaaaaacccccccccccccccccccccccccccccccaacccccaaaaaaaaaaaaaccccccccccccaaaacaafffecccccccccccaa +abaaaacccaaacaaccaaaaaaaaaacccccaaaaaaaaaaaaaaaaacccccccccaaaaaaccccccccccaaaaaaaaaaacaaacccacccaacccccccccaaaaccccaaacccccccccccaaaaaaaaaaaaaaacccccccccccccaaaccccaaccccccccccccaaa +abaaaaacccaaaaacccccaaacaaacccccaaaaaaccaaaaaaaaacccccccccaaaaaaccaaccacccaaaaaaaaaaaaaaaccccccaaacccccccccaaaaccccaaaaccccccccccaaaaaaaaaaaaaaccccccccccccccaaaccccccccccccccccccaaa +abaaaaacccaaaaaaacccaaaccccccccaaaaaaaaccaaaaaaaccccccccccaaaaacccaaaaaccccaaaaaaaaaaaaacccccaaaaaaaaccccccaaaaccccaaaacccccccccccaaaaaaacccaaaccccccccccccccaaacccccccccccccccaaaaaa +abcccccccaaaaaaaaccccaacccccccaaaaaaaaaaaaaaaaacccccccccccaaaaaccaaaaaacccccaaaaaaaaaaaaaccccaaaaaaaacccccccaacccccaaacccccccccccccaaaaaaacccccccccccccccccccccccccccccccccccccaaaaaa diff --git a/aoc_12a/input2 b/aoc_12a/input2 new file mode 100644 index 0000000..86e9cac --- /dev/null +++ b/aoc_12a/input2 @@ -0,0 +1,5 @@ +Sabqponm +abcryxxl +accszExk +acctuvwj +abdefghi diff --git a/aoc_12a/src/main.rs b/aoc_12a/src/main.rs new file mode 100644 index 0000000..b166695 --- /dev/null +++ b/aoc_12a/src/main.rs @@ -0,0 +1,116 @@ +use std::fs::File; +use std::io::{self, BufRead}; +use std::path::Path; +use std::collections::HashSet; + +#[derive(Debug)] +struct Cell { + altitude: u8, + score: Option, +} + +impl Cell { + pub fn new(altitude: u8) -> Self { + Self { + altitude, + score: None, + } + } +} + +fn print_map(map: &Vec>) { + for y in map.iter() { + for x in y.iter() { + let c; + match x.score { + Some(n) => { + let m = (n % 62) as u8; + if m < 26 { + c = m + b'a'; + } + else if m < 52 { + c = m + b'A' - 26; + } + else { + c = m + b'0' - 52; + } + }, + None => c = b'#' + }; + print!("{}", c as char); + } + println!(""); + } +} + +fn main() { + let file_path = String::from("input"); + let mut map = Vec::>::new(); + let mut start_coor: (usize, usize) = (0, 0); + let mut end_coor: (usize, usize) = (0, 0); + println!("In file {}", file_path); + + if let Ok(lines) = read_lines(file_path) { + // Consumes the iterator, returns an (Optional) String + for (y, line) in lines.enumerate() { + if let Ok(ip) = line { + map.push(ip.bytes().enumerate().map(|(x, byte)| match byte { + b'a'..=b'z' => Cell::new(byte - b'a'), + b'S' => { + start_coor = (x, y); + Cell::new(0) + }, + b'E' => { + end_coor = (x, y); + Cell::new(25) + } + _ => panic!("Parse error"), + }).collect()); + } + } + } + + let height = map.len(); + let width = map[0].len(); + let mut cursors = vec![start_coor]; + let mut score = 0; + while !cursors.is_empty() { + let mut new_cursors = HashSet::<(usize, usize)>::new(); + for cursor in cursors { + let (x, y) = cursor; + let altitude = map[y][x].altitude; + match map[y][x].score { + Some(_) => (), + None => { + map[y][x].score = Some(score); + if x + 1 < width && altitude + 1 >= map[y][x + 1].altitude { + new_cursors.insert((x + 1, y)); + } + if x > 0 && altitude + 1 >= map[y][x - 1].altitude { + new_cursors.insert((x - 1, y)); + } + if y + 1 < height && altitude + 1 >= map[y + 1][x].altitude { + new_cursors.insert((x, y + 1)); + } + if y > 0 && altitude + 1 >= map[y - 1][x].altitude { + new_cursors.insert((x, y - 1)); + } + }, + }; + } + score += 1; + cursors = Vec::<(usize, usize)>::new(); + for cursor in new_cursors { + cursors.push(cursor); + } + } + + print_map(&map); + println!("{}", map[end_coor.1][end_coor.0].score.unwrap()); +} + +fn read_lines

(filename: P) -> io::Result>> +where P: AsRef, { + let file = File::open(filename)?; + Ok(io::BufReader::new(file).lines()) +} diff --git a/aoc_12b/.gitignore b/aoc_12b/.gitignore new file mode 100644 index 0000000..62bd1a4 --- /dev/null +++ b/aoc_12b/.gitignore @@ -0,0 +1,12 @@ +# ---> Rust +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + diff --git a/aoc_12b/Cargo.toml b/aoc_12b/Cargo.toml new file mode 100644 index 0000000..d1c0d68 --- /dev/null +++ b/aoc_12b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "aoc_12b" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/aoc_12b/src/main.rs b/aoc_12b/src/main.rs new file mode 100644 index 0000000..1bd6c88 --- /dev/null +++ b/aoc_12b/src/main.rs @@ -0,0 +1,119 @@ +use std::fs::File; +use std::io::{self, BufRead}; +use std::path::Path; +use std::collections::HashSet; + +#[derive(Debug)] +struct Cell { + altitude: u8, + score: Option, +} + +impl Cell { + pub fn new(altitude: u8) -> Self { + Self { + altitude, + score: None, + } + } +} + +fn print_map(map: &Vec>) { + for y in map.iter() { + for x in y.iter() { + let c; + match x.score { + Some(n) => { + let m = (n % 62) as u8; + if m < 26 { + c = m + b'a'; + } + else if m < 52 { + c = m + b'A' - 26; + } + else { + c = m + b'0' - 52; + } + }, + None => c = b'#' + }; + print!("{}", c as char); + } + println!(""); + } +} + +fn main() { + let file_path = String::from("../aoc_12a/input"); + let mut map = Vec::>::new(); + let mut start_coor: (usize, usize) = (0, 0); + let mut end_coor: (usize, usize) = (0, 0); + println!("In file {}", file_path); + + if let Ok(lines) = read_lines(file_path) { + // Consumes the iterator, returns an (Optional) String + for (y, line) in lines.enumerate() { + if let Ok(ip) = line { + map.push(ip.bytes().enumerate().map(|(x, byte)| match byte { + b'a'..=b'z' => Cell::new(byte - b'a'), + b'S' => { + start_coor = (x, y); + Cell::new(0) + }, + b'E' => { + end_coor = (x, y); + Cell::new(25) + } + _ => panic!("Parse error"), + }).collect()); + } + } + } + + let height = map.len(); + let width = map[0].len(); + let mut cursors = Vec::new(); + for y in 0..height { + cursors.push((0, y)); + } + let mut score = 0; + while !cursors.is_empty() { + let mut new_cursors = HashSet::<(usize, usize)>::new(); + for cursor in cursors { + let (x, y) = cursor; + let altitude = map[y][x].altitude; + match map[y][x].score { + Some(_) => (), + None => { + map[y][x].score = Some(score); + if x + 1 < width && altitude + 1 >= map[y][x + 1].altitude { + new_cursors.insert((x + 1, y)); + } + if x > 0 && altitude + 1 >= map[y][x - 1].altitude { + new_cursors.insert((x - 1, y)); + } + if y + 1 < height && altitude + 1 >= map[y + 1][x].altitude { + new_cursors.insert((x, y + 1)); + } + if y > 0 && altitude + 1 >= map[y - 1][x].altitude { + new_cursors.insert((x, y - 1)); + } + }, + }; + } + score += 1; + cursors = Vec::<(usize, usize)>::new(); + for cursor in new_cursors { + cursors.push(cursor); + } + } + + print_map(&map); + println!("{}", map[end_coor.1][end_coor.0].score.unwrap()); +} + +fn read_lines

(filename: P) -> io::Result>> +where P: AsRef, { + let file = File::open(filename)?; + Ok(io::BufReader::new(file).lines()) +}