Files
adventofcode2024/day_04/src/main.rs

73 lines
1.7 KiB
Rust
Raw Normal View History

2025-05-27 22:10:38 -05:00
//https://adventofcode.com/2024/day/4
//
// Run command: cargo run ./input.txt
use std::env;
use std::error::Error;
use std::fmt::Display;
use std::fs::File;
use std::io::{BufReader, prelude::*};
#[derive(Debug)]
struct Crossword {
data: Vec<Vec<char>>,
width: usize,
height: usize,
}
impl Crossword {
fn new(file: File) -> Result<Crossword, Box<dyn Error>> {
let mut input_buffer = BufReader::new(file);
let mut data: Vec<Vec<char>> = Vec::new();
let mut first_line = String::new();
input_buffer.read_line(&mut first_line)?;
let first_line = first_line.trim_end().to_owned();
let width = first_line.len();
for line in input_buffer.lines() {
let line = line?;
if line.len() != width {
println!("{}", line);
Err("Line length of input are not consistent")?;
}
data.push(line.chars().collect());
}
let height = data.len();
Ok(Crossword {
data,
width,
height,
})
}
}
impl Display for Crossword {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for row in &self.data {
let row = String::from_iter(row.iter());
writeln!(f, "{}", row)?;
}
Ok(())
}
}
fn main() -> Result<(), Box<dyn Error>> {
// Handle command input
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
panic!(
"{} must be run with a single argument of files name!",
&args[0]
)
}
let input_file_string = &args[1];
let crossword = Crossword::new(File::open(input_file_string)?)?;
println!("{}", crossword);
Ok(())
2025-05-26 15:47:33 -05:00
}