diff --git a/input/day13 b/input/day13 new file mode 100644 index 0000000..d5aa0a8 --- /dev/null +++ b/input/day13 @@ -0,0 +1,936 @@ +1148,688 +1020,159 +857,707 +1176,415 +388,275 +50,849 +544,520 +1,418 +1119,280 +217,26 +358,110 +1302,684 +910,791 +45,287 +544,806 +423,859 +529,866 +1150,686 +977,668 +666,245 +380,603 +892,343 +437,483 +1109,411 +296,534 +763,676 +711,218 +139,774 +923,397 +1202,341 +664,12 +416,89 +522,54 +524,401 +541,796 +1153,523 +1101,427 +977,308 +102,856 +769,546 +966,523 +1218,820 +833,682 +872,806 +457,542 +333,586 +238,537 +528,103 +169,840 +321,44 +102,408 +825,346 +1220,791 +1223,584 +907,597 +785,766 +147,654 +201,707 +775,674 +746,651 +221,354 +213,460 +843,105 +59,110 +224,773 +654,368 +666,21 +1134,736 +475,121 +445,799 +1141,411 +835,688 +810,12 +810,882 +1064,51 +1240,805 +266,723 +125,812 +1048,299 +213,68 +129,738 +100,256 +666,551 +1004,632 +1250,505 +119,674 +565,264 +937,220 +387,497 +1235,259 +8,658 +902,294 +159,884 +222,159 +184,645 +700,646 +1251,110 +53,469 +1228,282 +157,779 +862,759 +694,31 +10,876 +652,110 +1104,505 +554,582 +574,742 +985,642 +410,830 +873,420 +623,42 +70,89 +922,395 +627,446 +724,848 +610,534 +1042,283 +852,731 +370,193 +109,420 +1275,239 +582,546 +88,537 +1133,682 +584,847 +835,654 +299,649 +735,82 +467,547 +408,51 +1278,233 +758,325 +1044,171 +233,364 +490,16 +326,187 +455,114 +1231,504 +1300,876 +403,830 +1185,418 +731,187 +256,354 +1200,725 +1101,338 +781,399 +1207,147 +1153,502 +335,752 +716,389 +811,747 +619,311 +865,95 +221,443 +567,310 +503,112 +646,658 +296,617 +314,40 +813,483 +1223,252 +813,502 +566,724 +445,95 +832,437 +191,614 +268,611 +162,78 +303,5 +865,114 +373,108 +688,9 +692,511 +403,696 +1071,724 +786,401 +544,164 +150,457 +75,198 +1006,607 +441,68 +300,873 +160,686 +1059,646 +53,47 +850,847 +458,182 +1265,259 +869,826 +571,241 +408,395 +1007,889 +515,95 +458,163 +154,761 +642,774 +571,653 +199,266 +364,719 +109,474 +700,360 +160,14 +671,345 +448,583 +711,666 +296,277 +984,187 +1096,824 +381,469 +649,624 +1310,635 +1206,607 +392,35 +381,698 +520,479 +482,145 +498,444 +239,170 +601,21 +522,840 +1067,770 +415,259 +827,595 +52,725 +251,597 +0,10 +150,736 +194,840 +504,630 +586,275 +140,387 +716,284 +619,127 +1066,178 +827,299 +858,634 +652,336 +738,612 +1016,233 +431,595 +760,656 +909,803 +960,679 +171,376 +45,194 +687,852 +923,385 +1116,840 +112,696 +1193,575 +119,786 +290,159 +401,803 +515,662 +708,110 +1054,354 +1019,351 +1103,408 +1250,610 +979,430 +213,434 +574,395 +1153,859 +654,635 +671,526 +912,873 +664,236 +1126,697 +157,819 +1129,271 +460,46 +494,196 +604,849 +1131,206 +975,80 +1111,655 +798,473 +716,262 +493,644 +378,607 +1087,285 +490,526 +914,400 +485,444 +938,584 +735,812 +639,549 +408,724 +244,178 +934,166 +739,241 +325,700 +139,120 +1067,124 +950,681 +356,863 +639,345 +618,735 +1242,270 +848,302 +222,107 +663,142 +1302,658 +441,98 +850,495 +759,733 +386,516 +488,250 +892,691 +869,684 +1136,886 +1067,572 +671,318 +890,560 +82,53 +692,735 +1061,234 +1097,460 +922,275 +1006,679 +631,341 +100,424 +1032,166 +959,553 +1046,22 +422,64 +537,266 +340,830 +945,562 +190,357 +1206,516 +541,546 +656,78 +756,190 +146,411 +723,15 +1148,816 +602,744 +602,560 +1171,351 +262,859 +761,578 +410,206 +923,110 +223,285 +554,246 +420,425 +251,248 +1287,229 +90,651 +691,311 +879,161 +445,418 +32,9 +97,681 +1032,280 +782,551 +1228,53 +479,334 +869,98 +1221,264 +959,889 +57,120 +795,120 +435,452 +750,830 +529,674 +666,721 +996,152 +596,740 +1072,203 +1141,252 +937,200 +825,444 +192,262 +117,266 +969,10 +45,700 +202,634 +909,539 +930,291 +852,289 +1113,459 +447,668 +1174,145 +766,806 +234,493 +497,168 +725,479 +243,572 +36,308 +231,35 +653,700 +1155,742 +967,352 +90,567 +1210,256 +26,133 +164,430 +852,182 +550,835 +575,278 +1096,518 +408,618 +1126,645 +291,203 +843,547 +393,589 +251,646 +403,597 +956,873 +504,158 +438,730 +1042,611 +36,383 +622,233 +954,255 +686,336 +1072,89 +882,312 +1012,184 +1056,231 +1240,89 +639,368 +1185,226 +37,530 +1240,133 +1033,619 +1116,847 +624,336 +1227,770 +298,38 +418,243 +60,877 +817,112 +554,638 +1148,766 +495,94 +363,239 +171,518 +167,884 +192,632 +1227,124 +119,332 +1279,42 +1275,655 +387,385 +843,211 +145,271 +416,203 +1042,560 +560,275 +378,597 +199,239 +1242,723 +1200,54 +684,255 +649,270 +709,425 +234,137 +52,560 +36,159 +1298,264 +1201,420 +1143,570 +769,796 +773,19 +1181,128 +474,712 +535,184 +713,120 +1273,635 +267,385 +768,849 +848,592 +94,718 +1101,767 +1054,21 +156,819 +827,518 +1258,560 +243,770 +1043,497 +1278,9 +234,849 +962,262 +602,150 +720,35 +1054,522 +758,38 +1287,341 +1207,733 +1114,849 +254,572 +1114,493 +836,712 +951,751 +410,64 +1282,255 +818,414 +776,759 +813,392 +1198,824 +150,158 +850,757 +489,334 +1272,415 +23,344 +1043,833 +110,840 +104,656 +750,512 +766,730 +1116,137 +594,610 +358,534 +474,182 +408,276 +282,870 +172,749 +619,799 +418,19 +653,418 +795,792 +1034,119 +1191,786 +1255,228 +562,220 +410,688 +139,214 +806,630 +683,446 +57,827 +508,147 +1193,266 +766,520 +147,78 +186,835 +441,826 +756,638 +80,499 +1141,483 +1089,443 +932,597 +1044,569 +1185,28 +937,108 +915,687 +165,334 +954,863 +468,835 +246,499 +671,121 +89,264 +745,30 +542,824 +311,352 +395,207 +878,159 +981,252 +104,387 +623,303 +333,859 +972,469 +1225,155 +364,287 +1216,830 +668,264 +560,718 +902,276 +766,390 +528,551 +445,875 +606,54 +1242,171 +1305,668 +268,507 +1118,144 +1076,493 +112,198 +773,394 +403,259 +1203,228 +1148,78 +276,735 +22,378 +1029,694 +1124,835 +162,206 +169,483 +467,120 +900,830 +668,64 +49,367 +1037,308 +760,59 +736,742 +820,480 +411,770 +663,752 +500,425 +500,469 +104,159 +756,582 +103,147 +68,270 +873,698 +1146,318 +1310,240 +105,764 +642,64 +102,38 +1148,592 +890,21 +497,194 +145,308 +266,171 +873,411 +258,714 +870,719 +500,882 +1253,120 +261,81 +744,651 +1258,520 +542,70 +1298,885 +1115,518 +813,75 +852,163 +587,15 +460,399 +552,653 +89,712 +806,158 +88,651 +381,420 +726,47 +547,676 +925,67 +1205,92 +716,610 +281,786 +537,319 +1268,247 +1208,856 +497,726 +460,847 +181,271 +981,194 +1171,571 +592,200 +154,133 +594,505 +687,303 +1200,358 +1255,666 +159,772 +535,108 +453,476 +1170,112 +542,268 +281,694 +705,815 +117,866 +746,203 +1253,67 +1191,75 +119,75 +328,411 +850,46 +1088,607 +44,646 +682,761 +1231,726 +1200,838 +445,114 +176,158 +335,682 +129,290 +1265,194 +639,318 +1059,597 +1116,54 +45,259 +701,252 +644,873 +1037,831 +832,736 +738,393 +131,70 +1205,316 +239,259 +828,761 +529,259 +1086,241 +1179,824 +1011,245 +1295,325 +791,425 +282,24 +792,313 +879,285 +441,684 +1150,219 +140,283 +49,115 +256,873 +504,264 +668,824 +552,508 +858,260 +1042,287 +1146,32 +594,465 +431,285 +1266,646 +278,166 +1280,336 +447,226 +704,840 +438,806 +1298,233 +687,591 +1114,737 +294,885 +1179,70 +776,135 +459,518 +1144,219 +666,873 +1014,617 +60,389 +602,179 +1160,437 +1153,115 +915,207 +100,190 +1148,480 +920,263 +199,655 +10,245 +485,848 +1071,635 +290,271 +1054,746 +387,397 +177,682 +586,270 +658,336 +1163,654 +282,758 +1094,515 +94,830 +623,852 +38,522 +549,92 +564,327 +744,243 +1200,851 +495,800 +1240,668 +775,786 +1298,70 +1200,374 +835,121 +186,465 +415,892 +851,518 +564,203 +1056,663 +709,873 +837,623 +246,395 +756,424 +398,204 +587,187 +1266,310 +628,133 +924,334 +455,655 +398,873 +320,222 +1170,334 +83,124 +739,124 +959,540 +1220,679 +390,631 +544,88 +290,607 +102,632 +820,576 +278,280 +1310,187 +80,395 +105,443 +70,668 +1044,395 +251,382 +68,848 +267,61 +1111,332 +127,556 +1258,179 +1044,505 +738,282 +82,612 +934,614 +1054,204 +72,348 +254,663 +1043,397 +85,291 +877,155 +417,91 +460,137 +565,579 +564,567 +1041,550 +565,30 +1000,859 +1056,791 +688,233 +595,336 +1012,479 +140,334 +256,148 +1220,651 +542,178 +209,767 +534,759 +1287,547 +1213,681 +1076,849 +508,747 +273,831 +276,149 +256,298 +194,54 +872,88 +441,656 +214,175 +266,569 +865,875 +12,630 +1000,523 +1242,494 +873,196 +157,35 +420,469 +445,780 +551,733 +760,835 +1118,750 +551,161 +709,831 +448,311 +1275,319 +1057,192 +136,749 +628,761 +365,332 +1153,75 +846,117 +546,133 +1288,378 +900,512 +223,609 +350,159 +1287,344 +1103,668 +125,418 +440,719 +832,826 +36,586 +776,57 +1171,214 +480,456 +668,120 +646,12 +947,95 +378,159 +31,852 +1170,387 +535,786 +572,612 +619,583 +1086,101 +432,159 +560,619 +2,320 +1143,10 +53,847 +256,220 +894,805 +152,186 +136,817 +32,233 +1101,786 +579,288 +117,351 +1043,845 +731,707 +666,18 +1208,408 +32,885 +268,283 +929,698 +326,570 +590,35 +104,607 +654,436 +139,571 +619,655 +403,417 +1076,401 +1220,243 +990,672 +1308,574 +1109,707 +1032,614 +499,152 + +fold along x=655 +fold along y=447 +fold along x=327 +fold along y=223 +fold along x=163 +fold along y=111 +fold along x=81 +fold along y=55 +fold along x=40 +fold along y=27 +fold along y=13 +fold along y=6 \ No newline at end of file diff --git a/src/day12.rs b/src/day12.rs index 4526af8..7a4ce96 100644 --- a/src/day12.rs +++ b/src/day12.rs @@ -175,17 +175,17 @@ start-RW"; } // These are very slow, so they are commented out. - #[test] - fn part2_test_3() -> anyhow::Result<()> { - let d = Day12::init(INPUT_3.to_string())?; - assert_eq!("3509", d.part2()?); - Ok(()) - } - - #[test] - fn part2_real() -> anyhow::Result<()> { - let d = Day12::init(crate::load_input("12")?)?; - assert_eq!("117095", d.part2()?); - Ok(()) - } + // #[test] + // fn part2_test_3() -> anyhow::Result<()> { + // let d = Day12::init(INPUT_3.to_string())?; + // assert_eq!("3509", d.part2()?); + // Ok(()) + // } + // + // #[test] + // fn part2_real() -> anyhow::Result<()> { + // let d = Day12::init(crate::load_input("12")?)?; + // assert_eq!("117095", d.part2()?); + // Ok(()) + // } } \ No newline at end of file diff --git a/src/day13.rs b/src/day13.rs new file mode 100644 index 0000000..62c540b --- /dev/null +++ b/src/day13.rs @@ -0,0 +1,152 @@ +use std::collections::HashSet; +use std::str::FromStr; +use crate::Day; + +pub struct Day13 { + points: HashSet<(i32, i32)>, + folds: Vec, +} + +#[derive(Ord, PartialOrd, Eq, PartialEq, Copy, Clone, Debug)] +enum Fold { + X(i32), + Y(i32), +} + +impl FromStr for Fold { + type Err = (); + + fn from_str(s: &str) -> Result { + let r = s.rsplit(' ').nth(0).ok_or_else(|| ())?; + let z = r.split('=').collect::>(); + match z[0] { + "x" => Ok(Fold::X(z[1].parse().map_err(|_| ())?)), + "y" => Ok(Fold::Y(z[1].parse().map_err(|_| ())?)), + _ => Err(()), + } + } +} + + +impl Day for Day13 { + fn init(content: String) -> anyhow::Result { + let l = content.lines(); + let points = l.clone().take_while(|&x| x != "").map(|st| st.split(',') + .map(str::parse).flatten().collect::>()).map(|v| (v[0], v[1])).collect::>(); + + Ok(Self { + points, + folds: l.filter(|st| st.starts_with("fold along")).map(str::parse).flatten().collect::>(), + }) + } + + fn part1(&self) -> anyhow::Result { + let fold = self.folds[0]; + let map = self.points.clone(); + Ok(format!("{}", flip(map, fold).len())) + } + + fn part2(&self) -> anyhow::Result { + let r = self.folds.iter().fold(self.points.clone(), |a, &b| flip(a, b)); + let max_x = r.iter().max_by(|&(xm, _), &(xn, _)| xm.cmp(xn)).ok_or_else(|| anyhow::Error::msg("X is empty!"))?; + let max_y = r.iter().max_by(|&(_, xm), &(_, xn)| xm.cmp(xn)).ok_or_else(|| anyhow::Error::msg("Y is empty!"))?; + let mut z = String::new(); + for y in 0..=max_y.1 { + for x in 0..=max_x.0 { + if r.contains(&(x, y)) { + z += "█"; + } else { + z += " "; + } + } + z += "\n"; + } + Ok(format!("\n{}", z)) + } +} + +fn flip(set: HashSet<(i32, i32)>, f: Fold) -> HashSet<(i32, i32)> { + set.iter().map(|&e| flip_one(e, f)).collect() +} + +fn flip_one((x, y): (i32, i32), f: Fold) -> (i32, i32) { + match f { + Fold::X(pos) => { + let new_x = if x > pos { + pos - x + pos + } else { + x + }; + (new_x, y) + } + Fold::Y(pos) => { + let new_y = if y > pos { + pos - y + pos + } else { + y + }; + (x, new_y) + } + } +} + +#[cfg(test)] +mod tests { + use std::collections::HashSet; + use crate::day13::{Day13, flip, flip_one, Fold}; + use crate::day::Day; + + const INPUT: &str = r"6,10 +0,14 +9,10 +0,3 +10,4 +4,11 +6,0 +6,12 +4,1 +0,13 +10,12 +3,4 +3,0 +8,4 +1,10 +2,14 +8,10 +9,0 + +fold along y=7 +fold along x=5"; + + #[test] + fn flip_test() { + assert_eq!(flip_one((0, 0), Fold::X(3)), (0, 0)); + assert_eq!(flip_one((3, 0), Fold::X(3)), (3, 0)); + assert_eq!(flip_one((6, 0), Fold::X(3)), (0, 0)); + } + + #[test] + fn flip_set_test() { + let set = HashSet::from([(0, 3), (3, 2), (6, 3)]); + let r = flip(set, Fold::X(3)); + assert!(r.contains(&(0, 3))); + assert!(r.contains(&(3, 2))); + assert!(!r.contains(&(6, 3))); + assert_eq!(r.len(), 2); + } + + #[test] + fn part1_test() -> anyhow::Result<()> { + let d = Day13::init(INPUT.to_string())?; + assert_eq!("17", d.part1()?); + Ok(()) + } + + #[test] + fn part1_real() -> anyhow::Result<()> { + let d = Day13::init(crate::load_input("13")?)?; + assert_eq!("781", d.part1()?); + Ok(()) + } +} + diff --git a/src/main.rs b/src/main.rs index b81e939..bb3d30c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ use crate::day09::Day09; use crate::day10::Day10; use crate::day11::Day11; use crate::day12::Day12; +use crate::day13::Day13; mod day; mod day01; @@ -29,6 +30,7 @@ mod day09; mod day10; mod day11; mod day12; +mod day13; fn load_input(day: &str) -> Result { read_to_string(format!("./input/day{}", day)).map_err(|x| x.into()) @@ -75,7 +77,8 @@ fn main() -> anyhow::Result<()> { Box::new(Day09::init(load_input("09")?)?), Box::new(Day10::init(load_input("10")?)?), Box::new(Day11::init(load_input("11")?)?), - Box::new(Day12::init(load_input("12")?)?),]; + Box::new(Day12::init(load_input("12")?)?), + Box::new(Day13::init(load_input("13")?)?),]; let _verbosity = matches.occurrences_of("v"); if matches.is_present("all") {