day(25): add initial solution
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
89a9758e64
commit
38a2440438
2 changed files with 135 additions and 0 deletions
13
samples/day25.txt
Normal file
13
samples/day25.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
1=-0-2
|
||||
12111
|
||||
2=0=
|
||||
21
|
||||
2=01
|
||||
111
|
||||
20012
|
||||
112
|
||||
1=-1=
|
||||
1-12
|
||||
12
|
||||
1=
|
||||
122
|
122
src/bin/day25.rs
Normal file
122
src/bin/day25.rs
Normal file
|
@ -0,0 +1,122 @@
|
|||
use std::{char::from_digit, collections::HashMap};
|
||||
|
||||
use aoc_2022::*;
|
||||
|
||||
type Input = Vec<String>;
|
||||
type Output = String;
|
||||
|
||||
fn from_snafu(s: &str) -> isize {
|
||||
(0..)
|
||||
.zip(s.chars().rev())
|
||||
.map(|(e, d)| {
|
||||
5_isize.pow(e)
|
||||
* match d {
|
||||
'-' => -1,
|
||||
'=' => -2,
|
||||
_ => d.to_digit(10).unwrap().try_into().unwrap(),
|
||||
}
|
||||
})
|
||||
.sum()
|
||||
}
|
||||
|
||||
fn to_snafu(mut n: isize) -> String {
|
||||
let mut digits: Vec<char> = Vec::new();
|
||||
|
||||
while n > 0 {
|
||||
let mut d = n % 5;
|
||||
if d > 2 {
|
||||
n += 5 - d;
|
||||
d -= 5;
|
||||
}
|
||||
|
||||
digits.push(match d {
|
||||
-1 => '-',
|
||||
-2 => '=',
|
||||
_ => from_digit(d as u32, 10).unwrap(),
|
||||
});
|
||||
|
||||
n /= 5;
|
||||
}
|
||||
|
||||
digits.reverse();
|
||||
|
||||
digits.iter().join("")
|
||||
}
|
||||
|
||||
struct Day25;
|
||||
impl Solution<Input, Output> for Day25 {
|
||||
fn parse_input<P: AsRef<Path>>(pathname: P) -> Input {
|
||||
file_to_lines(pathname)
|
||||
}
|
||||
|
||||
fn part_1(input: &Input) -> Output {
|
||||
to_snafu(input.iter().map(|s| from_snafu(s)).sum())
|
||||
}
|
||||
|
||||
fn part_2(_input: &Input) -> Output {
|
||||
"Merry Chrysler!!!".to_string()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
// Day25::run("sample")
|
||||
Day25::main()
|
||||
}
|
||||
|
||||
test_sample!(
|
||||
day_25,
|
||||
Day25,
|
||||
"2=-1=0".to_string(),
|
||||
"Merry Chrysler!!!".to_string()
|
||||
);
|
||||
|
||||
lazy_static! {
|
||||
static ref EXAMPLES: HashMap<isize, &'static str> = HashMap::from([
|
||||
(1, "1"),
|
||||
(2, "2"),
|
||||
(3, "1="),
|
||||
(4, "1-"),
|
||||
(5, "10"),
|
||||
(6, "11"),
|
||||
(7, "12"),
|
||||
(8, "2="),
|
||||
(9, "2-"),
|
||||
(10, "20"),
|
||||
(15, "1=0"),
|
||||
(20, "1-0"),
|
||||
(2022, "1=11-2"),
|
||||
(12345, "1-0---0"),
|
||||
(314159265, "1121-1110-1=0"),
|
||||
(1747, "1=-0-2"),
|
||||
(906, "12111"),
|
||||
(198, "2=0="),
|
||||
(11, "21"),
|
||||
(201, "2=01"),
|
||||
(31, "111"),
|
||||
(1257, "20012"),
|
||||
(32, "112"),
|
||||
(353, "1=-1="),
|
||||
(107, "1-12"),
|
||||
(37, "122"),
|
||||
(4890, "2=-1=0"),
|
||||
]);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod day_25_snafu {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_from() {
|
||||
for (n, s) in EXAMPLES.iter() {
|
||||
assert_eq!(from_snafu(s), *n);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_to() {
|
||||
for (n, s) in EXAMPLES.iter() {
|
||||
assert_eq!(to_snafu(*n), s.to_string());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue