Added Day 5 Solution

main
Nichole Mattera 2 years ago committed by Nichole Mattera
parent 32c4a4c5c1
commit 04476e62c9
  1. 74
      Day 5/README.md
  2. 500
      Day 5/input
  3. 168
      Day 5/main.go

@ -0,0 +1,74 @@
# Day 5: Hydrothermal Venture
You come across a field of [hydrothermal vents](https://en.wikipedia.org/wiki/Hydrothermal_vent) on the ocean floor! These vents constantly produce large, opaque clouds, so it would be best to avoid them if possible.
They tend to form in **lines**; the submarine helpfully produces a list of nearby lines of vents (your puzzle input) for you to review. For example:
```
0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2
```
Each line of vents is given as a line segment in the format `x1,y1 -> x2,y2` where `x1`,`y1` are the coordinates of one end the line segment and `x2`,`y2` are the coordinates of the other end. These line segments include the points at both ends. In other words:
- An entry like `1,1 -> 1,3` covers points `1,1`, `1,2`, and `1,3`.
- An entry like `9,7 -> 7,7` covers points `9,7`, `8,7`, and `7,7`.
For now, **only consider horizontal and vertical lines**: lines where either `x1 = x2` or `y1 = y2`.
So, the horizontal and vertical lines from the above list would produce the following diagram:
```
.......1..
..1....1..
..1....1..
.......1..
.112111211
..........
..........
..........
..........
222111....
```
In this diagram, the top left corner is `0,0` and the bottom right corner is `9,9`. Each position is shown as **the number of lines which cover that point** or `.` if no line covers that point. The top-left pair of `1`s, for example, comes from `2,2 -> 2,1`; the very bottom row is formed by the overlapping lines `0,9 -> 5,9` and `0,9 -> 2,9`.
To avoid the most dangerous areas, you need to determine **the number of points where at least two lines overlap**. In the above example, this is anywhere in the diagram with a `2` or larger - a total of `5` points.
Consider only horizontal and vertical lines. **At how many points do at least two lines overlap?**
# Part 2
Unfortunately, considering only horizontal and vertical lines doesn't give you the full picture; you need to also consider **diagonal lines**.
Because of the limits of the hydrothermal vent mapping system, the lines in your list will only ever be horizontal, vertical, or a diagonal line at exactly 45 degrees. In other words:
- An entry like `1,1 -> 3,3` covers points `1,1`, `2,2`, and `3,3`.
- An entry like `9,7 -> 7,9` covers points `9,7`, `8,8`, and `7,9`.
Considering all lines from the above example would now produce the following diagram:
```
1.1....11.
.111...2..
..2.1.111.
...1.2.2..
.112313211
...1.2....
..1...1...
.1.....1..
1.......1.
222111....
```
You still need to determine **the number of points where at least two lines overlap**. In the above example, this is still anywhere in the diagram with a `2` or larger - now a total of `12` points.
Consider all of the lines. **At how many points do at least two lines overlap?**

@ -0,0 +1,500 @@
578,391 -> 578,322
274,585 -> 651,962
482,348 -> 294,348
682,514 -> 367,829
180,243 -> 800,863
850,828 -> 850,98
698,439 -> 460,677
518,379 -> 518,176
486,437 -> 486,640
730,420 -> 374,420
738,726 -> 632,726
48,959 -> 468,539
246,526 -> 246,174
490,438 -> 291,239
975,116 -> 272,116
695,883 -> 476,883
129,393 -> 129,300
658,556 -> 658,436
860,777 -> 860,365
229,321 -> 422,514
814,312 -> 752,312
886,103 -> 783,206
860,786 -> 701,945
551,789 -> 479,789
103,685 -> 687,685
649,395 -> 758,395
48,233 -> 48,677
385,22 -> 385,120
731,546 -> 731,463
570,507 -> 930,507
92,288 -> 780,976
270,622 -> 270,231
791,76 -> 791,769
926,60 -> 25,961
972,986 -> 47,61
382,601 -> 345,638
536,122 -> 536,822
963,864 -> 532,433
590,550 -> 590,221
768,744 -> 768,981
842,129 -> 842,65
521,548 -> 777,548
897,410 -> 773,410
433,738 -> 802,369
498,815 -> 498,874
93,905 -> 837,161
552,281 -> 552,491
274,82 -> 274,760
566,398 -> 78,886
602,654 -> 256,654
204,816 -> 818,202
488,265 -> 330,107
359,620 -> 71,332
915,133 -> 915,689
698,119 -> 316,501
347,25 -> 415,25
835,902 -> 835,65
900,539 -> 474,113
693,809 -> 245,809
16,32 -> 964,980
177,94 -> 637,554
824,455 -> 346,455
800,893 -> 264,893
109,342 -> 109,676
204,630 -> 281,630
798,930 -> 154,930
287,688 -> 287,106
67,641 -> 970,641
988,908 -> 362,282
411,949 -> 781,949
43,356 -> 187,356
331,848 -> 178,695
513,658 -> 513,763
313,250 -> 605,542
514,552 -> 185,223
652,726 -> 869,726
291,590 -> 291,969
861,808 -> 861,379
842,170 -> 842,928
570,166 -> 570,285
764,439 -> 764,486
200,806 -> 910,806
199,200 -> 876,200
323,474 -> 323,433
258,426 -> 258,808
568,575 -> 568,34
979,982 -> 12,15
424,534 -> 649,759
763,710 -> 147,94
339,232 -> 832,232
10,19 -> 450,19
241,846 -> 45,650
727,990 -> 727,273
596,555 -> 781,370
431,950 -> 431,627
259,415 -> 259,358
803,236 -> 515,236
239,735 -> 603,735
982,377 -> 982,581
779,221 -> 405,595
517,288 -> 414,288
376,688 -> 376,892
450,300 -> 293,143
147,217 -> 871,217
40,144 -> 156,144
913,873 -> 632,592
14,415 -> 274,155
21,987 -> 950,58
979,960 -> 37,18
50,903 -> 890,63
32,523 -> 426,523
625,491 -> 625,692
46,47 -> 899,900
226,633 -> 226,318
24,136 -> 24,693
870,675 -> 850,675
883,862 -> 883,421
581,97 -> 219,97
537,743 -> 434,743
977,77 -> 957,77
139,720 -> 139,403
248,14 -> 394,14
88,55 -> 866,833
562,652 -> 987,227
265,54 -> 958,747
322,161 -> 322,573
574,236 -> 311,236
919,393 -> 919,587
604,906 -> 604,156
691,468 -> 448,225
948,167 -> 948,516
218,238 -> 218,92
989,229 -> 99,229
384,481 -> 384,15
618,681 -> 618,815
292,956 -> 922,326
599,967 -> 599,250
418,648 -> 961,105
120,791 -> 196,791
779,559 -> 582,362
953,941 -> 35,23
508,934 -> 340,934
707,752 -> 915,752
514,958 -> 514,926
15,945 -> 826,134
433,921 -> 821,533
378,80 -> 378,407
76,957 -> 858,175
791,617 -> 662,488
891,897 -> 52,58
786,841 -> 786,973
774,799 -> 348,373
812,48 -> 40,820
57,749 -> 57,767
68,750 -> 68,891
774,920 -> 156,302
598,400 -> 116,882
34,285 -> 856,285
14,473 -> 14,134
594,877 -> 594,333
38,989 -> 964,63
631,209 -> 631,121
45,296 -> 468,296
708,904 -> 11,904
960,20 -> 99,881
412,557 -> 345,557
29,389 -> 504,864
397,713 -> 251,713
350,548 -> 350,61
134,610 -> 579,165
675,947 -> 789,947
12,986 -> 949,49
765,601 -> 765,627
817,701 -> 817,305
508,532 -> 538,502
383,136 -> 383,700
771,549 -> 443,549
283,134 -> 987,838
171,855 -> 171,248
841,858 -> 620,858
512,26 -> 912,26
425,39 -> 180,39
116,279 -> 121,279
282,482 -> 282,939
58,937 -> 980,15
376,641 -> 376,503
548,17 -> 249,17
730,411 -> 427,714
600,73 -> 541,73
656,619 -> 656,810
467,237 -> 467,255
694,946 -> 446,946
168,646 -> 395,646
731,265 -> 731,20
12,172 -> 286,446
385,762 -> 244,903
941,366 -> 941,807
125,383 -> 367,383
341,177 -> 341,809
544,830 -> 544,192
801,943 -> 731,873
862,436 -> 950,436
484,422 -> 484,267
883,155 -> 328,155
499,321 -> 499,449
128,310 -> 778,960
788,571 -> 788,795
523,765 -> 319,765
267,928 -> 267,665
227,829 -> 797,829
96,972 -> 733,335
178,364 -> 178,425
793,201 -> 848,201
975,242 -> 497,720
673,242 -> 513,242
199,163 -> 862,826
988,51 -> 225,814
631,928 -> 631,567
22,474 -> 854,474
717,607 -> 717,514
436,753 -> 905,753
581,343 -> 581,641
128,912 -> 964,76
706,634 -> 843,634
89,826 -> 89,667
766,268 -> 103,268
229,131 -> 229,138
138,112 -> 388,362
434,117 -> 434,387
313,746 -> 313,941
517,944 -> 145,944
611,945 -> 611,872
400,869 -> 329,869
444,701 -> 700,957
894,975 -> 426,975
722,544 -> 722,55
692,927 -> 692,874
451,211 -> 145,211
562,850 -> 562,252
833,154 -> 703,284
700,911 -> 700,738
32,982 -> 891,123
512,512 -> 403,512
444,963 -> 40,559
866,53 -> 866,733
395,90 -> 603,90
781,175 -> 506,175
649,569 -> 210,130
861,926 -> 79,144
160,953 -> 735,953
138,837 -> 138,166
659,683 -> 659,656
198,587 -> 725,60
290,36 -> 785,36
481,228 -> 785,532
721,152 -> 192,681
162,445 -> 162,476
286,93 -> 286,611
882,393 -> 770,393
194,703 -> 194,714
172,505 -> 153,524
989,986 -> 48,45
946,334 -> 946,864
543,48 -> 485,48
276,520 -> 184,612
879,488 -> 665,488
706,312 -> 706,300
859,958 -> 533,958
345,591 -> 345,685
201,734 -> 310,734
610,781 -> 610,250
25,702 -> 25,470
127,802 -> 46,802
899,330 -> 899,942
266,118 -> 266,978
871,535 -> 871,230
346,290 -> 346,138
411,171 -> 911,671
104,427 -> 500,31
531,115 -> 531,861
164,699 -> 529,699
215,560 -> 97,442
331,323 -> 331,321
74,969 -> 74,57
894,743 -> 739,588
913,895 -> 160,895
868,291 -> 868,987
913,390 -> 913,144
548,812 -> 889,812
978,819 -> 673,514
989,130 -> 989,589
986,12 -> 10,988
48,18 -> 974,944
511,336 -> 736,111
61,609 -> 61,742
536,650 -> 773,650
924,691 -> 307,74
49,988 -> 912,125
128,692 -> 128,969
569,837 -> 916,837
849,745 -> 849,105
524,926 -> 357,926
110,827 -> 661,827
911,36 -> 49,898
967,15 -> 23,959
969,166 -> 155,980
204,684 -> 805,83
230,960 -> 230,556
309,718 -> 522,931
121,208 -> 121,443
733,797 -> 710,820
813,780 -> 813,909
154,97 -> 375,318
117,916 -> 984,49
573,525 -> 573,980
442,636 -> 383,695
938,21 -> 938,50
38,672 -> 196,672
52,829 -> 52,835
661,278 -> 157,782
525,347 -> 285,347
339,468 -> 339,42
10,20 -> 976,986
953,812 -> 445,304
328,327 -> 711,327
750,820 -> 750,172
244,935 -> 244,360
842,36 -> 181,697
559,730 -> 320,730
149,510 -> 524,510
713,913 -> 262,462
703,957 -> 643,957
170,930 -> 767,930
804,259 -> 635,90
117,948 -> 932,133
263,806 -> 981,806
307,665 -> 307,743
697,164 -> 665,132
589,568 -> 872,285
865,189 -> 417,637
77,76 -> 951,950
546,350 -> 769,350
533,479 -> 566,446
689,79 -> 689,417
132,666 -> 888,666
661,88 -> 155,88
93,27 -> 852,786
536,366 -> 815,366
97,649 -> 97,214
50,784 -> 691,143
523,687 -> 523,881
720,825 -> 865,825
103,985 -> 939,149
135,94 -> 91,50
959,26 -> 18,967
391,617 -> 391,147
522,103 -> 522,202
161,774 -> 742,193
125,291 -> 125,513
449,436 -> 726,436
438,127 -> 499,66
804,577 -> 804,385
714,112 -> 714,90
111,184 -> 907,980
218,209 -> 53,209
343,949 -> 73,679
50,205 -> 828,983
416,664 -> 416,213
300,902 -> 300,137
563,366 -> 307,366
302,750 -> 572,750
436,59 -> 512,59
363,299 -> 363,471
969,988 -> 10,29
15,349 -> 15,424
855,231 -> 855,241
93,771 -> 540,324
360,363 -> 360,481
890,391 -> 890,824
603,916 -> 780,916
686,776 -> 165,255
905,64 -> 37,932
937,607 -> 937,846
634,108 -> 971,108
118,419 -> 292,419
724,241 -> 724,663
118,327 -> 688,327
728,316 -> 507,316
824,652 -> 744,652
985,72 -> 93,964
791,652 -> 791,621
475,488 -> 475,448
289,386 -> 648,386
833,925 -> 120,925
323,813 -> 652,813
631,615 -> 248,615
191,222 -> 603,634
445,322 -> 964,322
238,672 -> 142,672
170,370 -> 439,370
158,77 -> 491,410
165,737 -> 816,737
420,957 -> 709,668
936,283 -> 681,283
76,781 -> 291,781
197,575 -> 656,116
577,746 -> 577,748
435,198 -> 435,803
787,623 -> 787,153
476,176 -> 670,176
107,581 -> 107,167
575,495 -> 186,106
283,760 -> 19,760
910,483 -> 871,483
550,99 -> 550,94
338,522 -> 589,522
856,435 -> 856,388
890,380 -> 392,878
524,885 -> 315,676
23,34 -> 769,780
686,647 -> 545,647
760,442 -> 564,246
535,264 -> 61,264
709,168 -> 709,33
89,230 -> 604,230
476,558 -> 82,558
905,48 -> 294,48
695,882 -> 695,153
785,716 -> 94,716
390,990 -> 390,757
775,699 -> 783,699
965,126 -> 425,126
572,45 -> 482,45
399,391 -> 399,827
310,660 -> 947,23
418,813 -> 72,467
292,911 -> 506,697
177,685 -> 177,100
749,294 -> 749,927
304,832 -> 833,303
237,759 -> 923,73
834,95 -> 15,914
233,99 -> 822,99
462,841 -> 462,845
968,70 -> 815,70
820,565 -> 241,565
849,469 -> 648,670
10,825 -> 906,825
105,105 -> 526,526
977,173 -> 711,173
347,66 -> 347,959
921,42 -> 41,42
100,264 -> 100,580
608,211 -> 166,653
826,171 -> 509,171
346,541 -> 802,85
351,70 -> 872,70
649,79 -> 590,79
974,31 -> 24,981
876,145 -> 227,794
855,903 -> 855,891
621,734 -> 621,930
190,184 -> 727,721
210,855 -> 564,855
612,919 -> 612,628
258,851 -> 573,851
842,85 -> 140,787
252,312 -> 252,17
82,352 -> 135,352
365,583 -> 854,583
939,666 -> 525,252
257,481 -> 257,591
382,725 -> 382,786
326,111 -> 38,399
476,480 -> 476,544
592,49 -> 592,473
626,748 -> 626,477
612,574 -> 19,574
638,734 -> 604,734
240,794 -> 770,794
598,931 -> 37,370
666,559 -> 573,559
208,337 -> 784,913
24,17 -> 988,981
324,267 -> 332,267
233,589 -> 300,589
53,46 -> 986,979
193,649 -> 243,649
873,600 -> 873,618
461,102 -> 638,102
468,574 -> 507,535
261,521 -> 658,521
540,234 -> 769,234
975,337 -> 975,478
724,982 -> 585,982
449,639 -> 449,255
47,296 -> 751,296
700,262 -> 903,262
838,833 -> 838,626
956,17 -> 24,949

@ -0,0 +1,168 @@
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Coordinate struct {
x int
y int
}
type Vent struct {
start Coordinate
end Coordinate
}
func min(a, b int) int {
if a < b { return a }
return b
}
func max(a, b int) int {
if a > b { return a }
return b
}
func toCoordinate(coordinatesString string) (Coordinate, error) {
coordinates := strings.Split(coordinatesString, ",")
x, err := strconv.Atoi(coordinates[0])
if err != nil { return Coordinate{}, err }
y, err := strconv.Atoi(coordinates[1])
if err != nil { return Coordinate{}, err }
return Coordinate{x,y}, nil
}
func partOne(vents []Vent, size Coordinate) {
ventCount := make([][]int, size.x + 1)
for i := range ventCount {
ventCount[i] = make([]int, size.y + 1)
}
dangerousVentCount := 0
for _, vent := range vents {
if vent.start.x != vent.end.x && vent.start.y != vent.end.y {
continue
}
if vent.start.x == vent.end.x && vent.start.y == vent.end.y { // Point
ventCount[vent.start.x][vent.start.y] += 1
if ventCount[vent.start.x][vent.start.y] == 2 {
dangerousVentCount += 1
}
continue
} else if vent.start.x == vent.end.x { // Vertical Line
for y := min(vent.start.y, vent.end.y); y <= max(vent.start.y, vent.end.y); y++ {
ventCount[vent.start.x][y] += 1
if ventCount[vent.start.x][y] == 2 {
dangerousVentCount += 1
}
}
} else if vent.start.y == vent.end.y { // Horizontal Line
for x := min(vent.start.x, vent.end.x); x <= max(vent.start.x, vent.end.x); x++ {
ventCount[x][vent.start.y] += 1
if ventCount[x][vent.start.y] == 2 {
dangerousVentCount += 1
}
}
}
}
fmt.Printf("Part One Answer: %d\n", dangerousVentCount)
}
func partTwo(vents []Vent, size Coordinate) {
ventCount := make([][]int, size.x + 1)
for i := range ventCount {
ventCount[i] = make([]int, size.y + 1)
}
dangerousVentCount := 0
for _, vent := range vents {
if vent.start.x == vent.end.x && vent.start.y == vent.end.y { // Point
ventCount[vent.start.x][vent.start.y] += 1
if ventCount[vent.start.x][vent.start.y] == 2 {
dangerousVentCount += 1
}
continue
} else if vent.start.x == vent.end.x { // Vertical Line
for y := min(vent.start.y, vent.end.y); y <= max(vent.start.y, vent.end.y); y++ {
ventCount[vent.start.x][y] += 1
if ventCount[vent.start.x][y] == 2 {
dangerousVentCount += 1
}
}
} else if vent.start.y == vent.end.y { // Horizontal Line
for x := min(vent.start.x, vent.end.x); x <= max(vent.start.x, vent.end.x); x++ {
ventCount[x][vent.start.y] += 1
if ventCount[x][vent.start.y] == 2 {
dangerousVentCount += 1
}
}
} else { // Diagonal Lines
slope := float64(vent.start.y - vent.end.y) / float64(vent.start.x - vent.end.x)
if slope != 1 && slope != -1 { continue }
yIntercept := vent.start.y - int(slope) * vent.start.x
for x := min(vent.start.x, vent.end.x); x <= max(vent.start.x, vent.end.x); x++ {
y := int(slope) * x + yIntercept
ventCount[x][y] += 1
if ventCount[x][y] == 2 {
dangerousVentCount += 1
}
}
}
}
fmt.Printf("Part Two Answer: %d\n", dangerousVentCount)
}
func main() {
file, err := os.Open("./input")
if err != nil {
fmt.Printf("[Error] Unable to open file")
os.Exit(1)
}
defer file.Close()
vents := []Vent{}
size := Coordinate{}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
coordinatesStrings := strings.Split(scanner.Text(), " -> ")
if len(coordinatesStrings) != 2 {
fmt.Printf("[Error] Invalid vent line parsed\n")
continue
}
start, err := toCoordinate(coordinatesStrings[0])
if err != nil {
fmt.Printf("[Error] Invalid start coordinate parsed\n")
continue
}
if start.x > size.x { size.x = start.x }
if start.y > size.y { size.y = start.y }
end, err := toCoordinate(coordinatesStrings[1])
if err != nil {
fmt.Printf("[Error] Invalid end coordinate parsed\n")
continue
}
if end.x > size.x { size.x = end.x }
if end.y > size.y { size.y = end.y }
vents = append(vents, Vent{start,end})
}
partOne(vents, size)
partTwo(vents, size)
}
Loading…
Cancel
Save