diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2022-12-26 22:55:33 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2022-12-26 22:55:33 +0100 |
| commit | 62e9513b6f5800c3fb722b65e3804ed4551b514e (patch) | |
| tree | 37597b36fb4a4950c67186ff0055ee90a9ba91c7 | |
| parent | 203fcaaa3d2579c862112ca36a05187a55838406 (diff) | |
day25
| -rw-r--r-- | inputs/day25 | 130 | ||||
| -rw-r--r-- | src/bin/day25.rs | 111 |
2 files changed, 241 insertions, 0 deletions
diff --git a/inputs/day25 b/inputs/day25 new file mode 100644 index 0000000..ea387c7 --- /dev/null +++ b/inputs/day25 @@ -0,0 +1,130 @@ +110=11=10-=202=2-10 +200 +110120221-1021=0- +10=1 +2=2-0=0 +2-2= +1=2== +10=2==0= +2==1=200==-010= +11=00 +1-=2 +1212 +2=- +211-=02-2 +112 +1===-1=21 +1=212-0=12 +1=0=1 +2---0-=1=00 +1011=112--1-= +1--02-1- +21=21 +221 +1-2=-1=11----1=-=- +212001101= +211=2=02102-11-0 +1-210 +201-00 +2=0==000 +11011=1=-21= +1=11= +1==222=11 +100 +1== +120- +2=1=0 +1-101-2121----2 +1020--=2 +2=0==0-110 +2-=0-=-1== +22=201-21020=20-1 +1-1220----=210-1= +210=01 +20=0==2220=22=-022 +11=102 +1-1-=01-10--- +1=1 +1=2=1-122-0-=01020 +11=12 +2- +1=2==1-= +1221=211101-=010 +11=21-2--122-2 +11--1- +1=0-2 +10=11=0 +1-2=02-2--0- +2==-20--11-1 +1=1021=220112-= +1--=1=202-022000 +1-=02--=-1=-12-- +11--00==0 +1=1022-1=-2 +1=11-22- +1011= +2= +2-2-0-2-2=- +12002=1=-110 +2 +11=1=2-1-0= +2022201-100-2=02=2 +1111=0101210 +2001100-00=2- +2=2202=0==20 +1=0 +1=1=0022-02-111-2-2 +21==10 +221==11=1-2-=221=2 +20=0-02=-01=-1101 +2====2-0=-==2 +1===0110=- +2-20-101-01 +101-021=1112102 +2=-=1-=2=0101-- +1=20211= +1=202=-=---1121= +1==0200-= +2=1=022=21--122=02 +1-1010-=-0222=1==1-2 +112=2=001- +2121-=00=110= +1--01-202 +1-== +1-0011- +1-001===0 +1=20-110- +12010--==2-11-1=12 +1--0-1 +2=1-0=2=1-20 +111=11 +2-==--1=1201 +1=- +100-22-0=-10021 +100==1-02111111= +12---1== +101==1 +202111-1120122=2 +2-- +212- +1===02-1-=102-00 +111-10-=-0-== +1-002101=0= +220=1-01-=201-0 +1-2--112=01 +1-00 +11==10212=1 +1=10-==-- +2110020002 +1-==-==1--002 +2=011=-1=2=10=== +1=21101=20=2- +21=02-00=21-02= +10=0 +1--221120=2-0=-001 +111-0=-2010100=2 +11==1-11-011-1- +2=220=1= +11-0121==2=2=0-20 +1-001-1-02=-1=100 +1=11-210-02 diff --git a/src/bin/day25.rs b/src/bin/day25.rs new file mode 100644 index 0000000..4350d7d --- /dev/null +++ b/src/bin/day25.rs @@ -0,0 +1,111 @@ +static DAY: u8 = 25; + +fn main() { + let input = advent::read_lines(DAY); + println!("{DAY}a: {}", console_number(&input)); +} + +fn snafu_to_number(input: &str) -> i64 { + let mut number = 0; + for c in input.chars() { + number *= 5; + number += match c { + '0' => 0, + '1' => 1, + '2' => 2, + '-' => -1, + '=' => -2, + _ => unimplemented!(), + }; + } + number +} + +fn number_to_snafu(input: i64) -> String { + let mut number = input; + + let mut digits = Vec::new(); + while number > 0 { + digits.push(number % 5); + number /= 5; + } + digits.push(0); + + for i in 0 .. digits.len() - 1 { + if digits[i] == 3 { + digits[i+1] += 1; + digits[i] = -2; + } else if digits[i] == 4 { + digits[i+1] += 1; + digits[i] = -1; + } else if digits[i] == 5 { + digits[i+1] += 1; + digits[i] = 0; + } + } + + let mut snafu = String::new(); + for digit in digits.iter().rev().skip_while(|&x| *x == 0) { + match digit { + -1 => snafu.push('-'), + -2 => snafu.push('='), + 0 => snafu.push('0'), + 1 => snafu.push('1'), + 2 => snafu.push('2'), + _ => unimplemented!(), + } + } + snafu +} + +fn console_number(input: &[String]) -> String { + let number = input.iter() + .map(|x| snafu_to_number(x)) + .sum(); + number_to_snafu(number) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test() { + let input = [ + "1=-0-2", + "12111", + "2=0=", + "21", + "2=01", + "111", + "20012", + "112", + "1=-1=", + "1-12", + "12", + "1=", + "122", + ].iter().map(|&x| String::from(x)).collect::<Vec<_>>(); + + assert_eq!(console_number(&input), "2=-1=0"); + } + + #[test] + fn test_number_to_snafu() { + assert_eq!(number_to_snafu(1), "1"); + assert_eq!(number_to_snafu(2), "2"); + assert_eq!(number_to_snafu(3), "1="); + assert_eq!(number_to_snafu(4), "1-"); + assert_eq!(number_to_snafu(5), "10"); + assert_eq!(number_to_snafu(6), "11"); + assert_eq!(number_to_snafu(7), "12"); + assert_eq!(number_to_snafu(8), "2="); + assert_eq!(number_to_snafu(9), "2-"); + assert_eq!(number_to_snafu(10), "20"); + assert_eq!(number_to_snafu(15), "1=0"); + assert_eq!(number_to_snafu(20), "1-0"); + assert_eq!(number_to_snafu(2022), "1=11-2"); + assert_eq!(number_to_snafu(12345), "1-0---0"); + assert_eq!(number_to_snafu(314159265), "1121-1110-1=0"); + } +} |
