From 879040b18ab9ff8c9b2a85ae3baac39d718e546d Mon Sep 17 00:00:00 2001 From: Sven Weidauer Date: Sun, 19 Dec 2021 15:56:05 +0100 Subject: [PATCH] Day 19 --- AoC21.xcodeproj/project.pbxproj | 99 +++ day19.swift | 1104 +++++++++++++++++++++++++++++++ 2 files changed, 1203 insertions(+) create mode 100644 day19.swift diff --git a/AoC21.xcodeproj/project.pbxproj b/AoC21.xcodeproj/project.pbxproj index 0b352ff..93eab85 100644 --- a/AoC21.xcodeproj/project.pbxproj +++ b/AoC21.xcodeproj/project.pbxproj @@ -25,6 +25,8 @@ 263D3E42276E10AE00B0AC5B /* day18.swift in Sources */ = {isa = PBXBuildFile; fileRef = 263D3E41276E10AE00B0AC5B /* day18.swift */; }; 265112972767D16D009B7607 /* day13.swift in Sources */ = {isa = PBXBuildFile; fileRef = 265112962767D16D009B7607 /* day13.swift */; }; 265112982767D171009B7607 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; }; + 2680ECD2276F23FE00CAB23C /* day19.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2680ECD1276F23FE00CAB23C /* day19.swift */; }; + 2680ECD3276F240200CAB23C /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; }; 269BE5BC2762959C00871C85 /* day8part2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5BB2762959B00871C85 /* day8part2.swift */; }; 269BE5CA2762A05300871C85 /* day9.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5C82762A04F00871C85 /* day9.swift */; }; 269BE5CC2762A08800871C85 /* common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 269BE5CB2762A08800871C85 /* common.swift */; }; @@ -126,6 +128,15 @@ ); runOnlyForDeploymentPostprocessing = 1; }; + 2680ECC8276F23E800CAB23C /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; 269BE5B22762958800871C85 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -176,6 +187,8 @@ 263D3E41276E10AE00B0AC5B /* day18.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = day18.swift; sourceTree = ""; }; 2651128F2767D15A009B7607 /* Day13 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Day13; sourceTree = BUILT_PRODUCTS_DIR; }; 265112962767D16D009B7607 /* day13.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = day13.swift; sourceTree = ""; }; + 2680ECCA276F23E800CAB23C /* Day19 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Day19; sourceTree = BUILT_PRODUCTS_DIR; }; + 2680ECD1276F23FE00CAB23C /* day19.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = day19.swift; sourceTree = ""; }; 269BE5B42762958800871C85 /* Day8Part2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Day8Part2; sourceTree = BUILT_PRODUCTS_DIR; }; 269BE5BB2762959B00871C85 /* day8part2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = day8part2.swift; sourceTree = ""; }; 269BE5C12762A03F00871C85 /* Day9 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Day9; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -256,6 +269,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 2680ECC7276F23E800CAB23C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 269BE5B12762958800871C85 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -283,6 +303,7 @@ 263BA594275E974800839C92 = { isa = PBXGroup; children = ( + 2680ECD1276F23FE00CAB23C /* day19.swift */, 263D3E41276E10AE00B0AC5B /* day18.swift */, 263D3E32276DDA6600B0AC5B /* day17.swift */, 26EA5DFF276BA680003E0305 /* day16.swift */, @@ -317,6 +338,7 @@ 26EA5DF7276BA668003E0305 /* Day16 */, 263D3E2B276DDA5400B0AC5B /* Day17 */, 263D3E39276E109D00B0AC5B /* Day18 */, + 2680ECCA276F23E800CAB23C /* Day19 */, ); name = Products; sourceTree = ""; @@ -494,6 +516,23 @@ productReference = 2651128F2767D15A009B7607 /* Day13 */; productType = "com.apple.product-type.tool"; }; + 2680ECC9276F23E800CAB23C /* Day19 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2680ECD0276F23E800CAB23C /* Build configuration list for PBXNativeTarget "Day19" */; + buildPhases = ( + 2680ECC6276F23E800CAB23C /* Sources */, + 2680ECC7276F23E800CAB23C /* Frameworks */, + 2680ECC8276F23E800CAB23C /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Day19; + productName = Day19; + productReference = 2680ECCA276F23E800CAB23C /* Day19 */; + productType = "com.apple.product-type.tool"; + }; 269BE5B32762958800871C85 /* Day8Part2 */ = { isa = PBXNativeTarget; buildConfigurationList = 269BE5BA2762958800871C85 /* Build configuration list for PBXNativeTarget "Day8Part2" */; @@ -593,6 +632,10 @@ CreatedOnToolsVersion = 13.1; LastSwiftMigration = 1310; }; + 2680ECC9276F23E800CAB23C = { + CreatedOnToolsVersion = 13.2.1; + LastSwiftMigration = 1320; + }; 269BE5B32762958800871C85 = { CreatedOnToolsVersion = 13.1; LastSwiftMigration = 1310; @@ -631,6 +674,7 @@ 26EA5DF6276BA668003E0305 /* Day16 */, 263D3E2A276DDA5400B0AC5B /* Day17 */, 263D3E38276E109D00B0AC5B /* Day18 */, + 2680ECC9276F23E800CAB23C /* Day19 */, ); }; /* End PBXProject section */ @@ -726,6 +770,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 2680ECC6276F23E800CAB23C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2680ECD3276F240200CAB23C /* common.swift in Sources */, + 2680ECD2276F23FE00CAB23C /* day19.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 269BE5B02762958800871C85 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1186,6 +1239,43 @@ }; name = Release; }; + 2680ECCE276F23E800CAB23C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 722B335UM5; + ENABLE_HARDENED_RUNTIME = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.1; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 2680ECCF276F23E800CAB23C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 722B335UM5; + ENABLE_HARDENED_RUNTIME = YES; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 12.1; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; 269BE5B82762958800871C85 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1369,6 +1459,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 2680ECD0276F23E800CAB23C /* Build configuration list for PBXNativeTarget "Day19" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2680ECCE276F23E800CAB23C /* Debug */, + 2680ECCF276F23E800CAB23C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 269BE5BA2762958800871C85 /* Build configuration list for PBXNativeTarget "Day8Part2" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/day19.swift b/day19.swift new file mode 100644 index 0000000..7cd61c4 --- /dev/null +++ b/day19.swift @@ -0,0 +1,1104 @@ +@main +struct Day19: Puzzle { + func run() { + var locations = Array(repeating: [Vector(0, 0, 0)], count: input.count) + + while input.count > 1 { + for i in input.indices { + for j in input.index(after: i).. (Matrix, Vector)? { + let referenceSet = Set(reference) + + for matrix in directions { + let points = input.map { matrix * $0 } + + let possibleShifts = findPossibleShifts(points, reference) + for shift in possibleShifts { + let shifted = points.lazy.map { $0 - shift }.filter { referenceSet.contains($0) }.count + if shifted >= 12 { + return (matrix, shift) + } + } + } + + + return nil +} + +func findPossibleShifts(_ a: [Vector], _ b: [Vector]) -> Set { + var result: Set = [] + for pointA in a { + for pointB in b { + result.insert(pointA - pointB) + } + } + return result +} + + + +struct Vector: Hashable { + var x, y, z: Int + + init(_ x: Int, _ y: Int, _ z: Int) { + self.x = x + self.y = y + self.z = z + } + + static func +(lhs: Vector, rhs: Vector) -> Vector { + Vector(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z) + } + + static func - (lhs: Vector, rhs: Vector) -> Vector { + .init(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z) + } + +} + +func manhattenDistance(_ a: Vector, _ b: Vector) -> Int { + abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z) +} + +struct Matrix { + var a, b, c: Int + var d, e, f: Int + var g, h, i: Int + + init(_ a: Int, _ b: Int, _ c: Int, _ d: Int, _ e: Int, _ f: Int, _ g: Int, _ h: Int, _ i: Int) { + (self.a, self.b, self.c) = (a, b, c) + (self.d, self.e, self.f) = (d, e, f) + (self.g, self.h, self.i) = (g, h, i) + } + + init(rows a: Vector, _ b: Vector, _ c: Vector) { + self.init( + a.x, a.y, a.z, + b.x, b.y, b.z, + c.x, c.y, c.z + ) + } +} + +func *(lhs: Matrix, rhs: Vector) -> Vector { + Vector( + lhs.a * rhs.x + lhs.b * rhs.y + lhs.c * rhs.z, + lhs.d * rhs.x + lhs.e * rhs.y + lhs.f * rhs.z, + lhs.g * rhs.x + lhs.h * rhs.y + lhs.i * rhs.z + ) +} + +func cross(_ a: Vector, _ b: Vector) -> Vector { + Vector( + a.y * b.z - a.z * b.y, + a.z * b.x - a.x * b.z, + a.x * b.y - a.y * b.x + ) +} + +func dot(_ a: Vector, _ b: Vector) -> Int { + a.x * b.x + a.y * b.y + a.z * b.z +} + +func calcDirections() -> [Matrix] { + let axes: [Vector] = [ + .init(1, 0, 0), + .init(0, 1, 0), + .init(0, 0, 1), + .init(-1, 0, 0), + .init(0, -1, 0), + .init(0, 0, -1), + ] + + var result: [Matrix] = [] + + for fi in axes.indices { + let forward = axes[fi] + for fj in axes.indices where fi != fj { + let up = axes[fj] + if dot(forward, up) != 0 { + continue + } + + let right = cross(up, forward) + result.append(.init(rows: forward, right, up)) + } + } + + return result +} +let directions = calcDirections() + +var input: [[Vector]] = [ + [ + Vector(-779,774,841), + Vector(-623,687,-622), + Vector(-569,692,-472), + Vector(-815,791,890), + Vector(545,-807,-699), + Vector(655,564,594), + Vector(-781,645,919), + Vector(561,908,-538), + Vector(-453,-675,694), + Vector(-885,-565,-404), + Vector(596,-595,-679), + Vector(464,-620,445), + Vector(481,-658,-759), + Vector(-574,-702,800), + Vector(-145,151,93), + Vector(-814,-575,-354), + Vector(-611,653,-643), + Vector(532,950,-506), + Vector(-475,-638,816), + Vector(403,-510,477), + Vector(736,559,518), + Vector(-17,7,140), + Vector(-861,-741,-321), + Vector(513,-554,586), + Vector(518,512,519), + Vector(549,924,-562), + ], + [ + Vector(689,772,-758), + Vector(537,371,685), + Vector(-672,-658,689), + Vector(123,51,-21), + Vector(-401,435,-501), + Vector(12,-98,95), + Vector(735,588,-720), + Vector(844,-573,-785), + Vector(-423,-889,-362), + Vector(-816,-649,595), + Vector(655,605,-727), + Vector(785,-703,-813), + Vector(536,-624,720), + Vector(-360,-902,-383), + Vector(-432,400,599), + Vector(-689,-669,583), + Vector(625,506,710), + Vector(455,445,698), + Vector(650,-556,751), + Vector(747,-531,-750), + Vector(-346,-875,-402), + Vector(-417,420,420), + Vector(-501,413,-386), + Vector(490,-584,661), + Vector(-499,374,505), + Vector(-449,476,-453), + ], + [ + Vector(663,667,-407), + Vector(-595,-818,-576), + Vector(-309,605,562), + Vector(-598,-610,-587), + Vector(-517,-586,691), + Vector(46,-151,22), + Vector(-881,281,-669), + Vector(732,-947,-380), + Vector(587,624,746), + Vector(-55,-3,100), + Vector(-458,-497,709), + Vector(593,687,-248), + Vector(572,498,738), + Vector(694,-939,-344), + Vector(401,-634,682), + Vector(-847,239,-653), + Vector(397,-527,600), + Vector(-610,-743,-467), + Vector(-474,659,598), + Vector(-414,-596,646), + Vector(657,542,-317), + Vector(-397,630,676), + Vector(378,-659,657), + Vector(-848,236,-666), + Vector(514,509,638), + Vector(753,-870,-512), + ], + [ + Vector(438,673,-607), + Vector(-400,-430,341), + Vector(-795,-514,-738), + Vector(-705,-416,-761), + Vector(760,-806,792), + Vector(-469,803,349), + Vector(670,-798,675), + Vector(363,648,-428), + Vector(-349,-447,506), + Vector(-425,412,-482), + Vector(520,455,660), + Vector(452,-616,-878), + Vector(553,372,771), + Vector(24,68,-59), + Vector(654,413,728), + Vector(-464,-413,481), + Vector(-404,598,-552), + Vector(-459,781,522), + Vector(538,-597,-851), + Vector(-346,488,-476), + Vector(420,-481,-842), + Vector(-470,896,540), + Vector(651,-822,721), + Vector(421,522,-506), + Vector(-690,-511,-769), + ], + [ + Vector(844,592,402), + Vector(-636,679,516), + Vector(-720,-400,911), + Vector(-509,-714,-788), + Vector(-826,755,-326), + Vector(39,-121,70), + Vector(661,741,-539), + Vector(727,636,527), + Vector(869,-741,-241), + Vector(742,-762,619), + Vector(-703,-565,962), + Vector(725,-852,686), + Vector(-639,710,621), + Vector(829,579,592), + Vector(654,730,-279), + Vector(-737,-540,847), + Vector(-734,702,606), + Vector(-487,-705,-778), + Vector(799,-689,-246), + Vector(-754,837,-380), + Vector(854,-715,-315), + Vector(754,-648,701), + Vector(-615,725,-335), + Vector(-628,-713,-672), + Vector(736,727,-443), + ], + [ + Vector(-405,590,-366), + Vector(-409,651,-375), + Vector(439,489,371), + Vector(-542,-507,536), + Vector(-367,404,-381), + Vector(299,-367,848), + Vector(-670,-452,-700), + Vector(-49,132,11), + Vector(340,-226,895), + Vector(478,-800,-337), + Vector(613,500,-723), + Vector(279,-348,939), + Vector(-558,-502,654), + Vector(390,411,415), + Vector(366,500,429), + Vector(400,-731,-350), + Vector(-612,-578,-728), + Vector(629,662,-720), + Vector(-522,-490,-688), + Vector(-453,406,393), + Vector(-679,460,405), + Vector(-652,411,356), + Vector(-532,-505,547), + Vector(707,591,-772), + Vector(635,-703,-379), + ], + [ + Vector(539,-841,504), + Vector(743,731,-445), + Vector(-822,-423,673), + Vector(-770,-492,627), + Vector(-762,805,536), + Vector(622,783,749), + Vector(-757,320,-629), + Vector(710,684,-611), + Vector(393,-892,456), + Vector(-769,705,691), + Vector(365,-675,-379), + Vector(-831,401,-736), + Vector(561,779,740), + Vector(-815,623,585), + Vector(385,-726,-591), + Vector(305,-611,-528), + Vector(-26,-6,-67), + Vector(-690,441,-682), + Vector(-830,-855,-756), + Vector(-707,-427,667), + Vector(808,821,734), + Vector(660,755,-621), + Vector(444,-961,435), + Vector(-831,-858,-732), + Vector(-873,-889,-537), + Vector(-116,-144,21), + ], + [ + Vector(620,-673,-810), + Vector(601,-454,-802), + Vector(-496,543,-614), + Vector(-596,554,-672), + Vector(963,-487,692), + Vector(-701,-396,401), + Vector(808,816,748), + Vector(638,-546,-875), + Vector(887,-534,765), + Vector(-604,428,-687), + Vector(916,-611,754), + Vector(-456,393,374), + Vector(-554,-588,-462), + Vector(549,385,-763), + Vector(-420,447,209), + Vector(-784,-504,377), + Vector(811,771,781), + Vector(-510,-687,-472), + Vector(-725,-524,511), + Vector(459,510,-757), + Vector(795,813,747), + Vector(71,-145,-43), + Vector(390,365,-693), + Vector(-534,422,297), + Vector(-565,-706,-544), + Vector(122,13,-148), + ], + [ + Vector(300,838,-511), + Vector(723,-429,-827), + Vector(-489,-531,-733), + Vector(-862,690,478), + Vector(272,779,-641), + Vector(365,729,650), + Vector(-749,-606,618), + Vector(-412,-399,-712), + Vector(-420,-363,-674), + Vector(-763,627,434), + Vector(584,-407,497), + Vector(-725,663,-381), + Vector(702,-366,-840), + Vector(358,649,667), + Vector(-832,581,-377), + Vector(683,-352,-813), + Vector(-773,672,537), + Vector(699,-507,475), + Vector(-616,-486,630), + Vector(-700,638,-358), + Vector(327,683,834), + Vector(632,-455,538), + Vector(335,741,-469), + Vector(-541,-595,615), + Vector(-76,130,123), + ], + [ + Vector(643,-906,-639), + Vector(554,-930,-576), + Vector(-438,-780,848), + Vector(885,648,-659), + Vector(-617,748,624), + Vector(708,-887,-479), + Vector(562,675,352), + Vector(513,-416,680), + Vector(-551,607,575), + Vector(867,701,-509), + Vector(567,599,433), + Vector(-593,592,-482), + Vector(533,-475,546), + Vector(-618,-692,-723), + Vector(-629,538,-371), + Vector(928,733,-581), + Vector(116,-32,-131), + Vector(405,-499,656), + Vector(515,674,570), + Vector(-629,-736,-551), + Vector(71,-144,33), + Vector(-384,-744,683), + Vector(-655,512,-481), + Vector(-658,-823,-634), + Vector(-413,-666,760), + Vector(-507,716,685), + ], + [ + Vector(392,400,680), + Vector(715,-577,488), + Vector(872,575,-780), + Vector(-527,-916,-745), + Vector(-756,759,-452), + Vector(-341,-954,-730), + Vector(360,461,570), + Vector(553,-799,-423), + Vector(-489,-888,625), + Vector(731,-478,552), + Vector(-844,478,532), + Vector(609,-456,515), + Vector(777,572,-702), + Vector(-439,-817,615), + Vector(641,-709,-383), + Vector(501,510,636), + Vector(-705,828,-431), + Vector(-764,593,595), + Vector(-610,708,-500), + Vector(-406,-864,449), + Vector(-77,-136,-15), + Vector(515,-651,-411), + Vector(-588,-912,-736), + Vector(1,17,72), + Vector(844,455,-646), + Vector(-784,542,383), + ], + [ + Vector(-705,-729,760), + Vector(-796,-680,666), + Vector(34,174,59), + Vector(681,672,720), + Vector(-634,-677,682), + Vector(685,-381,-430), + Vector(736,900,-429), + Vector(-892,-338,-314), + Vector(-28,77,-93), + Vector(-796,472,419), + Vector(731,-487,-512), + Vector(-885,399,-599), + Vector(746,727,-451), + Vector(-885,458,443), + Vector(678,-536,-330), + Vector(652,-373,448), + Vector(666,-453,483), + Vector(-706,-323,-352), + Vector(-807,414,492), + Vector(734,-275,479), + Vector(602,750,578), + Vector(-890,436,-400), + Vector(591,761,630), + Vector(-645,-332,-356), + Vector(-836,448,-626), + Vector(735,709,-336), + ], + [ + Vector(560,-631,663), + Vector(3,-21,-120), + Vector(425,-576,-600), + Vector(455,612,-831), + Vector(-472,492,-534), + Vector(615,888,330), + Vector(-382,383,326), + Vector(414,511,-837), + Vector(76,90,15), + Vector(-423,476,-725), + Vector(-568,-599,563), + Vector(751,919,441), + Vector(480,-626,-579), + Vector(-464,570,-714), + Vector(425,438,-790), + Vector(-744,-590,-577), + Vector(461,-722,-487), + Vector(-459,-674,578), + Vector(-688,-533,-461), + Vector(-366,425,292), + Vector(-369,380,325), + Vector(-448,-466,575), + Vector(597,-635,584), + Vector(647,-481,631), + Vector(753,946,365), + Vector(-709,-755,-482), + ], + [ + Vector(-793,-712,526), + Vector(43,-66,-77), + Vector(-592,814,658), + Vector(608,-557,-325), + Vector(-817,-758,545), + Vector(-447,441,-677), + Vector(-476,805,776), + Vector(377,-808,643), + Vector(685,332,-669), + Vector(-306,539,-675), + Vector(-533,-777,-578), + Vector(527,469,775), + Vector(576,-489,-523), + Vector(666,440,-717), + Vector(418,-765,542), + Vector(-678,-863,-623), + Vector(623,-570,-556), + Vector(-625,-783,-492), + Vector(460,-697,676), + Vector(653,391,833), + Vector(-611,841,744), + Vector(774,405,-693), + Vector(-801,-829,436), + Vector(678,570,758), + Vector(-11,91,43), + Vector(-418,455,-584), + ], + [ + Vector(805,-443,-751), + Vector(494,718,482), + Vector(2,-16,82), + Vector(104,91,-72), + Vector(-597,622,-615), + Vector(-753,481,430), + Vector(-531,502,409), + Vector(-672,731,-630), + Vector(-588,446,525), + Vector(571,-495,655), + Vector(-464,742,-627), + Vector(385,808,-378), + Vector(751,-407,-916), + Vector(382,821,-377), + Vector(-351,-554,-767), + Vector(-338,-407,491), + Vector(560,-451,483), + Vector(-450,-491,-811), + Vector(478,767,673), + Vector(531,-364,566), + Vector(-440,-536,-708), + Vector(-297,-435,349), + Vector(776,-521,-828), + Vector(572,726,662), + Vector(427,824,-344), + Vector(-266,-423,363), + ], + [ + Vector(-459,-573,-393), + Vector(-541,-681,657), + Vector(-691,578,-927), + Vector(846,-686,740), + Vector(854,-755,-493), + Vector(-670,527,-858), + Vector(-18,154,-79), + Vector(540,944,-704), + Vector(-392,942,855), + Vector(-622,673,-807), + Vector(-435,-635,739), + Vector(-453,-688,-389), + Vector(673,-696,718), + Vector(689,-806,-510), + Vector(549,934,-726), + Vector(345,935,570), + Vector(541,828,-585), + Vector(122,-41,-59), + Vector(-499,-636,-458), + Vector(382,940,769), + Vector(-377,756,817), + Vector(714,-691,-476), + Vector(-590,-628,839), + Vector(655,-685,833), + Vector(-386,695,813), + Vector(394,886,543), + ], + [ + Vector(729,789,-842), + Vector(-819,-334,502), + Vector(-741,-438,568), + Vector(399,-785,-551), + Vector(682,756,-676), + Vector(753,706,-666), + Vector(-9,-118,-9), + Vector(318,-711,-658), + Vector(-857,-784,-531), + Vector(439,-644,-605), + Vector(-891,-827,-750), + Vector(479,467,552), + Vector(659,-682,340), + Vector(-106,61,-102), + Vector(-681,548,823), + Vector(-664,604,849), + Vector(-860,-785,-555), + Vector(-613,351,-759), + Vector(-677,411,-908), + Vector(550,-780,387), + Vector(-728,431,-696), + Vector(-844,-469,484), + Vector(437,638,591), + Vector(-693,572,807), + Vector(491,488,586), + Vector(669,-789,409), + ], + [ + Vector(-418,-800,568), + Vector(690,-779,507), + Vector(441,-370,-505), + Vector(-573,-900,575), + Vector(-327,-603,-487), + Vector(552,-453,-472), + Vector(863,-801,517), + Vector(-436,328,515), + Vector(420,808,-712), + Vector(731,415,512), + Vector(-524,-718,522), + Vector(491,824,-603), + Vector(-18,24,64), + Vector(109,-51,-38), + Vector(-303,-536,-502), + Vector(-677,620,-677), + Vector(-482,397,567), + Vector(537,800,-622), + Vector(-442,332,630), + Vector(706,449,397), + Vector(484,-411,-606), + Vector(672,-894,518), + Vector(-576,655,-745), + Vector(871,432,448), + Vector(-517,524,-688), + Vector(-258,-444,-547), + ], + [ + Vector(-674,750,495), + Vector(-412,-547,817), + Vector(610,-432,859), + Vector(-410,-437,-273), + Vector(648,612,-461), + Vector(-691,786,446), + Vector(738,446,520), + Vector(-464,-684,742), + Vector(637,554,-561), + Vector(-494,402,-503), + Vector(33,115,-7), + Vector(775,424,642), + Vector(-612,484,-492), + Vector(541,-269,-637), + Vector(-545,752,417), + Vector(720,-493,891), + Vector(-430,-571,-332), + Vector(487,-434,-601), + Vector(-31,4,175), + Vector(802,545,536), + Vector(654,-542,750), + Vector(-302,-461,-356), + Vector(516,-357,-523), + Vector(522,627,-453), + Vector(-459,-765,818), + Vector(-593,412,-547), + ], + [ + Vector(-62,159,-61), + Vector(396,-693,-479), + Vector(-641,729,543), + Vector(-709,-486,661), + Vector(-552,-810,-705), + Vector(-796,708,-772), + Vector(-656,620,468), + Vector(522,-264,566), + Vector(-653,609,676), + Vector(-662,-436,507), + Vector(360,-565,-518), + Vector(-774,808,-657), + Vector(7,-11,2), + Vector(419,-516,-543), + Vector(409,-300,420), + Vector(352,889,-418), + Vector(383,849,609), + Vector(341,867,-488), + Vector(406,888,-551), + Vector(-733,760,-705), + Vector(501,-319,516), + Vector(-741,-399,511), + Vector(404,870,387), + Vector(499,905,552), + Vector(-725,-728,-734), + Vector(-597,-770,-717), + ], + [ + Vector(-649,836,908), + Vector(463,700,656), + Vector(552,809,589), + Vector(524,739,-436), + Vector(758,-723,501), + Vector(528,-639,-338), + Vector(484,-540,-348), + Vector(-914,776,-711), + Vector(-716,790,773), + Vector(-942,-616,878), + Vector(4,117,4), + Vector(-627,-773,-678), + Vector(-917,764,-831), + Vector(376,757,614), + Vector(-810,864,802), + Vector(699,-703,635), + Vector(-646,-554,-686), + Vector(539,-521,-420), + Vector(579,871,-390), + Vector(675,-831,525), + Vector(-184,-41,64), + Vector(-950,617,-725), + Vector(-664,-681,-751), + Vector(-989,-740,816), + Vector(-913,-693,889), + Vector(610,802,-431), + ], + [ + Vector(-328,515,-481), + Vector(-417,574,-499), + Vector(-621,584,416), + Vector(-465,-344,-508), + Vector(595,590,900), + Vector(793,-530,-444), + Vector(-358,-340,-590), + Vector(-386,-522,745), + Vector(154,-26,152), + Vector(-358,-580,619), + Vector(705,529,868), + Vector(50,99,-7), + Vector(799,454,-514), + Vector(540,-327,651), + Vector(577,-349,529), + Vector(-755,704,388), + Vector(-427,471,-544), + Vector(661,639,759), + Vector(774,366,-628), + Vector(-490,-321,-533), + Vector(513,-448,545), + Vector(-677,701,483), + Vector(-398,-670,707), + Vector(667,-515,-452), + Vector(678,-457,-552), + Vector(828,531,-592), + ], + [ + Vector(-354,917,781), + Vector(-281,841,734), + Vector(639,-856,-861), + Vector(562,853,614), + Vector(600,-872,-861), + Vector(650,-340,634), + Vector(-669,-830,764), + Vector(615,792,515), + Vector(-514,-535,-659), + Vector(-645,-747,872), + Vector(566,-839,-856), + Vector(-581,-624,-768), + Vector(399,493,-762), + Vector(-262,577,-795), + Vector(535,464,-683), + Vector(391,829,533), + Vector(-535,-771,744), + Vector(-368,738,-823), + Vector(-397,644,-749), + Vector(74,32,12), + Vector(587,-316,723), + Vector(490,-359,569), + Vector(-292,870,657), + Vector(549,579,-709), + Vector(-556,-448,-716), + ], + [ + Vector(-854,-686,494), + Vector(471,874,648), + Vector(488,-734,-887), + Vector(764,427,-727), + Vector(-759,681,-745), + Vector(-725,-714,449), + Vector(-605,728,-695), + Vector(795,538,-591), + Vector(458,-463,533), + Vector(405,770,623), + Vector(387,-740,-928), + Vector(-843,-741,525), + Vector(477,-316,412), + Vector(-885,549,507), + Vector(-750,-482,-862), + Vector(822,462,-589), + Vector(-158,-21,43), + Vector(461,812,673), + Vector(-755,760,-782), + Vector(-166,125,-115), + Vector(448,-380,515), + Vector(-700,-503,-917), + Vector(-884,648,444), + Vector(-824,602,404), + Vector(-846,-390,-881), + Vector(314,-693,-917), + ], + [ + Vector(-886,423,811), + Vector(785,453,423), + Vector(-396,553,-508), + Vector(-81,38,127), + Vector(-415,618,-348), + Vector(-522,-528,979), + Vector(706,-897,440), + Vector(-479,-748,-503), + Vector(652,-801,-610), + Vector(-610,-708,-592), + Vector(603,-785,-419), + Vector(611,-707,-599), + Vector(693,-894,441), + Vector(861,406,496), + Vector(736,672,-473), + Vector(-636,-503,891), + Vector(-372,464,-445), + Vector(814,530,434), + Vector(-29,-119,-2), + Vector(-558,-474,814), + Vector(-803,315,787), + Vector(773,654,-249), + Vector(-566,-719,-420), + Vector(709,-852,407), + Vector(797,573,-420), + Vector(-827,443,677), + ], + [ + Vector(-729,-745,477), + Vector(-809,409,-655), + Vector(628,-585,534), + Vector(405,464,-835), + Vector(309,581,335), + Vector(-697,-756,-375), + Vector(-459,599,568), + Vector(-390,539,409), + Vector(-626,-825,-487), + Vector(-823,-783,491), + Vector(340,-640,-575), + Vector(-14,-66,28), + Vector(-435,584,501), + Vector(334,-554,-667), + Vector(420,614,418), + Vector(352,480,376), + Vector(-157,-24,-97), + Vector(560,-387,566), + Vector(254,-685,-720), + Vector(359,483,-859), + Vector(-649,398,-559), + Vector(-616,-862,-402), + Vector(547,-618,581), + Vector(-708,341,-690), + Vector(288,374,-843), + Vector(-751,-815,603), + ], + [ + Vector(409,289,-495), + Vector(-847,-575,496), + Vector(413,467,-563), + Vector(508,-736,-627), + Vector(-930,-464,529), + Vector(530,380,608), + Vector(-764,280,526), + Vector(628,-869,503), + Vector(-42,-169,-23), + Vector(650,-658,-548), + Vector(503,274,552), + Vector(624,-954,561), + Vector(-499,-886,-493), + Vector(-406,-695,-494), + Vector(-856,235,571), + Vector(560,-747,-638), + Vector(-400,550,-551), + Vector(-889,-507,630), + Vector(-500,395,-544), + Vector(-521,-713,-483), + Vector(-582,501,-498), + Vector(-697,304,511), + Vector(440,253,530), + Vector(-170,-6,-82), + Vector(378,387,-577), + Vector(649,-801,614), + ], + [ + Vector(367,-847,-431), + Vector(805,450,827), + Vector(-651,-490,-341), + Vector(574,-485,737), + Vector(86,-58,110), + Vector(706,386,811), + Vector(-461,301,-317), + Vector(-745,-441,-432), + Vector(419,347,-310), + Vector(827,413,705), + Vector(-667,-493,-503), + Vector(329,-832,-245), + Vector(466,513,-343), + Vector(-529,329,473), + Vector(-599,353,-300), + Vector(-438,-863,890), + Vector(-541,433,385), + Vector(-516,-876,959), + Vector(371,-838,-492), + Vector(-673,-834,862), + Vector(632,-513,611), + Vector(-573,307,-497), + Vector(484,-525,649), + Vector(395,523,-393), + Vector(-513,468,378), + ], + [ + Vector(-568,386,784), + Vector(20,-72,121), + Vector(-121,24,13), + Vector(544,777,598), + Vector(-450,-510,942), + Vector(778,-914,-767), + Vector(830,-551,427), + Vector(-470,476,807), + Vector(-501,832,-460), + Vector(-378,-456,860), + Vector(358,756,528), + Vector(-717,-908,-600), + Vector(552,-860,-755), + Vector(790,-530,473), + Vector(-589,-465,830), + Vector(579,-909,-804), + Vector(-484,781,-295), + Vector(750,-556,440), + Vector(434,835,522), + Vector(-576,-802,-608), + Vector(727,722,-476), + Vector(-565,491,815), + Vector(-467,717,-435), + Vector(749,712,-303), + Vector(842,711,-494), + Vector(-695,-918,-609), + ], + [ + Vector(417,-415,713), + Vector(-449,647,870), + Vector(27,91,28), + Vector(402,-451,-539), + Vector(476,382,916), + Vector(-393,704,754), + Vector(548,-455,624), + Vector(-428,869,849), + Vector(857,539,-539), + Vector(-777,-601,-329), + Vector(-126,-2,126), + Vector(-665,-378,797), + Vector(827,434,-697), + Vector(-541,876,-635), + Vector(319,-462,-354), + Vector(504,-444,796), + Vector(-462,887,-670), + Vector(-714,-362,606), + Vector(-673,-456,617), + Vector(460,454,788), + Vector(488,413,930), + Vector(-888,-669,-268), + Vector(842,448,-606), + Vector(-852,-520,-276), + Vector(400,-532,-343), + Vector(-583,781,-617), + ], + [ + Vector(397,-399,-587), + Vector(-692,640,606), + Vector(-549,-426,-591), + Vector(517,-468,-682), + Vector(503,792,687), + Vector(-665,724,474), + Vector(683,415,-508), + Vector(469,573,730), + Vector(-665,-505,-567), + Vector(-470,730,-541), + Vector(632,627,-528), + Vector(747,564,-448), + Vector(466,-420,-536), + Vector(72,63,-118), + Vector(935,-637,679), + Vector(-375,-466,480), + Vector(-385,-494,361), + Vector(931,-631,564), + Vector(866,-591,627), + Vector(500,768,688), + Vector(-305,727,-516), + Vector(-647,841,608), + Vector(-776,-459,-594), + Vector(-413,713,-575), + Vector(-379,-503,254), + ], + [ + Vector(-626,-772,665), + Vector(-298,775,-361), + Vector(795,558,497), + Vector(-650,-716,745), + Vector(470,819,-606), + Vector(-465,-720,-367), + Vector(783,706,535), + Vector(476,861,-359), + Vector(426,-668,854), + Vector(16,67,24), + Vector(-559,670,547), + Vector(59,-95,-131), + Vector(754,-852,-774), + Vector(775,-921,-723), + Vector(560,-548,826), + Vector(-456,-698,-357), + Vector(823,616,623), + Vector(-452,696,550), + Vector(706,-801,-628), + Vector(-457,-579,-473), + Vector(-310,549,-415), + Vector(-441,686,552), + Vector(504,-665,759), + Vector(461,823,-545), + Vector(-755,-747,659), + Vector(-261,576,-366), + ], + [ + Vector(908,721,721), + Vector(86,-57,-97), + Vector(-713,-299,-592), + Vector(-758,-783,430), + Vector(-779,-597,500), + Vector(818,456,-829), + Vector(-623,521,428), + Vector(-837,-707,424), + Vector(907,-562,-902), + Vector(549,-311,329), + Vector(528,-351,375), + Vector(860,594,720), + Vector(-655,405,401), + Vector(-714,-392,-401), + Vector(829,529,-887), + Vector(912,-363,-865), + Vector(554,-391,342), + Vector(695,675,687), + Vector(-724,-414,-574), + Vector(-659,757,-629), + Vector(-69,-11,3), + Vector(-569,667,-540), + Vector(-586,448,388), + Vector(-580,615,-551), + Vector(907,480,-843), + Vector(858,-589,-853), + ], + [ + Vector(-779,-614,345), + Vector(695,317,397), + Vector(-753,576,801), + Vector(505,341,-394), + Vector(411,432,-345), + Vector(-667,-708,-706), + Vector(615,-385,529), + Vector(643,-378,564), + Vector(557,300,449), + Vector(-879,-666,355), + Vector(483,-862,-738), + Vector(-112,-148,91), + Vector(489,503,-397), + Vector(718,-890,-767), + Vector(-711,-622,-690), + Vector(-721,-601,-807), + Vector(-870,-758,402), + Vector(33,-26,-17), + Vector(-604,557,-459), + Vector(640,-959,-780), + Vector(-592,444,-618), + Vector(627,-473,425), + Vector(-758,670,920), + Vector(-605,562,-647), + Vector(583,497,403), + Vector(-870,560,878), + ] +]