From e7c222f84f62993550d04482b352693e046c02c8 Mon Sep 17 00:00:00 2001 From: Anson Date: Sun, 6 Nov 2022 17:38:17 -0700 Subject: [PATCH] finished day 6 --- Cargo.lock | 33 ++++++ Cargo.toml | 6 +- inputs/day6.txt | 300 ++++++++++++++++++++++++++++++++++++++++++++++++ src/day6.rs | 196 +++++++++++++++++++++++++++++++ src/main.rs | 4 +- 5 files changed, 536 insertions(+), 3 deletions(-) create mode 100644 inputs/day6.txt create mode 100644 src/day6.rs diff --git a/Cargo.lock b/Cargo.lock index efc452d..86a891a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,22 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "aho-corasick" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +dependencies = [ + "memchr", +] + [[package]] name = "aoc_2015" version = "0.1.0" dependencies = [ "itertools", "md5", + "regex", ] [[package]] @@ -30,3 +40,26 @@ name = "md5" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "regex" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" diff --git a/Cargo.toml b/Cargo.toml index 3e5c9f2..2837de5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,8 @@ edition = "2021" [dependencies] md5 = "0.7.0" -itertools = "0.10.5" \ No newline at end of file +itertools = "0.10.5" +regex = "1.7.0" + +[profile.bench] +debug = true \ No newline at end of file diff --git a/inputs/day6.txt b/inputs/day6.txt new file mode 100644 index 0000000..495311e --- /dev/null +++ b/inputs/day6.txt @@ -0,0 +1,300 @@ +turn off 660,55 through 986,197 +turn off 341,304 through 638,850 +turn off 199,133 through 461,193 +toggle 322,558 through 977,958 +toggle 537,781 through 687,941 +turn on 226,196 through 599,390 +turn on 240,129 through 703,297 +turn on 317,329 through 451,798 +turn on 957,736 through 977,890 +turn on 263,530 through 559,664 +turn on 158,270 through 243,802 +toggle 223,39 through 454,511 +toggle 544,218 through 979,872 +turn on 313,306 through 363,621 +toggle 173,401 through 496,407 +toggle 333,60 through 748,159 +turn off 87,577 through 484,608 +turn on 809,648 through 826,999 +toggle 352,432 through 628,550 +turn off 197,408 through 579,569 +turn off 1,629 through 802,633 +turn off 61,44 through 567,111 +toggle 880,25 through 903,973 +turn on 347,123 through 864,746 +toggle 728,877 through 996,975 +turn on 121,895 through 349,906 +turn on 888,547 through 931,628 +toggle 398,782 through 834,882 +turn on 966,850 through 989,953 +turn off 891,543 through 914,991 +toggle 908,77 through 916,117 +turn on 576,900 through 943,934 +turn off 580,170 through 963,206 +turn on 184,638 through 192,944 +toggle 940,147 through 978,730 +turn off 854,56 through 965,591 +toggle 717,172 through 947,995 +toggle 426,987 through 705,998 +turn on 987,157 through 992,278 +toggle 995,774 through 997,784 +turn off 796,96 through 845,182 +turn off 451,87 through 711,655 +turn off 380,93 through 968,676 +turn on 263,468 through 343,534 +turn on 917,936 through 928,959 +toggle 478,7 through 573,148 +turn off 428,339 through 603,624 +turn off 400,880 through 914,953 +toggle 679,428 through 752,779 +turn off 697,981 through 709,986 +toggle 482,566 through 505,725 +turn off 956,368 through 993,516 +toggle 735,823 through 783,883 +turn off 48,487 through 892,496 +turn off 116,680 through 564,819 +turn on 633,865 through 729,930 +turn off 314,618 through 571,922 +toggle 138,166 through 936,266 +turn on 444,732 through 664,960 +turn off 109,337 through 972,497 +turn off 51,432 through 77,996 +turn off 259,297 through 366,744 +toggle 801,130 through 917,544 +toggle 767,982 through 847,996 +turn on 216,507 through 863,885 +turn off 61,441 through 465,731 +turn on 849,970 through 944,987 +toggle 845,76 through 852,951 +toggle 732,615 through 851,936 +toggle 251,128 through 454,778 +turn on 324,429 through 352,539 +toggle 52,450 through 932,863 +turn off 449,379 through 789,490 +turn on 317,319 through 936,449 +toggle 887,670 through 957,838 +toggle 671,613 through 856,664 +turn off 186,648 through 985,991 +turn off 471,689 through 731,717 +toggle 91,331 through 750,758 +toggle 201,73 through 956,524 +toggle 82,614 through 520,686 +toggle 84,287 through 467,734 +turn off 132,367 through 208,838 +toggle 558,684 through 663,920 +turn on 237,952 through 265,997 +turn on 694,713 through 714,754 +turn on 632,523 through 862,827 +turn on 918,780 through 948,916 +turn on 349,586 through 663,976 +toggle 231,29 through 257,589 +toggle 886,428 through 902,993 +turn on 106,353 through 236,374 +turn on 734,577 through 759,684 +turn off 347,843 through 696,912 +turn on 286,699 through 964,883 +turn on 605,875 through 960,987 +turn off 328,286 through 869,461 +turn off 472,569 through 980,848 +toggle 673,573 through 702,884 +turn off 398,284 through 738,332 +turn on 158,50 through 284,411 +turn off 390,284 through 585,663 +turn on 156,579 through 646,581 +turn on 875,493 through 989,980 +toggle 486,391 through 924,539 +turn on 236,722 through 272,964 +toggle 228,282 through 470,581 +toggle 584,389 through 750,761 +turn off 899,516 through 900,925 +turn on 105,229 through 822,846 +turn off 253,77 through 371,877 +turn on 826,987 through 906,992 +turn off 13,152 through 615,931 +turn on 835,320 through 942,399 +turn on 463,504 through 536,720 +toggle 746,942 through 786,998 +turn off 867,333 through 965,403 +turn on 591,477 through 743,692 +turn off 403,437 through 508,908 +turn on 26,723 through 368,814 +turn on 409,485 through 799,809 +turn on 115,630 through 704,705 +turn off 228,183 through 317,220 +toggle 300,649 through 382,842 +turn off 495,365 through 745,562 +turn on 698,346 through 744,873 +turn on 822,932 through 951,934 +toggle 805,30 through 925,421 +toggle 441,152 through 653,274 +toggle 160,81 through 257,587 +turn off 350,781 through 532,917 +toggle 40,583 through 348,636 +turn on 280,306 through 483,395 +toggle 392,936 through 880,955 +toggle 496,591 through 851,934 +turn off 780,887 through 946,994 +turn off 205,735 through 281,863 +toggle 100,876 through 937,915 +turn on 392,393 through 702,878 +turn on 956,374 through 976,636 +toggle 478,262 through 894,775 +turn off 279,65 through 451,677 +turn on 397,541 through 809,847 +turn on 444,291 through 451,586 +toggle 721,408 through 861,598 +turn on 275,365 through 609,382 +turn on 736,24 through 839,72 +turn off 86,492 through 582,712 +turn on 676,676 through 709,703 +turn off 105,710 through 374,817 +toggle 328,748 through 845,757 +toggle 335,79 through 394,326 +toggle 193,157 through 633,885 +turn on 227,48 through 769,743 +toggle 148,333 through 614,568 +toggle 22,30 through 436,263 +toggle 547,447 through 688,969 +toggle 576,621 through 987,740 +turn on 711,334 through 799,515 +turn on 541,448 through 654,951 +toggle 792,199 through 798,990 +turn on 89,956 through 609,960 +toggle 724,433 through 929,630 +toggle 144,895 through 201,916 +toggle 226,730 through 632,871 +turn off 760,819 through 828,974 +toggle 887,180 through 940,310 +toggle 222,327 through 805,590 +turn off 630,824 through 885,963 +turn on 940,740 through 954,946 +turn on 193,373 through 779,515 +toggle 304,955 through 469,975 +turn off 405,480 through 546,960 +turn on 662,123 through 690,669 +turn off 615,238 through 750,714 +turn on 423,220 through 930,353 +turn on 329,769 through 358,970 +toggle 590,151 through 704,722 +turn off 884,539 through 894,671 +toggle 449,241 through 984,549 +toggle 449,260 through 496,464 +turn off 306,448 through 602,924 +turn on 286,805 through 555,901 +toggle 722,177 through 922,298 +toggle 491,554 through 723,753 +turn on 80,849 through 174,996 +turn off 296,561 through 530,856 +toggle 653,10 through 972,284 +toggle 529,236 through 672,614 +toggle 791,598 through 989,695 +turn on 19,45 through 575,757 +toggle 111,55 through 880,871 +turn off 197,897 through 943,982 +turn on 912,336 through 977,605 +toggle 101,221 through 537,450 +turn on 101,104 through 969,447 +toggle 71,527 through 587,717 +toggle 336,445 through 593,889 +toggle 214,179 through 575,699 +turn on 86,313 through 96,674 +toggle 566,427 through 906,888 +turn off 641,597 through 850,845 +turn on 606,524 through 883,704 +turn on 835,775 through 867,887 +toggle 547,301 through 897,515 +toggle 289,930 through 413,979 +turn on 361,122 through 457,226 +turn on 162,187 through 374,746 +turn on 348,461 through 454,675 +turn off 966,532 through 985,537 +turn on 172,354 through 630,606 +turn off 501,880 through 680,993 +turn off 8,70 through 566,592 +toggle 433,73 through 690,651 +toggle 840,798 through 902,971 +toggle 822,204 through 893,760 +turn off 453,496 through 649,795 +turn off 969,549 through 990,942 +turn off 789,28 through 930,267 +toggle 880,98 through 932,434 +toggle 568,674 through 669,753 +turn on 686,228 through 903,271 +turn on 263,995 through 478,999 +toggle 534,675 through 687,955 +turn off 342,434 through 592,986 +toggle 404,768 through 677,867 +toggle 126,723 through 978,987 +toggle 749,675 through 978,959 +turn off 445,330 through 446,885 +turn off 463,205 through 924,815 +turn off 417,430 through 915,472 +turn on 544,990 through 912,999 +turn off 201,255 through 834,789 +turn off 261,142 through 537,862 +turn off 562,934 through 832,984 +turn off 459,978 through 691,980 +turn off 73,911 through 971,972 +turn on 560,448 through 723,810 +turn on 204,630 through 217,854 +turn off 91,259 through 611,607 +turn on 877,32 through 978,815 +turn off 950,438 through 974,746 +toggle 426,30 through 609,917 +toggle 696,37 through 859,201 +toggle 242,417 through 682,572 +turn off 388,401 through 979,528 +turn off 79,345 through 848,685 +turn off 98,91 through 800,434 +toggle 650,700 through 972,843 +turn off 530,450 through 538,926 +turn on 428,559 through 962,909 +turn on 78,138 through 92,940 +toggle 194,117 through 867,157 +toggle 785,355 through 860,617 +turn off 379,441 through 935,708 +turn off 605,133 through 644,911 +toggle 10,963 through 484,975 +turn off 359,988 through 525,991 +turn off 509,138 through 787,411 +toggle 556,467 through 562,773 +turn on 119,486 through 246,900 +turn on 445,561 through 794,673 +turn off 598,681 through 978,921 +turn off 974,230 through 995,641 +turn off 760,75 through 800,275 +toggle 441,215 through 528,680 +turn off 701,636 through 928,877 +turn on 165,753 through 202,780 +toggle 501,412 through 998,516 +toggle 161,105 through 657,395 +turn on 113,340 through 472,972 +toggle 384,994 through 663,999 +turn on 969,994 through 983,997 +turn on 519,600 through 750,615 +turn off 363,899 through 948,935 +turn on 271,845 through 454,882 +turn off 376,528 through 779,640 +toggle 767,98 through 854,853 +toggle 107,322 through 378,688 +turn off 235,899 through 818,932 +turn on 445,611 through 532,705 +toggle 629,387 through 814,577 +toggle 112,414 through 387,421 +toggle 319,184 through 382,203 +turn on 627,796 through 973,940 +toggle 602,45 through 763,151 +turn off 441,375 through 974,545 +toggle 871,952 through 989,998 +turn on 717,272 through 850,817 +toggle 475,711 through 921,882 +toggle 66,191 through 757,481 +turn off 50,197 through 733,656 +toggle 83,575 through 915,728 +turn on 777,812 through 837,912 +turn on 20,984 through 571,994 +turn off 446,432 through 458,648 +turn on 715,871 through 722,890 +toggle 424,675 through 740,862 +toggle 580,592 through 671,900 +toggle 296,687 through 906,775 diff --git a/src/day6.rs b/src/day6.rs new file mode 100644 index 0000000..5da26ab --- /dev/null +++ b/src/day6.rs @@ -0,0 +1,196 @@ +use regex::Regex; +use std::collections::HashMap; +use std::fs; + +pub fn run() { + println!("Day 6:"); + let input = fs::read_to_string("./inputs/day6.txt").expect("Could not read file"); + + println!("\tPart 1: {}", part1(&input)); + println!("\tPart 2: {}", part2(&input)); +} + +#[derive(Debug)] +enum Operation { + Off, + On, + Toggle, +} + +#[derive(Eq, Hash, PartialEq, Debug)] +pub struct Point { + x: usize, + y: usize, +} + +impl Point { + pub fn new(x: usize, y: usize) -> Self { + Self { x, y } + } +} + +fn command(cmd: &str) -> (Operation, (Point, Point)) { + let op: Operation; + + if Regex::new(r"^turn on \d").unwrap().is_match(cmd) { + op = Operation::On; + } else if cmd.contains("turn off") { + op = Operation::Off; + } else if cmd.contains("toggle") { + op = Operation::Toggle; + } else { + panic!() + } + + let re = Regex::new(r"(?P\d+),(?P\d+) through (?P\d+),(?P\d+)").unwrap(); + let caps = re.captures(cmd).unwrap(); + + let start = Point::new( + caps.name("x1").unwrap().as_str().parse::().unwrap(), + caps.name("y1").unwrap().as_str().parse::().unwrap(), + ); + + let end = Point::new( + caps.name("x2").unwrap().as_str().parse::().unwrap(), + caps.name("y2").unwrap().as_str().parse::().unwrap(), + ); + + (op, (start, end)) +} + +// fn part1(directions: &str) -> usize { +// let mut lights = Box::new([[false; 1000]; 1000]); +// for dir in directions.split('\n') { +// if dir.is_empty() { +// continue; +// } +// let (operation, (start, end)) = command(dir); + +// for x in start.x..=end.x { +// for y in start.y..=end.y { +// lights[x][y] = match &operation { +// Operation::On => true, +// Operation::Off => false, +// Operation::Toggle => !lights[x][y], +// } +// } +// } +// } + +// let mut sum = 0; + +// for row in lights.iter() { +// for light in row { +// sum += *light as usize; +// } +// } + +// sum +// } + +fn part1(directions: &str) -> usize { + let mut lights: HashMap = HashMap::with_capacity(1000000); + + for dir in directions.split('\n') { + if dir.is_empty() { + continue; + } + let (operation, (start, end)) = command(dir); + for x in start.x..=end.x { + for y in start.y..=end.y { + let pt = Point::new(x, y); + // let mut brightness = *lights.get(&pt).unwrap_or(&0); + let brightness = match &operation { + Operation::On => true, + Operation::Off => false, + Operation::Toggle => *lights.get(&pt).unwrap_or(&false), + }; + lights.insert(pt, brightness); + } + } + } + + let mut total_brightness = 0; + + for brightness in lights.values() { + total_brightness += *brightness as usize; + } + + total_brightness +} + +fn part2(directions: &str) -> usize { + let mut lights: HashMap = HashMap::with_capacity(1000000); + + for dir in directions.split('\n') { + if dir.is_empty() { + continue; + } + let (operation, (start, end)) = command(dir); + for x in start.x..=end.x { + for y in start.y..=end.y { + let pt = Point::new(x, y); + let mut brightness = *lights.get(&pt).unwrap_or(&0); + brightness = match &operation { + Operation::Toggle => brightness + 2, + Operation::On => brightness + 1, + Operation::Off => brightness.saturating_sub(1), + }; + lights.insert(pt, brightness); + } + } + } + + let mut total_brightness = 0; + + for brightness in lights.values() { + total_brightness += brightness; + } + + total_brightness +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_all_on() { + assert_eq!(part1("turn on 0,0 through 999,999\n"), 1000 * 1000); + } + + #[test] + fn part1_all_on_then_middle_off() { + assert_eq!( + part1("turn on 0,0 through 999,999\nturn off 499,499 through 500,500"), + 1000 * 1000 - 4 + ); + } + #[test] + fn part1_all_commands() { + assert_eq!( + part1("turn on 0,0 through 999,999\ntoggle 0,0 through 999,0\nturn off 499,499 through 500,500"), + 1000 * 1000 - 4 - 1000 + ); + } + #[test] + fn part1_input() { + let input = fs::read_to_string("./inputs/day6.txt").expect("Could not read file"); + assert_eq!(part1(&input), 400410); + } + #[test] + fn part2_one_light() { + assert_eq!(part2("turn on 0,0 through 0,0"), 1); + } + #[test] + fn part2_all_toggle() { + assert_eq!(part2("toggle 0,0 through 999,999"), 2000000); + } + #[test] + fn part2_all_on_of_repeat() { + assert_eq!( + part2(&"turn on 0,0 through 9,9\nturn off 0,0 through 9,9\n".repeat(1000)), + 0 + ); + } +} diff --git a/src/main.rs b/src/main.rs index c1687b7..fa6efbc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,7 @@ mod day2; mod day3; mod day4; mod day5; -// mod day6; +mod day6; fn main() { println!("Running Advent of Code 2021"); @@ -12,5 +12,5 @@ fn main() { day3::run(); day4::run(); day5::run(); - // day6::run(); + day6::run(); }