star seven

This commit is contained in:
2024-12-04 21:26:48 -05:00
parent 9fae34713c
commit feb7f27aec
2 changed files with 256 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ mod star_three;
mod star_four;
mod star_five;
mod star_six;
mod star_seven;
fn main() {
let args: Vec<String> = env::args().collect();
@@ -16,6 +17,7 @@ fn main() {
"4" => star_four::run(),
"5" => star_five::run(),
"6" => star_six::run(),
"7" => star_seven::run(),
_ => unreachable!(),
}
}

254
src/star_seven.rs Normal file
View File

@@ -0,0 +1,254 @@
use std::fs;
const XMAS: &str = "XMAS";
pub fn run() {
let file = fs::read_to_string("./inputs/star_seven.txt").unwrap();
let result = count_all(&file);
println!("Result: {}", result);
}
fn count_all(input: &String) -> usize {
count_horizontal(input) +
count_vertical(input) +
count_diagonal(input)
}
fn count_diagonal(input: &String) -> usize {
let mut count = 0;
// check left to right
let mut diagonal_string: Vec<String> = vec![];
for (index, line) in input.lines().enumerate() {
diagonal_string.push(shift_string_left(&line.to_string(), index));
}
count += count_vertical(&diagonal_string.join("\n"));
// check right to left
let mut diagonal_string: Vec<String> = vec![];
for (index, line) in input.lines().enumerate() {
diagonal_string.push(shift_string_right(&line.to_string(), index));
}
count += count_vertical(&diagonal_string.join("\n"));
count
}
fn shift_string_left(input: &String, count: usize) -> String {
let len = input.len();
format!(
"{}{}{}",
" ".repeat(len - count),
input,
" ".repeat(count),
)
}
fn shift_string_right(input: &String, count: usize) -> String {
let len = input.len();
format!(
"{}{}{}",
" ".repeat(count),
input,
" ".repeat(len - count),
)
}
fn count_vertical(input: &String) -> usize {
count_horizontal(&convert_columns_to_lines(input))
}
fn convert_columns_to_lines(input: &String) -> String {
let mut columns: Vec<String> = vec![];
for line in input.lines() {
for (index, char) in line.chars().enumerate() {
match columns.get_mut(index) {
Some(str) => {
str.push(char);
columns[index] = str.to_owned();
},
None => {
columns.push(String::from(char));
},
};
}
}
columns.join("\n")
}
fn count_horizontal(input: &String) -> usize {
let mut count = 0;
for line in input.lines() {
count += line.matches(XMAS).count();
count += &line.chars().rev().collect::<String>().matches(XMAS).count();
}
count
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_count_all() {
assert_eq!(
count_all(
&vec![
"....XXMAS.",
".SAMXMS...",
"...S..A...",
"..A.A.MS.X",
"XMASAMX.MM",
"X.....XA.A",
"S.S.S.S.SS",
".A.A.A.A.A",
"..M.M.M.MM",
".X.X.XMASX"
].join("\n")
),
18,
);
assert_eq!(
count_all(
&vec![
"MMMSXXMASM",
"MSAMXMSMSA",
"AMXSXMAAMM",
"MSAMASMSMX",
"XMASAMXAMM",
"XXAMMXXAMA",
"SMSMSASXSS",
"SAXAMASAAA",
"MAMMMXMMMM",
"MXMXAXMASX"
].join("\n")
),
18,
);
}
#[test]
fn test_count_diagonal() {
assert_eq!(
count_diagonal(
&vec![
"....XXMAS.",
".SAMXMS...",
"...S..A...",
"..A.A.MS.X",
"XMASAMX.MM",
"X.....XA.A",
"S.S.S.S.SS",
".A.A.A.A.A",
"..M.M.M.MM",
".X.X.XMASX"
].join("\n")
),
10,
);
assert_eq!(
count_diagonal(
&vec![
"MMMSXXMASM",
"MSAMXMSMSA",
"AMXSXMAAMM",
"MSAMASMSMX",
"XMASAMXAMM",
"XXAMMXXAMA",
"SMSMSASXSS",
"SAXAMASAAA",
"MAMMMXMMMM",
"MXMXAXMASX"
].join("\n")
),
10,
);
}
#[test]
fn test_convert_columns_to_lines() {
assert_eq!(
convert_columns_to_lines(
&vec![
"11111",
"22222",
"33333",
"44444",
"55555",
].join("\n")
),
vec![
"12345",
"12345",
"12345",
"12345",
"12345",
].join("\n")
)
}
#[test]
fn test_shift_string_left() {
assert_eq!(shift_string_left(&"12345".to_string(), 0), " 12345");
assert_eq!(shift_string_left(&"12345".to_string(), 1), " 12345 ");
assert_eq!(shift_string_left(&"12345".to_string(), 2), " 12345 ");
assert_eq!(shift_string_left(&"12345".to_string(), 3), " 12345 ");
assert_eq!(shift_string_left(&"12345".to_string(), 4), " 12345 ");
}
#[test]
fn test_shift_string_right() {
assert_eq!(shift_string_right(&"12345".to_string(), 0), "12345 ");
assert_eq!(shift_string_right(&"12345".to_string(), 1), " 12345 ");
assert_eq!(shift_string_right(&"12345".to_string(), 2), " 12345 ");
assert_eq!(shift_string_right(&"12345".to_string(), 3), " 12345 ");
assert_eq!(shift_string_right(&"12345".to_string(), 4), " 12345 ");
}
#[test]
fn test_count_vertical() {
assert_eq!(
count_vertical(
&vec![
"....XXMAS.",
".SAMXMS...",
"...S..A...",
"..A.A.MS.X",
"XMASAMX.MM",
"X.....XA.A",
"S.S.S.S.SS",
".A.A.A.A.A",
"..M.M.M.MM",
".X.X.XMASX"
].join("\n")
),
3,
);
}
#[test]
fn test_count_horizontal() {
assert_eq!(
count_horizontal(
&vec![
"....XXMAS.",
".SAMXMS...",
"...S..A...",
"..A.A.MS.X",
"XMASAMX.MM",
"X.....XA.A",
"S.S.S.S.SS",
".A.A.A.A.A",
"..M.M.M.MM",
".X.X.XMASX"
].join("\n")
),
5,
);
}
}