82 lines
1.7 KiB
Rust
82 lines
1.7 KiB
Rust
use std::ops::Range;
|
|
use std::collections::HashMap;
|
|
const FILE_STR: &'static str = include_str!("input.txt");
|
|
|
|
#[derive(Debug)]
|
|
enum DataType {
|
|
Seeds,
|
|
Soil,
|
|
Fertilizer,
|
|
Water,
|
|
Light,
|
|
Temperature,
|
|
Humidity,
|
|
Location,
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
struct DataMap {
|
|
from_range: Range<u64>,
|
|
to_range: Range<u64>,
|
|
}
|
|
|
|
impl DataMap {
|
|
fn new(from_start: u64, to_start: u64, map_length: u64) -> Self {
|
|
let to_range = to_start..to_start + map_length;
|
|
let from_range = from_start..from_start + map_length;
|
|
|
|
DataMap {
|
|
from_range,
|
|
to_range
|
|
}
|
|
}
|
|
|
|
fn get_dest_idx(&self, src_value: u64) -> u64 {
|
|
let src_index = src_value.checked_sub(self.to_range.start);
|
|
let dest_index = if let Some(idx) = src_index {
|
|
self.from_range.start.checked_add(idx)
|
|
} else {
|
|
Some(src_value)
|
|
};
|
|
|
|
match dest_index {
|
|
Some(n) => n,
|
|
None => src_value
|
|
}
|
|
}
|
|
|
|
fn get_src_idx(&self, dest_value: u64) -> u64 {
|
|
let dest_index = dest_value.checked_sub(self.from_range.start);
|
|
let src_index = if let Some(idx) = dest_index {
|
|
self.to_range.start.checked_add(idx)
|
|
} else {
|
|
Some(dest_value)
|
|
};
|
|
|
|
match src_index {
|
|
Some(n) => n,
|
|
None => dest_value
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
struct Almanac {
|
|
seeds: Vec<u64>,
|
|
maps: HashMap<(DataType, DataType), Vec<DataMap>>,
|
|
}
|
|
|
|
impl Almanac {
|
|
fn parse(input: &str) -> Self {
|
|
todo!();
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
println!("Hello, world!");
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
const EXAMPLE_FILE_STR: &'static str = include_str!("example-input.txt");
|
|
} |