From 73703672230a4659e544699a0a779c29a1e71035 Mon Sep 17 00:00:00 2001 From: Karl Spickermann Date: Sun, 19 Dec 2021 22:09:26 +0100 Subject: [PATCH] Day19 ZwischenStand --- .idea/.gitignore | 8 + .idea/AOC2021.iml | 9 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + src/day19/day19.go | 207 +++++++ src/day19/day19Input.txt | 803 ++++++++++++++++++++++++++++ src/day19/day19Test.txt | 132 +++++ src/day19/day19TestResultPoints.txt | 79 +++ src/day19/day19TestRotation.txt | 7 + src/helper/helper.go | 42 ++ 10 files changed, 1301 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/AOC2021.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 src/day19/day19.go create mode 100644 src/day19/day19Input.txt create mode 100644 src/day19/day19Test.txt create mode 100644 src/day19/day19TestResultPoints.txt create mode 100644 src/day19/day19TestRotation.txt diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/AOC2021.iml b/.idea/AOC2021.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/AOC2021.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5338270 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/day19/day19.go b/src/day19/day19.go new file mode 100644 index 0000000..337702e --- /dev/null +++ b/src/day19/day19.go @@ -0,0 +1,207 @@ +package main + +import ( + "AOC2021/src/helper" + "fmt" + "math" + "os" + "strings" +) + +type scanner struct { + points [][3]int + position [3]int +} + +func main() { + args := os.Args[1:] + input, err := helper.GetInput(args[0]) + if err != nil { + fmt.Println(err) + } + var scanners []scanner + for _, row := range input { + if row[1] == '-' { + scanners = append(scanners, scanner{[][3]int{}, [3]int{}}) + } else { + tmpPoint, _ := helper.MapToNumber(strings.Split(row, ",")) + scanners[len(scanners)-1].points = append(scanners[len(scanners)-1].points, [3]int{tmpPoint[0], tmpPoint[1], tmpPoint[2]}) + } + } + //hitScanners := []int{0} + //run := true + //for run { + // run = runUntilFirstHit(&scanners, &hitScanners) + //} + runFor(&scanners, 0, 1) + runFor(&scanners, 0, 4) + runFor(&scanners, 0, 2) + runFor(&scanners, 0, 3) + fmt.Println(len(scanners[0].points)) + + //inputTestResult, _ := helper.GetInput("day19TestResultPoints.txt") + //resultPoints := [][3]int{} + //for _, row := range inputTestResult { + // tmpPoint, _ := helper.MapToNumber(strings.Split(row, ",")) + // resultPoints = append(resultPoints, [3]int{tmpPoint[0], tmpPoint[1], tmpPoint[2]}) + //} + // + //fmt.Println(helper.Difference3DPoint(resultPoints, scanners[0].points)) + // + //fmt.Println(scanners[1].position) + //fmt.Println(scanners[2].position) + //fmt.Println(scanners[3].position) + //fmt.Println(scanners[4].position) + ////fmt.Println(scanners[5].position) + ////fmt.Println(scanners[6].position) + //fmt.Println(len(scanners[0].points)) +} + +func runUntilFirstHit(scanners *[]scanner, hitScanners *[]int) bool { + for i := 0; i < len(*scanners); i++ { + if !helper.Contains(i, *hitScanners) && runFor(scanners, 0, i) { + *hitScanners = append(*hitScanners, i) + return true + } + } + return false +} + +func runFor(scanners *[]scanner, i int, j int) bool { + returnBool := checkIfScannersHaveMatchingBeacons(scanners, i, j) + pointSet := make(map[[3]int]struct{}) + for _, point := range (*scanners)[i].points { + if point[0] == 26 { + fmt.Println("Help") + } + pointSet[point] = struct{}{} + } + (*scanners)[i].points = [][3]int{} + for key, _ := range pointSet { + (*scanners)[i].points = append((*scanners)[i].points, key) + } + return returnBool +} + +func checkIfScannersHaveMatchingBeacons(scanners *[]scanner, i int, j int) bool { + scanner1 := &(*scanners)[i] + scanner2 := &(*scanners)[j] + pointMapper := getOverlappingPoints(*scanner1, *scanner2) + if len(pointMapper) >= 12 { + rotationsForScanner := getAllPossibleRotationsForScanner(*scanner2) + i, diff := getRightRotation(scanner1, pointMapper, rotationsForScanner) + if i > -1 { + scanner2.position = [3]int{scanner1.position[0] + diff[0], scanner1.position[1] + diff[1], scanner1.position[2] + diff[2]} + var pointsOfScanner2inRelationToScanner1 [][3]int + + for x := 0; x < len(rotationsForScanner[0]); x++ { + point := rotationsForScanner[x][i] + pointWithDiff := [3]int{point[0] + diff[0], point[1] + diff[1], point[2] + diff[2]} + pointsOfScanner2inRelationToScanner1 = append(pointsOfScanner2inRelationToScanner1, pointWithDiff) + } + scanner1.points = append(scanner1.points, pointsOfScanner2inRelationToScanner1...) + return true + } + } + return false +} + +func getRightRotation(scanner1 *scanner, pointMapper [][2]int, rotationsForScanner [][][3]int) (int, [3]int) { + for i := 0; i < 24; i++ { + firstDiff := diffBetweenVectors(rotationsForScanner[pointMapper[0][1]][i], scanner1.points[pointMapper[0][0]]) + different := false + for n := 1; n < len(pointMapper); n++ { + rotation := rotationsForScanner[pointMapper[n][1]][i] + diff := diffBetweenVectors(rotation, scanner1.points[pointMapper[n][0]]) + if firstDiff != diff { + different = true + } + } + if different == false { + return i, firstDiff + } + } + return -1, [3]int{0, 0, 0} +} + +func getOverlappingPoints(sc1 scanner, sc2 scanner) (pointPairs [][2]int) { + distances0 := getallDistancesBetweenPointsForScanner(sc1) + distances1 := getallDistancesBetweenPointsForScanner(sc2) + for i, _ := range distances0 { + for j, _ := range distances1 { + if len(helper.OverlapFloatArray(distances0[i], distances1[j])) >= 11 { + pointPairs = append(pointPairs, [2]int{i, j}) + } + } + } + return +} + +func turn(point *[3]int) { + *point = [3]int{-point[1], point[0], point[2]} +} + +func roll(point *[3]int) { + *point = [3]int{point[0], point[2], -point[1]} +} + +func getAllPossibleRotationsForPoint(point *[3]int) (points [][3]int) { + rotationOrder := "RTTTRTTTRTTT" + switchRotationOrder := "RTR" + points = append(points, *point) + executeRotationOrder(point, rotationOrder, &points) + executeRotationOrder(point, switchRotationOrder, &[][3]int{}) + executeRotationOrder(point, rotationOrder, &points) + return +} + +func executeRotationOrder(point *[3]int, order string, points *[][3]int) { + for _, char := range order { + switch char { + case 'R': + roll(point) + case 'T': + turn(point) + } + *points = append(*points, *point) + } + return +} + +func getAllPossibleRotationsForScanner(scanner scanner) [][][3]int { + permutations := [][][3]int{} + for _, point := range scanner.points { + permutations = append(permutations, getAllPossibleRotationsForPoint(&point)) + } + return permutations +} + +func getallDistancesBetweenPointsForScanner(scanner scanner) [][]float64 { + var distances [][]float64 + for i, point1 := range scanner.points { + var distancesForPoint []float64 + for j, point2 := range scanner.points { + if i != j { + distancesForPoint = append(distancesForPoint, distanceBetweenVectors(point1, point2)) + } + } + distances = append(distances, distancesForPoint) + } + return distances +} + +func distanceBetweenVectors(v1 [3]int, v2 [3]int) float64 { + var diffs [3]float64 + for i, _ := range v1 { + diffs[i] = float64(v2[i] - v1[i]) + } + return math.Sqrt(math.Pow(diffs[0], 2) + math.Pow(diffs[1], 2) + math.Pow(diffs[2], 2)) +} + +func diffBetweenVectors(v1 [3]int, v2 [3]int) [3]int { + var diff [3]int + for i, _ := range v1 { + diff[i] = v2[i] - v1[i] + } + return diff +} diff --git a/src/day19/day19Input.txt b/src/day19/day19Input.txt new file mode 100644 index 0000000..bfca278 --- /dev/null +++ b/src/day19/day19Input.txt @@ -0,0 +1,803 @@ +--- scanner 0 --- +-837,-546,895 +545,-724,-398 +-105,-144,-62 +40,-27,65 +768,-521,353 +642,-596,-431 +676,498,843 +823,-657,349 +513,471,840 +341,513,-616 +-538,662,461 +-589,608,-546 +-591,446,456 +599,419,857 +-875,-389,809 +374,417,-744 +516,-715,-442 +-546,-660,-328 +407,533,-756 +801,-613,507 +-484,551,443 +-453,-735,-364 +-649,-663,-385 +-747,585,-558 +-685,578,-549 +-863,-517,772 +--- scanner 1 --- +-618,328,857 +-392,524,-392 +698,-323,-530 +621,529,700 +532,556,625 +727,-608,858 +737,-392,-411 +-462,530,-468 +-644,436,949 +-666,337,873 +-908,-784,-518 +-669,-762,-530 +860,-407,-490 +-53,82,105 +-751,-809,-457 +-640,-531,478 +371,562,709 +-41,-87,-32 +-529,526,-278 +-659,-397,473 +764,822,-554 +840,759,-524 +-607,-420,559 +838,-555,821 +783,-589,860 +771,850,-460 +--- scanner 2 --- +480,491,503 +-526,565,627 +-660,-847,-399 +-335,419,-428 +608,478,-490 +556,503,540 +809,-640,-557 +767,-583,665 +409,524,-442 +515,554,-473 +-414,-584,764 +-334,389,-567 +-413,425,-389 +107,-11,-127 +786,-503,-681 +-646,678,620 +738,-505,635 +-67,58,13 +-701,466,618 +-789,-725,-404 +-410,-612,789 +440,476,639 +-730,-841,-493 +-433,-685,840 +774,-719,-674 +781,-544,572 +--- scanner 3 --- +452,-584,-591 +574,-514,-593 +378,338,677 +307,-670,678 +-714,-482,845 +-760,-681,797 +426,-724,603 +461,364,-459 +-501,-549,-784 +-684,-588,814 +14,-1,-67 +-819,262,859 +476,-669,580 +-490,-532,-513 +-456,-494,-737 +405,519,639 +-751,541,-526 +-813,340,898 +-737,338,-585 +400,432,568 +543,441,-451 +-97,-132,27 +672,323,-482 +491,-514,-633 +-849,261,720 +-635,491,-586 +--- scanner 4 --- +-851,594,501 +415,534,-339 +-400,-694,-712 +842,-645,-746 +-770,-575,694 +447,619,-384 +751,-581,-815 +-331,-575,-673 +48,-36,133 +-588,522,-437 +640,429,768 +518,-827,554 +516,-713,417 +-791,656,615 +567,396,681 +573,574,749 +-539,569,-414 +-98,52,54 +522,-637,487 +-792,-587,933 +-777,498,553 +-715,557,-385 +-817,-648,776 +316,667,-322 +-415,-615,-835 +814,-551,-739 +--- scanner 5 --- +905,-652,484 +-641,-695,495 +-789,-742,-440 +507,534,616 +880,-623,690 +-604,562,573 +-429,-640,493 +-631,446,474 +607,-347,-806 +-542,-520,486 +-341,785,-353 +519,-334,-621 +420,644,609 +480,709,670 +-391,641,-407 +679,-388,-630 +-694,-698,-463 +-382,799,-378 +775,481,-769 +91,-54,-58 +24,89,60 +832,465,-575 +-616,486,610 +759,445,-607 +891,-689,698 +-603,-680,-451 +--- scanner 6 --- +-806,-771,-421 +-671,-753,-499 +-18,6,103 +427,606,554 +-441,918,903 +-459,984,870 +-450,754,-541 +461,661,412 +-727,-645,-511 +-458,831,-623 +654,-640,-674 +703,-663,-627 +758,-345,558 +527,-692,-639 +-480,-614,744 +441,722,514 +-515,-682,580 +-512,961,729 +569,763,-684 +-345,-647,669 +23,172,-24 +678,857,-706 +640,676,-679 +765,-487,649 +867,-457,582 +-481,872,-412 +--- scanner 7 --- +362,874,-678 +-297,-736,690 +515,-520,-872 +710,-448,649 +507,-454,-883 +-556,-557,-528 +860,457,540 +-493,782,-580 +-354,484,683 +-669,811,-568 +-518,-738,-501 +-336,-814,696 +797,381,570 +461,857,-545 +-369,361,604 +719,-623,550 +721,-491,-897 +-627,-644,-523 +130,-51,-2 +888,450,634 +-285,523,564 +-475,-815,726 +493,812,-630 +-542,759,-533 +712,-503,437 +-62,-5,-98 +--- scanner 8 --- +-768,-717,-777 +-14,-143,-33 +875,-554,518 +543,466,-836 +-580,-855,818 +485,455,386 +109,-7,55 +-643,739,-916 +-627,-853,796 +565,-556,-604 +-830,308,753 +-747,-611,-890 +656,-390,-590 +477,528,481 +-568,-884,660 +468,608,390 +788,-495,482 +-754,-679,-797 +629,-381,-643 +561,395,-829 +-841,337,556 +708,389,-858 +-778,256,674 +-587,682,-768 +-590,727,-684 +737,-617,490 +--- scanner 9 --- +-725,-474,547 +-720,638,-616 +-700,-786,-368 +277,-717,-225 +464,429,798 +-865,705,-635 +-898,632,-548 +280,-601,-352 +-627,381,455 +667,839,-243 +551,-412,723 +-772,-523,570 +414,391,782 +652,648,-231 +-638,-726,-482 +-675,512,517 +-760,480,472 +484,-310,753 +-737,-650,518 +378,455,874 +330,-718,-453 +15,149,38 +-796,-712,-420 +21,-10,198 +460,-419,865 +724,864,-242 +--- scanner 10 --- +-676,578,415 +-583,653,379 +-615,-423,677 +932,640,-721 +650,593,669 +611,572,612 +-292,767,-844 +158,-1,127 +909,769,-764 +724,-453,-384 +920,-591,684 +-426,-737,-471 +-480,650,436 +743,-517,-419 +-621,-311,652 +-488,-715,-588 +23,72,16 +899,811,-727 +-696,-406,610 +-526,-618,-539 +914,-476,553 +739,-362,-359 +-254,924,-758 +789,-573,583 +607,504,819 +-266,796,-721 +--- scanner 11 --- +786,817,323 +750,-679,-621 +817,748,324 +716,-950,645 +-862,695,-747 +-123,-3,10 +-817,663,-662 +515,641,-420 +731,-792,522 +-461,-637,768 +-508,-755,-903 +486,435,-395 +449,649,-409 +-552,784,427 +-536,746,477 +793,794,411 +-439,-903,-839 +-441,-973,-891 +685,-819,596 +-16,-129,-66 +-424,-819,701 +804,-670,-781 +-879,794,-614 +-460,720,391 +791,-855,-693 +-460,-831,679 +--- scanner 12 --- +-327,-510,-927 +-678,630,-569 +599,-732,-680 +803,-629,742 +608,-557,-779 +956,765,548 +811,-563,753 +-475,640,-502 +-811,327,271 +-693,-905,469 +-350,-554,-832 +-593,394,259 +521,272,-700 +825,703,500 +-517,-864,541 +597,-600,767 +4,-53,-2 +430,341,-764 +857,748,415 +-338,-572,-741 +606,-612,-567 +150,-49,-163 +-741,325,323 +458,348,-670 +-684,666,-543 +-508,-918,381 +--- scanner 13 --- +540,412,432 +499,-447,-412 +560,490,-572 +313,-436,-350 +-609,615,740 +461,499,-397 +-651,-421,865 +-783,-449,-581 +671,-787,790 +697,-793,826 +-121,55,15 +673,497,-452 +-595,-475,972 +-777,-489,876 +-617,328,-688 +-690,277,-665 +476,321,501 +408,-459,-394 +570,349,508 +-684,642,651 +-913,-515,-626 +738,-584,800 +-935,-429,-666 +-589,353,-684 +18,-76,136 +-693,609,901 +--- scanner 14 --- +130,40,29 +-804,667,-760 +-770,-343,761 +59,134,-113 +-338,-660,-567 +824,-427,-597 +874,-475,-553 +505,-816,566 +628,611,-544 +611,594,780 +-720,707,-630 +-330,-715,-403 +-666,811,642 +-743,699,589 +606,879,-549 +649,-709,592 +664,680,737 +-536,753,568 +-623,728,-736 +511,-585,563 +870,-448,-421 +634,784,-501 +-733,-497,757 +-702,-264,790 +-407,-761,-544 +624,676,649 +--- scanner 15 --- +610,-828,725 +397,-645,-531 +837,418,-503 +-368,-524,-425 +-271,722,-357 +506,-533,-507 +-340,753,-358 +561,-851,678 +-294,729,-445 +-439,385,375 +499,-675,-598 +737,-880,690 +586,669,757 +6,-115,59 +-425,-881,628 +-294,-943,580 +-447,451,386 +803,473,-361 +-304,-616,-461 +823,534,-463 +-653,422,361 +624,488,730 +695,575,735 +-393,-926,713 +-342,-600,-511 +--- scanner 16 --- +-459,676,715 +-517,546,641 +653,-621,812 +679,321,-476 +584,659,617 +489,-586,744 +-603,814,-687 +651,761,587 +504,-618,-831 +-676,-601,853 +675,652,475 +-542,633,-663 +363,-565,-854 +-590,-654,810 +-486,-624,-428 +-12,-108,17 +-391,-596,-476 +-659,-618,-471 +-594,-614,722 +-563,730,-557 +-571,753,662 +330,-547,-788 +821,355,-531 +564,-451,777 +719,335,-592 +--- scanner 17 --- +-635,641,629 +-598,563,-628 +-697,554,-453 +-857,-310,866 +-450,-372,-675 +-44,35,72 +452,417,-341 +-545,-395,-631 +412,609,854 +-623,678,553 +-608,542,513 +346,-430,603 +451,516,840 +480,392,-337 +798,-365,-359 +-636,-383,-613 +553,341,-360 +-898,-285,852 +244,-351,647 +776,-451,-399 +-848,-339,708 +373,546,811 +345,-416,647 +-165,134,173 +646,-385,-444 +-810,561,-573 +--- scanner 18 --- +-450,784,-692 +824,665,491 +658,565,-856 +-521,630,499 +-728,-718,-393 +884,706,648 +672,474,-690 +-295,-814,873 +-592,-659,-362 +845,-859,-529 +-414,697,-751 +-750,-671,-391 +865,-845,-567 +100,39,-6 +-422,646,-629 +781,-798,610 +-527,808,567 +711,538,-865 +760,-704,519 +-320,-757,872 +-511,-742,884 +695,-822,530 +810,739,568 +958,-838,-635 +-454,775,480 +--- scanner 19 --- +-584,442,716 +29,-98,157 +478,394,642 +-448,-668,505 +-571,305,-472 +-530,323,641 +593,-657,-595 +-461,392,-465 +696,765,-391 +104,29,35 +-489,-719,-508 +-529,492,739 +572,416,751 +713,-544,-588 +762,776,-383 +725,790,-597 +-541,-744,522 +-413,-731,-471 +659,421,680 +401,-833,599 +-373,-746,-607 +402,-803,460 +480,-797,421 +-342,-698,474 +-636,365,-411 +768,-756,-586 +--- scanner 20 --- +-827,814,-478 +-831,839,-506 +758,558,-582 +358,846,587 +-595,670,784 +346,-593,-733 +9,-98,2 +508,525,-573 +402,-612,-731 +-828,-339,531 +-581,-349,-741 +-808,890,-579 +269,-411,617 +289,755,651 +-511,-443,-735 +-715,677,671 +431,-327,657 +-540,668,572 +-907,-517,495 +597,552,-498 +365,818,681 +-89,72,39 +392,-396,538 +-452,-354,-619 +-906,-378,525 +291,-559,-694 +--- scanner 21 --- +590,783,-345 +-745,-624,-738 +857,-496,341 +-616,863,-699 +533,-734,-749 +-111,-15,-94 +-731,-698,-661 +-768,797,760 +-574,886,759 +783,509,760 +-805,-665,-581 +-692,-785,712 +-681,745,-710 +-756,819,796 +374,855,-356 +809,595,684 +-840,-721,781 +726,-544,403 +606,-767,-662 +847,545,668 +600,-589,-730 +-702,839,-619 +399,798,-357 +758,-629,358 +-910,-773,779 +67,44,-4 +--- scanner 22 --- +-734,-309,822 +694,597,-432 +-681,-713,-669 +-729,-806,-671 +-504,413,-478 +-727,-286,910 +-423,822,764 +670,484,669 +131,24,89 +-610,510,-457 +768,467,-374 +-758,-355,909 +711,-708,-607 +794,-734,-587 +595,-357,756 +528,491,760 +715,390,-486 +-720,-726,-731 +-478,788,906 +-634,329,-518 +640,382,736 +-539,808,804 +519,-383,842 +686,-754,-646 +611,-319,806 +--- scanner 23 --- +97,-47,-11 +-437,564,456 +-536,-668,-635 +-527,-918,-602 +421,-784,-469 +-611,-757,-608 +-569,-882,428 +443,-722,-586 +735,-595,679 +-77,-104,120 +-307,609,522 +-603,671,-321 +-530,648,-270 +589,260,714 +-625,-989,482 +648,534,-438 +455,326,695 +752,-514,612 +-443,-893,496 +847,-589,654 +606,535,-437 +-285,649,436 +554,460,-449 +-631,667,-346 +520,341,596 +540,-684,-537 +--- scanner 24 --- +335,507,659 +789,625,-474 +-450,-800,-511 +441,658,656 +477,526,758 +-383,-788,-293 +626,-533,809 +-423,-454,576 +-366,804,-447 +-381,-736,-363 +862,-678,-596 +-435,708,806 +-402,782,-435 +102,8,-15 +-369,684,776 +-69,90,34 +-445,-295,458 +764,-565,739 +-489,744,673 +774,748,-316 +778,-478,879 +-403,871,-629 +808,-518,-587 +849,-590,-411 +-415,-486,528 +743,699,-447 +--- scanner 25 --- +599,481,-432 +22,-11,-104 +-379,-514,-593 +595,-712,468 +877,548,315 +822,684,319 +395,-677,-695 +669,-618,457 +476,-746,-577 +131,-96,62 +670,-660,456 +-454,-419,-635 +-460,-531,-660 +-783,659,861 +-821,816,775 +-649,-845,488 +-595,542,-419 +-809,688,738 +-492,545,-362 +-549,-726,556 +855,592,473 +461,-811,-676 +-587,-823,605 +696,609,-465 +-399,470,-398 +570,490,-476 +--- scanner 26 --- +390,830,-821 +-339,-265,-482 +498,624,688 +796,-639,827 +-610,-520,457 +-691,651,-600 +521,577,639 +-469,553,450 +-692,-593,410 +643,-775,-316 +-849,-532,435 +919,-560,812 +-434,-341,-461 +643,-673,-302 +93,0,103 +-17,62,-33 +-417,649,376 +-733,647,-605 +469,612,512 +723,-799,-385 +-556,599,-568 +-531,711,436 +757,-520,896 +516,740,-742 +408,752,-686 +-317,-280,-456 +--- scanner 27 --- +504,695,379 +-622,-772,694 +-806,425,528 +728,729,341 +-729,336,-414 +576,448,-491 +-907,372,-493 +-854,471,329 +-63,-67,23 +517,434,-694 +440,-699,-685 +-739,-693,729 +-823,501,435 +354,-756,-816 +-615,-556,706 +-892,-778,-869 +-803,-894,-810 +-897,-900,-740 +743,-832,756 +577,550,-644 +699,-791,708 +625,-767,740 +-868,366,-415 +775,684,396 +450,-654,-798 +--- scanner 28 --- +-352,765,607 +-645,-531,448 +681,719,941 +529,528,-567 +719,-753,-590 +866,-662,590 +-287,888,-644 +624,701,851 +-550,-592,443 +-401,788,418 +434,576,-595 +803,-584,531 +702,571,-573 +633,-710,-537 +619,761,872 +846,-644,656 +-610,-712,-570 +60,25,103 +-693,-522,411 +-402,791,596 +-320,954,-626 +637,-622,-577 +-446,-644,-605 +-521,-677,-740 +-461,931,-573 +--- scanner 29 --- +-374,-424,-662 +750,875,838 +428,-515,-390 +710,-591,868 +742,524,-355 +25,19,-1 +-400,-430,-626 +-758,-781,514 +-524,733,541 +492,-367,-321 +933,454,-385 +-669,443,-538 +-333,-633,-636 +-413,837,569 +-572,-770,576 +-477,456,-489 +774,572,-363 +-649,511,-425 +695,805,686 +638,-415,909 +-496,817,703 +550,-600,922 +440,-297,-323 +663,735,824 +-663,-758,558 \ No newline at end of file diff --git a/src/day19/day19Test.txt b/src/day19/day19Test.txt new file mode 100644 index 0000000..0a7e081 --- /dev/null +++ b/src/day19/day19Test.txt @@ -0,0 +1,132 @@ +--- scanner 0 --- +404,-588,-901 +528,-643,409 +-838,591,734 +390,-675,-793 +-537,-823,-458 +-485,-357,347 +-345,-311,381 +-661,-816,-575 +-876,649,763 +-618,-824,-621 +553,345,-567 +474,580,667 +-447,-329,318 +-584,868,-557 +544,-627,-890 +564,392,-477 +455,729,728 +-892,524,684 +-689,845,-530 +423,-701,434 +7,-33,-71 +630,319,-379 +443,580,662 +-789,900,-551 +459,-707,401 +--- scanner 1 --- +686,422,578 +605,423,415 +515,917,-361 +-336,658,858 +95,138,22 +-476,619,847 +-340,-569,-846 +567,-361,727 +-460,603,-452 +669,-402,600 +729,430,532 +-500,-761,534 +-322,571,750 +-466,-666,-811 +-429,-592,574 +-355,545,-477 +703,-491,-529 +-328,-685,520 +413,935,-424 +-391,539,-444 +586,-435,557 +-364,-763,-893 +807,-499,-711 +755,-354,-619 +553,889,-390 +--- scanner 2 --- +649,640,665 +682,-795,504 +-784,533,-524 +-644,584,-595 +-588,-843,648 +-30,6,44 +-674,560,763 +500,723,-460 +609,671,-379 +-555,-800,653 +-675,-892,-343 +697,-426,-610 +578,704,681 +493,664,-388 +-671,-858,530 +-667,343,800 +571,-461,-707 +-138,-166,112 +-889,563,-600 +646,-828,498 +640,759,510 +-630,509,768 +-681,-892,-333 +673,-379,-804 +-742,-814,-386 +577,-820,562 +--- scanner 3 --- +-589,542,597 +605,-692,669 +-500,565,-823 +-660,373,557 +-458,-679,-417 +-488,449,543 +-626,468,-788 +338,-750,-386 +528,-832,-391 +562,-778,733 +-938,-730,414 +543,643,-506 +-524,371,-870 +407,773,750 +-104,29,83 +378,-903,-323 +-778,-728,485 +426,699,580 +-438,-605,-362 +-469,-447,-387 +509,732,623 +647,635,-688 +-868,-804,481 +614,-800,639 +595,780,-596 +--- scanner 4 --- +727,592,562 +-293,-554,779 +441,611,-461 +-714,465,-776 +-743,427,-804 +-660,-479,-426 +832,-632,460 +927,-485,-438 +408,393,-506 +466,436,-512 +110,16,151 +-258,-428,682 +-393,719,612 +-211,-452,876 +808,-476,-593 +-575,615,604 +-485,667,467 +-680,325,-822 +-627,-443,-432 +872,-547,-609 +833,512,582 +807,604,487 +839,-516,451 +891,-625,532 +-652,-548,-490 +30,-46,-14 \ No newline at end of file diff --git a/src/day19/day19TestResultPoints.txt b/src/day19/day19TestResultPoints.txt new file mode 100644 index 0000000..6f74b72 --- /dev/null +++ b/src/day19/day19TestResultPoints.txt @@ -0,0 +1,79 @@ +-892,524,684 +-876,649,763 +-838,591,734 +-789,900,-551 +-739,-1745,668 +-706,-3180,-659 +-697,-3072,-689 +-689,845,-530 +-687,-1600,576 +-661,-816,-575 +-654,-3158,-753 +-635,-1737,486 +-631,-672,1502 +-624,-1620,1868 +-620,-3212,371 +-618,-824,-621 +-612,-1695,1788 +-601,-1648,-643 +-584,868,-557 +-537,-823,-458 +-532,-1715,1894 +-518,-1681,-600 +-499,-1607,-770 +-485,-357,347 +-470,-3283,303 +-456,-621,1527 +-447,-329,318 +-430,-3130,366 +-413,-627,1469 +-345,-311,381 +-36,-1284,1171 +-27,-1108,-65 +7,-33,-71 +12,-2351,-103 +26,-1119,1091 +346,-2985,342 +366,-3059,397 +377,-2827,367 +390,-675,-793 +396,-1931,-563 +404,-588,-901 +408,-1815,803 +423,-701,434 +432,-2009,850 +443,580,662 +455,729,728 +456,-540,1869 +459,-707,401 +465,-695,1988 +474,580,667 +496,-1584,1900 +497,-1838,-617 +527,-524,1933 +528,-643,409 +534,-1912,768 +544,-627,-890 +553,345,-567 +564,392,-477 +568,-2007,-577 +605,-1665,1952 +612,-1593,1893 +630,319,-379 +686,-3108,-505 +776,-3184,-501 +846,-3110,-434 +1135,-1161,1235 +1243,-1093,1063 +1660,-552,429 +1693,-557,386 +1735,-437,1738 +1749,-1800,1813 +1772,-405,1572 +1776,-675,371 +1779,-442,1789 +1780,-1548,337 +1786,-1538,337 +1847,-1591,415 +1889,-1729,1762 +1994,-1805,1792 \ No newline at end of file diff --git a/src/day19/day19TestRotation.txt b/src/day19/day19TestRotation.txt new file mode 100644 index 0000000..b597866 --- /dev/null +++ b/src/day19/day19TestRotation.txt @@ -0,0 +1,7 @@ +--- scanner 0 --- +-1,-1,1 +-2,-2,2 +-3,-3,3 +-2,-3,1 +5,6,-4 +8,0,7 \ No newline at end of file diff --git a/src/helper/helper.go b/src/helper/helper.go index bc2170b..23939c3 100644 --- a/src/helper/helper.go +++ b/src/helper/helper.go @@ -158,6 +158,48 @@ func AmountCharacterInString(input string, selector rune) int { return amount } +func OverlapFloatArray(a, b []float64) []float64 { + mb := make(map[float64]struct{}, len(b)) + for _, x := range b { + mb[x] = struct{}{} + } + var overlap []float64 + for _, x := range a { + if _, found := mb[x]; found { + overlap = append(overlap, x) + } + } + return overlap +} + +func Overlap3DPoint(a, b [][3]int) [][3]int { + mb := make(map[[3]int]struct{}, len(b)) + for _, x := range b { + mb[x] = struct{}{} + } + var overlap [][3]int + for _, x := range a { + if _, found := mb[x]; found { + overlap = append(overlap, x) + } + } + return overlap +} + +func Difference3DPoint(a, b [][3]int) [][3]int { + mb := make(map[[3]int]struct{}, len(b)) + for _, x := range b { + mb[x] = struct{}{} + } + var diff [][3]int + for _, x := range a { + if _, found := mb[x]; !found { + diff = append(diff, x) + } + } + return diff +} + func AddNummbers(numbers ...int) int { result := 0 for _, number := range numbers {