summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2022-12-26 22:55:33 +0100
committerReiner Herrmann <reiner@reiner-h.de>2022-12-26 22:55:33 +0100
commit62e9513b6f5800c3fb722b65e3804ed4551b514e (patch)
tree37597b36fb4a4950c67186ff0055ee90a9ba91c7
parent203fcaaa3d2579c862112ca36a05187a55838406 (diff)
day25
-rw-r--r--inputs/day25130
-rw-r--r--src/bin/day25.rs111
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");
+ }
+}