Solve 2021/day13

master
Alfred Melch 3 years ago
parent 145a1a1ba0
commit f2821aac4c

@ -0,0 +1,7 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "day13"
version = "0.1.0"

@ -0,0 +1,8 @@
[package]
name = "day13"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

@ -0,0 +1,169 @@
https://adventofcode.com/2021/day/13
## \--- Day 13: Transparent Origami ---
You reach another volcanically active part of the cave. It would be nice if
you could do some kind of thermal imaging so you could tell ahead of time
which caves are too hot to safely enter.
Fortunately, the submarine seems to be equipped with a thermal camera! When
you activate it, you are greeted with:
[code]
Congratulations on your purchase! To activate this infrared thermal imaging
camera system, please enter the code found on page 1 of the manual.
[/code]
Apparently, the Elves have never used this feature. To your surprise, you
manage to find the manual; as you go to open it, page 1 falls out. It's a
large sheet of [transparent
paper](https://en.wikipedia.org/wiki/Transparency_\(projection\))! The
transparent paper is marked with random dots and includes instructions on how
to fold it up (your puzzle input). For example:
[code]
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
[/code]
The first section is a list of dots on the transparent paper. `0,0` represents
the top-left coordinate. The first value, `x`, increases to the right. The
second value, `y`, increases downward. So, the coordinate `3,0` is to the
right of `0,0`, and the coordinate `0,7` is below `0,0`. The coordinates in
this example form the following pattern, where `#` is a dot on the paper and
`.` is an empty, unmarked position:
[code]
...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
...........
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........
[/code]
Then, there is a list of _fold instructions_. Each instruction indicates a
line on the transparent paper and wants you to fold the paper _up_ (for
horizontal `y=...` lines) or _left_ (for vertical `x=...` lines). In this
example, the first fold instruction is `fold along y=7`, which designates the
line formed by all of the positions where `y` is `7` (marked here with `-`):
[code]
...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
-----------
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........
[/code]
Because this is a horizontal line, fold the bottom half _up_. Some of the dots
might end up overlapping after the fold is complete, but dots will never
appear exactly on a fold line. The result of doing this fold looks like this:
[code]
#.##..#..#.
#...#......
......#...#
#...#......
.#.#..#.###
...........
...........
[/code]
Now, only `17` dots are visible.
Notice, for example, the two dots in the bottom left corner before the
transparent paper is folded; after the fold is complete, those dots appear in
the top left corner (at `0,0` and `0,1`). Because the paper is transparent,
the dot just below them in the result (at `0,3`) remains visible, as it can be
seen through the transparent paper.
Also notice that some dots can end up _overlapping_ ; in this case, the dots
merge together and become a single dot.
The second fold instruction is `fold along x=5`, which indicates this line:
[code]
#.##.|#..#.
#...#|.....
.....|#...#
#...#|.....
.#.#.|#.###
.....|.....
.....|.....
[/code]
Because this is a vertical line, fold _left_ :
[code]
#####
#...#
#...#
#...#
#####
.....
.....
[/code]
The instructions made a square!
The transparent paper is pretty big, so for now, focus on just completing the
first fold. After the first fold in the example above, `_17_` dots are visible
- dots that end up overlapping after the fold is completed count as a single
dot.
_How many dots are visible after completing just the first fold instruction on
your transparent paper?_

@ -0,0 +1,2 @@
Congratulations on your purchase! To activate this infrared thermal imaging
camera system, please enter the code found on page 1 of the manual.

@ -0,0 +1,21 @@
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

@ -0,0 +1,15 @@
...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
...........
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........

@ -0,0 +1,15 @@
...#..#..#.
....#......
...........
#..........
...#....#.#
...........
...........
-----------
...........
...........
.#....#.##.
....#......
......#...#
#..........
#.#........

@ -0,0 +1,7 @@
#.##..#..#.
#...#......
......#...#
#...#......
.#.#..#.###
...........
...........

@ -0,0 +1,7 @@
#.##.|#..#.
#...#|.....
.....|#...#
#...#|.....
.#.#.|#.###
.....|.....
.....|.....

@ -0,0 +1,7 @@
#####
#...#
#...#
#...#
#####
.....
.....

@ -0,0 +1,812 @@
726,774
246,695
579,249
691,724
246,820
738,887
1088,75
264,887
704,775
907,625
676,117
507,658
1009,24
547,735
157,126
599,113
445,226
363,691
918,794
927,113
999,400
443,305
654,729
408,767
1066,863
1148,473
321,35
1093,803
1044,718
202,889
262,164
378,541
619,662
1034,849
432,595
1145,656
1295,668
1125,705
1161,529
759,619
1170,147
688,742
328,729
718,439
935,701
246,647
594,110
845,495
160,189
1225,315
580,486
469,481
440,401
584,774
897,719
1007,516
547,159
112,117
982,645
62,439
192,441
631,211
654,16
113,698
378,865
373,19
441,777
390,7
1263,312
1121,610
509,582
893,352
44,131
1092,19
592,719
918,100
326,820
62,719
520,889
718,103
571,579
1165,267
1208,334
525,415
268,588
769,464
596,716
734,436
1283,747
35,457
982,94
1235,849
932,752
1265,243
262,752
99,704
547,732
1096,829
791,329
1222,320
199,568
671,494
1079,93
569,315
129,415
868,878
788,803
1175,889
965,676
904,660
552,560
619,484
507,236
566,768
1215,30
45,410
885,441
478,336
945,397
596,306
1145,686
189,495
1153,126
79,444
719,403
903,91
27,105
441,329
768,565
671,400
507,205
224,390
867,753
425,441
1123,67
833,14
793,278
1237,724
238,808
1099,32
411,243
1,574
726,120
862,441
212,94
80,199
1047,312
164,389
440,773
185,189
412,114
537,792
403,697
1208,768
408,527
1135,831
746,826
1064,110
15,226
102,574
1001,442
769,16
1236,408
440,121
1309,131
771,473
1064,527
189,284
427,704
276,865
986,593
1009,870
745,276
965,291
1190,5
1084,768
313,750
976,544
1222,658
223,619
718,791
976,574
705,822
785,863
388,390
1235,716
579,645
90,378
497,849
1308,145
658,301
648,94
1150,189
231,129
408,639
390,119
132,556
639,220
885,453
413,651
639,68
177,544
552,782
239,130
867,645
187,67
1163,494
1227,19
249,658
132,270
740,82
73,206
1166,525
262,506
1092,875
923,509
967,400
813,849
734,364
604,541
566,758
90,852
190,831
1047,65
313,144
542,157
720,304
129,863
1280,149
448,441
947,484
1048,506
408,863
657,803
480,834
201,369
489,208
1275,36
1064,784
781,845
1071,152
1251,61
455,500
564,68
758,798
922,390
443,421
505,792
60,784
1059,645
741,315
89,164
142,637
348,705
763,735
165,686
711,781
1220,852
455,120
1205,859
1208,413
1098,240
33,505
821,208
35,289
1251,833
1131,226
745,730
75,625
905,75
738,7
1223,316
923,395
7,884
1153,299
552,96
1047,134
642,266
537,698
1211,190
959,235
1235,625
711,614
510,798
73,306
47,582
657,875
468,75
638,346
144,525
612,665
917,57
1235,402
211,249
831,63
1197,250
493,686
887,801
85,315
263,65
924,306
140,595
997,141
657,173
579,850
489,686
448,5
572,7
1248,103
445,674
711,113
1232,884
1121,278
845,732
786,630
114,712
691,662
140,147
1088,299
408,191
897,691
92,662
904,754
1309,621
102,768
7,10
33,429
903,803
2,749
1083,704
157,819
325,91
830,386
763,284
175,63
902,199
887,129
1285,297
1287,683
590,304
714,716
6,686
1136,834
452,889
653,315
135,145
683,329
251,473
1110,455
959,516
1091,838
407,220
654,800
549,239
765,355
113,250
771,93
194,270
864,803
517,417
345,291
253,724
365,145
522,624
692,495
830,834
1021,301
825,595
145,890
1125,481
48,119
82,7
965,666
540,630
542,121
731,290
85,763
957,297
1277,617
1089,239
619,612
62,175
427,190
401,724
1133,798
475,882
1062,140
246,784
1001,515
244,31
759,171
1246,282
249,236
919,816
907,25
755,403
557,725
15,332
840,861
1031,760
965,218
813,45
440,829
885,457
45,243
351,435
191,565
984,820
715,275
689,641
289,845
575,892
605,822
1136,508
137,278
870,513
59,621
79,539
89,276
1,621
753,725
1119,301
1,763
1159,539
1059,25
267,843
1072,236
1203,607
425,453
62,551
788,624
576,884
326,430
345,452
539,473
1195,337
981,432
23,683
455,394
1098,654
1118,441
1277,429
567,625
773,698
23,459
441,464
870,488
567,269
517,399
935,302
436,875
309,442
900,191
1277,277
1310,165
383,781
149,792
492,578
88,658
736,500
103,275
731,44
720,794
1278,600
981,462
1020,623
329,462
333,483
977,880
1181,863
509,890
846,831
246,527
570,754
841,481
78,884
1231,355
618,47
413,719
850,786
174,386
364,175
1193,196
162,421
221,239
373,875
718,7
1231,539
1218,662
333,868
885,9
30,149
1299,511
227,190
1197,698
1150,705
657,238
783,717
1159,383
212,688
241,719
618,495
1232,458
985,432
27,75
918,506
328,800
145,582
387,395
90,516
1019,773
334,574
1285,149
716,558
413,236
353,477
607,193
845,844
874,875
1099,648
264,63
99,491
263,312
303,67
463,565
433,239
902,527
132,355
1300,550
606,119
291,849
25,86
301,865
1046,831
805,102
408,598
1101,693
1215,864
947,691
64,730
1237,170
970,628
1136,60
947,730
334,544
1149,686
1009,198
691,282
691,457
378,142
599,614
648,320
507,400
1178,803
478,558
267,51
279,701
965,452
691,232
401,170
219,838
1292,413
296,373
246,127
446,91
894,86
115,480
1287,155
433,655
263,134
87,630
965,403
107,623
189,610
330,749
1121,271
965,603
135,749
1059,473
328,165
27,147
443,134
1210,320
1211,470
415,824
835,882
405,819
957,870
493,721
1246,164
935,591
895,824
264,455
99,470
408,296
803,400
1084,126
1135,63
835,46
830,60
653,721
1104,453
525,863
102,334
1235,45
870,121
375,591
60,336
348,880
895,600
517,477
427,526
100,551
37,301
477,880
0,94
383,390
266,718
212,240
634,329
291,493
976,320
751,30
1119,593
443,753
1099,645
79,450
189,278
358,745
870,355
1064,820
353,597
770,630
157,75
22,371
214,493
465,726
1205,655
740,469
125,49
1019,849
735,556
1148,421
832,336
803,338
848,441
946,175
301,149
115,305
528,215
6,208
6,320
691,410
238,658
16,346
735,892
689,725
661,320
1136,386
1153,810
363,730
326,464
321,819
885,885
1048,388
425,9
127,809
656,16
599,280
74,408
387,509
73,724
293,877
557,687
656,878
1304,320
1034,865
704,119
126,663
141,656
914,859
1230,647
340,266
33,501
1262,352
505,344
1283,105
1198,289
855,500
574,871
540,598
465,844
1210,343
825,96
290,623
174,508
132,539
867,93
1101,201
392,142
472,126
552,320
631,739
867,473
763,758
467,67
251,269
1273,301
619,282
1148,130
801,4
566,136
1098,94
1274,47
333,411
401,82
48,352
1230,522
907,269
870,829
631,683
406,660
440,488
800,798
244,765
657,768
662,94
33,465
785,415
83,450
1159,355
653,686
392,730
417,352
691,829
902,598
947,282
242,469
135,301
174,834
816,189
914,894
671,562
460,786
1079,765
125,525
213,430
480,60
1086,390
1111,809
375,302
1227,390
1072,684
343,494
443,473
904,234
485,45
1285,86
977,299
758,782
242,425
460,718
37,593
730,486
559,877
505,102
401,812
231,254
403,269
493,238
1181,479
189,29
545,355
264,439
547,60
900,695
689,393
1079,254
408,199
846,383
1223,630
1121,284
345,666
441,117
237,800
191,525
1066,255
552,768
639,494
798,705
1004,189
1169,861
686,745
1121,29
554,126
1277,465
977,432
711,399
12,628
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

@ -0,0 +1,81 @@
use std::collections::HashSet;
use std::io::stdin;
fn main() {
let mut buffer = String::new();
let stdin = stdin();
stdin.read_line(&mut buffer).ok();
let mut points: Vec<(i32, i32)> = Vec::new();
let mut instructions: Vec<(char, i32)> = Vec::new();
// parse points
while !buffer.is_empty() {
// parse
let mut numbers = buffer.trim().split(',').map(|s| s.parse().unwrap());
let x = numbers.next().unwrap();
let y = numbers.next().unwrap();
points.push((x, y));
// read next
buffer.clear();
stdin.read_line(&mut buffer).ok();
if buffer == "\n" {
break;
}
}
stdin.read_line(&mut buffer).ok();
while !buffer.is_empty() {
let instruction = buffer.trim().split(' ').nth(2).unwrap();
let mut parts = instruction.split('=');
let axis = parts.next().unwrap().chars().next().unwrap();
let line = parts.next().unwrap().parse().unwrap();
instructions.push((axis, line));
buffer.clear();
stdin.read_line(&mut buffer).ok();
}
println!("Points: {:?}", points);
println!("Instructions: {:?}", instructions);
let part1 = apply_instructions(&points, &instructions[..1]);
let part2 = apply_instructions(&points, &instructions);
dbg!(part1.len());
let width = *part2.iter().map(|(x, _)| x).max().unwrap() + 1;
let height = *part2.iter().map(|(_, y)| y).max().unwrap() + 1;
for y in 0..height {
for x in 0..width {
if part2.contains(&(x, y)) {
print!("#");
} else {
print!(".");
}
}
println!();
}
}
fn apply_instructions(points: &[(i32, i32)], instructions: &[(char, i32)]) -> HashSet<(i32, i32)> {
let mut translated_points = HashSet::new();
for point in points {
let (mut x, mut y) = *point;
for (axis, line) in instructions {
if *axis == 'x' && x > *line {
x = 2 * line - x;
} else if *axis == 'y' && y > *line {
y = 2 * line - y;
}
}
translated_points.insert((x, y));
}
translated_points
}
Loading…
Cancel
Save