diff --git a/2025/d08/ex1/ex1.py b/2025/d08/ex1/ex1.py deleted file mode 100755 index 11f81e5..0000000 --- a/2025/d08/ex1/ex1.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python - -import collections -import functools -import itertools -import operator -import sys -from collections.abc import Iterable -from typing import Generic, Hashable, NamedTuple, TypeVar - - -class Point(NamedTuple): - x: int - y: int - z: int - - -class UnionFind: - _parent: list[int] - _rank: list[int] - - def __init__(self, size: int): - # Each node is in its own set, making it its own parent... - self._parent = list(range(size)) - # ... And its rank 0 - self._rank = [0] * size - - def find(self, elem: int) -> int: - while (parent := self._parent[elem]) != elem: - # Replace each parent link by a link to the grand-parent - elem, self._parent[elem] = parent, self._parent[parent] - return elem - - def union(self, lhs: int, rhs: int) -> int: - lhs = self.find(lhs) - rhs = self.find(rhs) - # Bail out early if they already belong to the same set - if lhs == rhs: - return lhs - # Always keep `lhs` as the taller tree - if self._rank[lhs] < self._rank[rhs]: - lhs, rhs = rhs, lhs - # Merge the smaller tree into the taller one - self._parent[rhs] = lhs - # Update the rank when merging trees of approximately the same size - if self._rank[lhs] == self._rank[rhs]: - self._rank[lhs] += 1 - return lhs - - def sets(self) -> dict[int, set[int]]: - res: dict[int, set[int]] = collections.defaultdict(set) - for elem in range(len(self._parent)): - res[self.find(elem)].add(elem) - return dict(res) - - -# PEP 695 still not supported by MyPy... -T = TypeVar("T", bound=Hashable) - - -class DisjointSet(Generic[T]): - _values: list[T] - _to_index: dict[T, int] - _sets: UnionFind - - def __init__(self, values: Iterable[T]) -> None: - self._values = list(values) - self._to_index = {v: i for i, v in enumerate(self._values)} - self._sets = UnionFind(len(self._values)) - - def find(self, elem: T) -> T: - return self._values[self._sets.find(self._to_index[elem])] - - def union(self, lhs: T, rhs: T) -> T: - return self._values[self._sets.union(self._to_index[lhs], self._to_index[rhs])] - - def sets(self) -> dict[T, set[T]]: - sets = self._sets.sets() - return { - self._values[r]: {self._values[i] for i in values} - for r, values in sets.items() - } - - -def solve(input: list[str]) -> int: - def parse(input: list[str]) -> list[Point]: - return [Point(*map(int, line.split(","))) for line in input] - - def sq_dist(p: Point, other: Point) -> int: - return sum(abs(a - b) ** 2 for a, b in zip(p, other)) - - def list_connections(boxes: list[Point]) -> list[tuple[Point, Point]]: - connections = itertools.combinations(boxes, 2) - return sorted(connections, key=lambda con: sq_dist(*con)) - - def connect_boxes(boxes: list[Point], n: int = 1000) -> DisjointSet[Point]: - connections = list_connections(boxes) - sets = DisjointSet(boxes) - for a, b in connections[:n]: - sets.union(a, b) - return sets - - boxes = parse(input) - connected = connect_boxes(boxes) - circuit_sizes = collections.Counter( - {r: len(val) for r, val in connected.sets().items()} - ) - return functools.reduce( - operator.mul, (size for _, size in circuit_sizes.most_common(3)) - ) - - -def main() -> None: - input = sys.stdin.read().splitlines() - print(solve(input)) - - -if __name__ == "__main__": - main() diff --git a/2025/d08/ex1/input b/2025/d08/ex1/input deleted file mode 100644 index 9df6b93..0000000 --- a/2025/d08/ex1/input +++ /dev/null @@ -1,1000 +0,0 @@ -96616,810,75978 -47,21512,72240 -37204,32405,96978 -29869,39703,17245 -85469,86947,73441 -30718,17071,51096 -41362,30138,67009 -598,13948,14379 -76389,15190,48555 -49893,73440,15307 -29849,31150,65844 -43789,38501,72225 -1289,51970,81957 -94777,88446,92003 -67115,73782,47139 -34918,73782,76791 -10226,21601,9106 -25255,34515,55484 -15907,71527,29965 -81513,47000,15653 -80059,88130,47907 -38982,78390,65861 -52404,53380,32169 -57890,49601,15440 -124,21347,33712 -34031,15726,61115 -74713,70099,55008 -5651,21087,42325 -7646,22850,56910 -77521,99356,56389 -21748,86110,49763 -33638,70698,70272 -72192,16208,6392 -44081,77872,46151 -77812,33943,16761 -73761,81089,45679 -8774,27775,53496 -7575,13375,22609 -58036,91575,80779 -59110,66473,56545 -86077,10459,63254 -66197,87350,40327 -81411,92072,72676 -49748,9698,89965 -78439,17433,63349 -21784,15350,87174 -20127,8208,29553 -68687,89811,29134 -37359,84624,5746 -16185,94710,97793 -18231,95999,20306 -46807,93766,75186 -66175,64946,13827 -2379,85923,41962 -49923,83393,61215 -49402,16213,59895 -16578,1185,60394 -26992,44142,77991 -11815,61668,19454 -49157,21692,51961 -70475,72818,83517 -60133,50809,14515 -36769,65052,9338 -68358,29041,16515 -68765,91605,30936 -93634,60030,23295 -75141,909,75737 -77063,82141,8421 -29230,5618,66027 -60311,44944,84379 -6727,40525,76384 -60892,71273,13434 -99336,47605,54010 -4854,66583,83047 -41024,75773,25856 -61313,40857,75555 -92580,94652,34432 -66175,63087,68137 -862,46037,40611 -9364,61053,96965 -96197,97478,31849 -46012,78260,93076 -4284,3783,29454 -79377,111,81121 -36895,62273,40991 -28332,83678,6091 -124,6836,46015 -58191,32091,27558 -83664,90573,74440 -47684,52380,13614 -35120,46095,58900 -75844,70060,25294 -22872,85463,81740 -55383,79835,82127 -44744,64274,86800 -60852,70621,32428 -91516,39702,39626 -3688,20727,56814 -49311,23987,86560 -44548,2875,53676 -16841,24697,97455 -17788,80255,91151 -83290,1708,4577 -39021,78132,21442 -12009,82267,12399 -91035,14375,97595 -94085,31799,99374 -88944,58929,65104 -82345,84761,71280 -62780,13633,35806 -70571,95978,95108 -52888,93487,88078 -29130,16331,14409 -92304,65168,58557 -28472,46629,22552 -832,89716,12881 -8947,49372,18917 -53393,62848,85813 -14570,95609,71932 -34906,59313,55734 -37689,47610,81231 -48410,8422,91050 -43870,76541,8153 -5427,34304,38621 -76919,40838,49838 -89295,69748,69369 -50411,60493,56509 -26826,15701,77344 -24956,47561,88427 -56537,24378,40188 -84314,39970,40106 -13090,35301,17852 -60153,99913,7345 -21147,67767,86352 -94054,90953,58835 -81837,49253,53459 -64686,71238,47767 -74230,40836,81723 -86599,29209,24915 -94641,86178,95813 -45007,59187,71572 -33557,77915,37965 -10,26480,78523 -49998,17424,383 -72243,16533,32163 -96153,76105,53137 -67890,80555,76817 -58274,24705,50617 -90297,95948,32697 -44469,83877,56552 -15831,6265,94385 -55836,6873,75895 -90337,23678,21982 -35012,30025,70177 -42902,52640,67628 -51436,86883,38944 -72763,97457,11606 -50955,3969,92867 -91443,54845,20378 -2133,70178,55310 -17613,15558,96325 -62436,31322,23281 -53947,2865,94764 -40898,32429,56964 -53537,52879,22200 -42871,1669,76000 -63615,86744,87542 -93336,17798,45244 -56804,65416,20724 -49294,21904,85931 -45336,49650,26151 -38314,46233,85923 -64085,1875,33253 -6740,22204,3436 -94916,13931,65156 -65933,21535,26507 -45670,48945,7381 -88012,2945,38942 -8597,15275,7742 -37182,10617,88064 -44966,19938,98403 -52444,10373,45375 -2510,89230,59817 -41311,12069,30872 -42173,92528,45714 -81874,83719,21053 -66914,60637,68318 -9977,30378,74103 -77500,5036,80383 -14977,54324,58522 -64913,27528,28552 -79234,26215,79253 -65555,68595,19347 -48129,62152,56907 -55931,49134,27039 -81533,76718,78435 -27041,48960,99966 -12471,11450,99887 -44614,14647,11244 -7064,79634,40939 -47042,12530,41088 -2893,25877,88592 -93696,12076,1871 -46418,97089,52542 -67033,30021,91392 -80133,5826,11001 -10958,41254,28841 -31153,7589,15039 -17780,43539,49617 -76429,94380,46400 -15092,32751,31607 -34046,15838,20784 -75419,51308,44185 -47445,41839,7061 -91239,85946,6742 -2606,30107,86190 -57460,64139,20675 -47311,26384,38310 -75437,20187,60579 -45740,25222,35810 -89165,70723,56270 -83116,55684,54082 -18207,17844,67662 -9674,58573,66797 -44733,89585,51527 -83277,92121,15913 -4249,7080,93485 -92675,37985,23278 -68824,25339,15228 -98817,25303,50014 -79441,94633,94983 -3538,68284,7729 -90071,19613,80286 -35338,57531,87102 -13284,79098,7934 -52860,41073,17367 -63008,43331,63254 -78540,80209,43105 -8114,96893,96242 -33065,15885,38404 -93180,10260,1406 -49667,46625,92829 -33003,24911,14339 -38778,55485,59791 -72543,61880,87071 -85741,95244,22418 -85620,63879,96866 -67367,81893,85550 -50325,33325,35215 -39346,39396,46554 -68496,87768,76749 -25295,69389,65559 -95779,28875,6542 -95024,16913,1461 -54393,79624,66654 -22568,66655,17707 -42154,25195,2845 -94777,25624,50767 -29674,369,53974 -29667,70763,48673 -90169,60090,15118 -99124,57348,86302 -63913,1301,25716 -81174,63073,69642 -59620,25265,48206 -7818,69808,55040 -1176,94990,88053 -62167,61746,50297 -10710,51779,51561 -55335,99261,74317 -94526,24185,92724 -98776,71390,17390 -74558,87154,35918 -40211,49179,4540 -74967,488,56683 -76881,89746,20583 -83194,11163,55480 -58293,85409,68879 -22119,39436,26300 -33552,10044,448 -32230,13128,38117 -81887,5361,46790 -72993,66761,17603 -47638,80029,73438 -39481,64315,79268 -58135,18165,18841 -2042,62057,70204 -9114,12242,22985 -35882,13857,4096 -18964,762,17683 -38511,95699,6284 -73814,1119,60942 -83070,32272,95920 -84551,68696,99564 -62889,86971,44801 -30741,80485,10486 -7872,31662,84503 -65006,93089,15350 -72897,5321,3410 -84915,37773,941 -66303,31900,55969 -88175,91065,44552 -9797,71120,30801 -18859,592,52302 -48347,85770,56567 -2175,35684,92455 -39724,11001,65710 -61391,86663,37548 -45330,58198,7425 -70936,54231,13355 -42914,38762,66826 -1884,93081,23928 -70788,2959,68377 -31287,77424,53853 -49782,74150,12616 -22011,27058,19827 -35744,39142,141 -46698,44490,42526 -99503,65888,29700 -23109,2935,55599 -73873,86052,88730 -41705,73980,37236 -79535,44606,82017 -45461,52915,48898 -20403,23037,50390 -52469,52324,71746 -27849,17692,85574 -63316,98722,95925 -11186,46337,14356 -83076,32036,79529 -61105,8234,11086 -95435,83738,68003 -61421,61582,42741 -18857,40910,67067 -97733,90507,91159 -62126,69029,10771 -51588,89853,31246 -14402,45890,62651 -4576,99380,53771 -40711,89434,94430 -6203,98731,77355 -45700,46430,87272 -36822,67855,58488 -9902,41517,24442 -93293,91156,74863 -71444,13876,4077 -42980,68701,9986 -97660,73023,2494 -19956,5786,58572 -43631,25027,61813 -47487,71311,92859 -1627,86846,1636 -76397,34793,31510 -69137,69406,53854 -51824,63534,67604 -48669,7752,35759 -35347,91796,83425 -66421,72114,65991 -41769,65462,64707 -52154,83731,18679 -93093,80021,2843 -59961,87369,41338 -61774,67916,56576 -61238,83388,22624 -87301,35647,21220 -18563,40513,46270 -31431,89556,22191 -18400,15064,32441 -19586,56478,91982 -10018,46780,77058 -39406,7841,36230 -15191,12600,21150 -16792,47932,24378 -60440,92024,4940 -6052,10147,48120 -1230,94468,22896 -90393,69014,78693 -20778,6823,5014 -12785,38994,51536 -15309,27025,40538 -9455,93063,94175 -52963,63538,24640 -76876,99767,20424 -88675,70704,84876 -29837,572,89758 -24665,43287,4124 -19596,39044,22506 -23320,89139,12457 -16298,43802,18588 -13863,53279,86359 -65756,38823,39017 -87980,76503,68792 -29808,1133,5547 -65225,76422,23690 -97926,56995,73309 -52631,46378,86930 -9699,19378,79988 -50576,35602,76568 -10475,51282,28809 -10841,6595,69501 -68477,7514,78298 -80172,90885,77294 -794,74931,66380 -16579,66603,50677 -677,38561,19559 -3076,24613,17121 -48482,23484,4486 -96978,26894,96599 -29550,67389,6448 -59980,27451,80958 -60956,37227,24831 -40202,40948,35792 -25500,21049,18829 -95357,78024,61424 -66165,41073,67961 -3900,18562,90386 -5993,41426,12575 -55978,14534,4710 -62310,98833,3965 -36662,21431,3535 -1247,94520,16658 -56495,63277,82136 -60227,11533,3984 -55190,46612,75533 -55832,29751,10128 -60037,5341,11856 -88331,37751,9479 -12410,76462,51822 -50775,10467,22268 -31249,97861,29215 -51633,19235,43441 -26172,13202,69249 -20710,13243,16076 -72953,93560,87352 -16585,67087,56128 -78,97449,5581 -7850,39585,11593 -56185,25107,62693 -20769,86165,77245 -54030,10493,82291 -20323,16227,72965 -20539,97065,5529 -11191,69352,16214 -24808,74182,6714 -32750,7109,5245 -30078,95393,61862 -95086,84632,26437 -89669,27166,69617 -97663,85156,84583 -65200,24901,58281 -32476,59684,22183 -88333,75537,24786 -97754,39828,21801 -57090,90810,81819 -17456,68293,6317 -60663,86154,2830 -11207,37715,44558 -96412,78170,57495 -34637,65683,61943 -5630,25259,60799 -40213,29880,79917 -87800,58721,69438 -54801,54714,63846 -88524,99139,48762 -50727,68520,46641 -66039,79990,40004 -58332,89351,39201 -51305,50160,14617 -28711,75570,86916 -26603,6518,63794 -72342,6476,18513 -99389,15571,47630 -93384,1223,9329 -63826,83729,39849 -45497,91340,64174 -67149,76,31547 -44954,36510,44 -14335,56031,90974 -98817,18441,97055 -84815,20683,90130 -16029,52282,25647 -4673,72115,50859 -8478,9303,92507 -48363,95236,35571 -50476,39311,79493 -32214,61642,19903 -42575,26360,22095 -9005,97980,95725 -38370,19056,61572 -22433,32537,82787 -74722,90590,41988 -63986,47474,95387 -83201,90859,69588 -7211,61064,74448 -87248,6356,93720 -20158,17109,94009 -89712,24089,73478 -35006,76016,16268 -1824,84875,87901 -76893,26724,55166 -14099,98873,46158 -29978,52099,97563 -98961,36113,91465 -6965,37774,7694 -69426,38603,96398 -62390,58816,85791 -15607,4487,68388 -10489,3819,94356 -88826,63999,54207 -24275,72347,35567 -14595,36746,21829 -46424,34568,29156 -8091,71151,70584 -43115,66533,65697 -66238,19311,21142 -62809,94372,60354 -83256,94129,30351 -31516,1932,54914 -52641,9316,43683 -16236,46067,72858 -32497,42313,23951 -5145,30764,1848 -23996,9112,22069 -94277,56791,44035 -15141,99918,59303 -95687,11722,19938 -94496,21896,20355 -93225,72983,12458 -4839,68108,21219 -47380,48890,5259 -12663,60051,41363 -76954,60657,52851 -52305,41381,47981 -24778,91820,73082 -35675,9601,80940 -28456,92478,39358 -51958,60200,63049 -51650,52676,11650 -48081,33850,64276 -87064,1720,63296 -40433,12725,18266 -94348,43418,45799 -20470,21702,94090 -12004,23132,27411 -89986,31923,8502 -85648,47680,41230 -51972,45075,30931 -97869,98693,51228 -68981,64466,42538 -79201,4048,35804 -59814,65659,33387 -67253,20434,5822 -99162,32642,40954 -88951,94213,70431 -66956,10283,79203 -50472,19167,19814 -77595,34367,9152 -52200,30637,98911 -9572,56961,51688 -21728,42000,95581 -34644,82476,46113 -49920,7112,42564 -99372,53953,7932 -25640,30738,4419 -38390,14097,87763 -62913,35208,1032 -78886,46674,34610 -29481,84778,33270 -4136,12091,60037 -18100,71599,44697 -83013,56763,57956 -10506,43444,67437 -47624,60852,29131 -33347,1017,60890 -11269,30794,19962 -298,67872,64086 -28053,403,93977 -41764,80623,49348 -51190,6989,99367 -79404,16174,93582 -56124,67785,13804 -24384,50933,10733 -14984,83175,28379 -45916,48239,59985 -10967,99826,7620 -2997,51633,23639 -34753,71335,92675 -75660,39969,10715 -83824,72792,94541 -9061,46619,93357 -43832,99088,59806 -84001,38257,78243 -85568,33320,66853 -8783,8617,92299 -76061,39130,39721 -78880,16258,75417 -57278,21997,40354 -4559,60796,14693 -75173,78782,69586 -30588,47763,69657 -69813,51508,8619 -66973,39919,83925 -93116,65750,35214 -49428,75151,61072 -99304,453,24846 -64857,75563,81408 -99758,7054,93834 -60990,98648,73787 -4153,51510,43699 -30768,63940,92372 -44204,47525,71638 -58279,27840,69103 -87149,98184,8365 -20501,17223,72651 -27456,95880,46643 -27906,57479,1243 -8916,81885,58480 -34538,53272,46977 -31376,1084,39050 -36311,17922,51330 -79624,94586,41997 -70740,42495,24029 -24404,52571,61354 -93458,825,3 -21917,90222,28768 -67330,83159,6462 -40946,95176,96946 -12360,29184,83047 -94636,18556,71984 -86584,42247,40325 -30412,15684,94710 -59413,69110,34094 -43275,11397,32663 -38312,82394,71991 -50954,92538,77890 -53986,21917,62472 -96368,75398,45486 -70828,27018,1180 -60612,65119,56177 -28171,45411,45312 -80693,73816,54751 -39115,3128,11970 -78907,6226,32605 -26051,24623,12847 -43169,3632,81127 -72407,61325,65026 -80694,39461,55748 -28953,33984,16018 -17340,97547,32755 -298,28373,37454 -68428,19166,26358 -81883,45188,87649 -74802,44106,71842 -77704,1463,75014 -87334,7436,48879 -95479,14681,67734 -72300,12948,90266 -29920,88606,86139 -86951,52647,24937 -22086,36572,63814 -87668,86806,70369 -1200,97676,40547 -83998,79586,44813 -97007,10381,20433 -57917,74956,51309 -48901,72861,1907 -93789,81139,93024 -30414,75217,98870 -58580,95454,82328 -28177,84260,29178 -80996,2150,52258 -30211,259,23066 -96922,77069,96152 -36905,31544,67887 -24998,62122,12193 -45677,76513,54279 -27945,34130,83745 -49823,46546,13147 -7112,85252,26375 -26021,16210,84105 -53145,46690,86495 -3610,48225,81447 -23818,28027,76288 -15867,2347,37266 -6657,95764,89140 -484,34773,97330 -58783,86276,79156 -63051,15779,17616 -42935,68871,21255 -62612,76887,26788 -8593,56089,39178 -93484,3650,14149 -2940,47948,86899 -89602,80937,62602 -34040,33292,82330 -37219,99156,70790 -82351,1733,439 -79284,15436,52520 -86629,92093,16274 -41450,95994,62484 -53514,32949,25695 -61243,75842,22016 -54266,48744,20085 -25976,63680,69662 -92436,30860,89517 -42543,5132,65960 -51498,15404,36682 -68737,34406,98600 -40474,78936,67870 -66152,87039,2599 -98037,93472,24095 -21175,24538,12389 -36564,91001,51018 -60963,98829,7138 -39623,65980,22582 -61402,80958,58207 -6536,46233,67184 -5251,6313,77704 -51855,82850,32709 -87166,75005,54035 -99871,61178,43781 -6037,28496,63688 -69792,9256,36639 -18169,45582,20739 -47133,46218,79206 -99231,7619,83999 -22531,30483,60079 -30053,13538,63244 -41213,14032,83358 -19612,24452,32798 -46331,91809,86738 -40064,26655,52982 -57841,31154,72898 -56635,73059,63085 -55312,50346,39193 -40347,28418,89452 -52846,71841,9491 -68673,95159,28260 -73176,39675,10294 -60776,83560,4247 -50158,60720,81557 -52300,5490,70598 -60491,95648,15378 -94407,3440,59489 -52223,90064,18409 -68582,67041,69493 -2010,71946,77616 -38521,38306,13975 -17469,5414,10282 -89535,91811,95346 -69364,31928,13834 -70031,90204,24476 -3797,54613,88896 -5812,8985,75003 -22793,45011,55540 -61147,27621,93151 -36269,48287,5527 -2649,10723,27605 -17791,32979,86074 -48507,84122,1818 -26671,41278,61634 -72879,25592,15274 -99759,7284,58489 -44039,10648,13272 -25317,94599,90036 -61642,92926,9170 -92451,51251,55900 -39169,42097,2939 -86180,44776,21256 -81870,97141,59508 -59849,30747,84612 -25083,80413,80812 -57339,93998,73598 -67947,40278,88085 -71103,49165,35603 -73164,90129,5035 -94186,40896,79885 -48358,72402,76865 -53985,93911,89396 -82555,29679,91328 -24284,21738,66560 -78977,93294,88178 -43656,84564,67611 -70657,88671,14706 -53874,98002,69623 -34961,83067,26014 -34355,20976,88292 -20243,83630,45228 -97840,54203,48912 -70094,3728,87602 -15885,22135,65573 -90065,52616,82741 -80262,3897,19480 -12949,45545,86824 -22964,34014,3490 -79424,33014,67174 -2004,9673,83023 -35263,20547,81573 -71872,93083,82170 -19235,61149,62626 -41483,47173,54942 -88241,48949,77808 -49569,81928,2796 -23992,7742,2713 -42194,33740,82279 -4985,47773,18486 -66575,40452,60523 -57640,23071,63549 -77021,79670,33706 -97362,41882,71030 -58685,64389,69989 -33625,30256,65375 -94237,40730,83689 -20251,40207,11770 -55200,59388,1538 -95924,18294,1616 -10295,82720,18580 -72200,30002,30603 -59517,42844,17238 -9554,4993,90531 -63439,49409,94765 -15016,44792,35985 -26963,78156,51701 -85011,95060,76739 -46454,50866,89711 -96060,82846,91659 -83037,59319,94577 -8290,65634,79205 -43973,80688,10500 -6481,98859,30186 -7909,53917,69252 -81053,79295,78868 -496,85261,91125 -55593,87845,28416 -57944,1184,65874 -537,30202,23691 -89984,99697,91522 -95379,86410,29013 -52840,70782,10030 -45392,89876,41492 -65937,12179,84915 -44975,21436,11367 -91749,40933,81747 -4394,33870,72074 -30503,54402,41910 -90388,29049,99214 -73084,9468,2846 -43703,86295,80347 -66369,25581,37351 -68141,46918,95767 -80843,29490,95476 -55487,50085,90603 -6519,62962,64539 -11129,5495,18000 -79627,21265,69007 -47555,41141,56667 -35418,33436,32838 -92217,41311,18613 -87607,78095,7303 -12374,17570,64957 -59264,30016,93434 -82306,73860,63935 -19314,1277,72635 -98737,45817,73515 -599,82828,95784 -28168,33778,27577 -36334,23307,87450 -67557,75339,63636 -91325,21865,36016 -97705,59880,7858 -30360,12961,92047 -62707,80663,85148 -28282,23753,39358 -20484,28395,71223 -10840,9341,48297 -90035,3390,96894 -56994,93652,85405 -42510,99407,93703 -39446,36668,65599 -76602,58135,93364 -44819,19878,85464 -35839,26022,40879 -45179,57834,13928 -52043,98603,39397 -50845,68890,91754 -4333,30718,24748 -85718,44038,82496 -36811,84974,81632 -86975,15165,50972 -82208,84572,34824 -98514,15014,73770 -91731,46928,81094 -69747,92990,78259 -68183,42665,77481 -19611,75932,19865 -91689,10370,21722 -49668,40708,74950 -94405,93768,35688 -1023,458,13922 -53258,1329,35183 -89336,19276,61280 -99141,48439,642 -99347,35502,7385 -34396,61785,21270 -67865,33068,456 -77457,61399,46096 -74406,42306,31269 -36090,99467,76063 -7026,41996,80380 -85809,60651,59086 -64441,913,93940 -17508,79886,22233 -19798,163,74563 -65879,87452,9465 -87573,10666,29235 -19440,71454,64779 -80368,81746,42378 -37497,82571,6031 -17805,40743,51561 -99430,54794,72102 -71081,12906,49982 -29729,30666,30274 -57623,28424,80051 -58177,19137,2554 -96505,7588,34090 -71558,6884,85993 -73899,36484,70026 -94708,2893,89823 -97027,81418,7995 -61130,83329,25406 -18626,51289,69051 -1429,29676,69214 -88701,99619,69548 -13765,16487,43486 -12314,21972,37452 -35899,89588,30736 -72539,74685,45191 -58884,92790,49418 -63125,17196,26531 -60646,30082,6629 -42734,66619,99223 -45935,91192,51495 -63356,98654,60871 -88030,11109,17034 -95560,3923,57626 -89105,12290,13002 -92937,14797,41207 -53584,91001,6559 -274,18596,41925 -42345,94771,1754 -54611,9066,71752 -91105,96036,42456 -39235,30011,31715 -20747,12314,73330 -15122,61490,7637 -733,11696,42854 -35153,12422,94022 -70000,44092,48455 -81860,14081,58066 -9514,35503,3768 -72622,53367,19479 -68031,4916,31380 -767,42546,48127 -38350,69122,98407 -88119,35828,60076 -28315,60103,29161 -19170,68838,38067 -15589,56043,16922 -34957,94254,17877 -70527,77168,35752 -74229,34735,33462 -90067,82557,76853 -24472,47475,5789 -33669,84848,31096 -99008,47931,80792 -35028,37251,66246 -91743,14312,48414 -50456,18764,20102 -92576,36976,88684 -69341,84968,60432 -45576,58907,58240 -39931,5153,21603 -59648,98603,47109 -69689,59695,53475 -21397,51003,35263 -16441,91456,25256 -77545,95209,57368 -52314,53248,71775 -29646,20210,27412 -75484,27781,55025 -93626,7439,81898 -75820,78773,26176 -29572,40252,16137 -73749,38852,76768 -54913,22959,2008 -38918,43540,38659 -63895,14206,21558 -39549,83596,5315 -90015,38967,79682 -98057,39297,15666 diff --git a/2025/d08/ex2/ex2.py b/2025/d08/ex2/ex2.py deleted file mode 100755 index b04d2f5..0000000 --- a/2025/d08/ex2/ex2.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python - -import collections -import itertools -import sys -from collections.abc import Iterable -from typing import Generic, Hashable, NamedTuple, TypeVar - - -class Point(NamedTuple): - x: int - y: int - z: int - - -class UnionFind: - _parent: list[int] - _rank: list[int] - - def __init__(self, size: int): - self._parent = list(range(size)) - self._rank = [0] * size - - def find(self, elem: int) -> int: - while (parent := self._parent[elem]) != elem: - elem, self._parent[elem] = parent, self._parent[parent] - return elem - - def union(self, lhs: int, rhs: int) -> bool: - lhs = self.find(lhs) - rhs = self.find(rhs) - if lhs == rhs: - return False - if self._rank[lhs] < self._rank[rhs]: - lhs, rhs = rhs, lhs - self._parent[rhs] = lhs - if self._rank[lhs] == self._rank[rhs]: - self._rank[lhs] += 1 - return True - - def sets(self) -> dict[int, set[int]]: - res: dict[int, set[int]] = collections.defaultdict(set) - for elem in range(len(self._parent)): - res[self.find(elem)].add(elem) - return dict(res) - - -# PEP 695 still not supported by MyPy... -T = TypeVar("T", bound=Hashable) - - -class DisjointSet(Generic[T]): - _values: list[T] - _to_index: dict[T, int] - _sets: UnionFind - - def __init__(self, values: Iterable[T]) -> None: - self._values = list(values) - self._to_index = {v: i for i, v in enumerate(self._values)} - self._sets = UnionFind(len(self._values)) - - def find(self, elem: T) -> T: - return self._values[self._sets.find(self._to_index[elem])] - - def union(self, lhs: T, rhs: T) -> bool: - return self._sets.union(self._to_index[lhs], self._to_index[rhs]) - - def sets(self) -> dict[T, set[T]]: - sets = self._sets.sets() - return { - self._values[r]: {self._values[i] for i in values} - for r, values in sets.items() - } - - -def solve(input: list[str]) -> int: - def parse(input: list[str]) -> list[Point]: - return [Point(*map(int, line.split(","))) for line in input] - - def sq_dist(p: Point, other: Point) -> int: - return sum(abs(a - b) ** 2 for a, b in zip(p, other)) - - def list_connections(boxes: list[Point]) -> list[tuple[Point, Point]]: - connections = itertools.combinations(boxes, 2) - return sorted(connections, key=lambda con: sq_dist(*con)) - - def connect_boxes(boxes: list[Point], n: int = 1000) -> tuple[Point, Point]: - connections = list_connections(boxes) - sets = DisjointSet(boxes) - num_sets = len(boxes) - for a, b in connections: - num_sets -= sets.union(a, b) - if num_sets == 1: - return a, b - assert False - - boxes = parse(input) - last_connection = connect_boxes(boxes) - return last_connection[0].x * last_connection[1].x - - -def main() -> None: - input = sys.stdin.read().splitlines() - print(solve(input)) - - -if __name__ == "__main__": - main() diff --git a/2025/d08/ex2/input b/2025/d08/ex2/input deleted file mode 100644 index 9df6b93..0000000 --- a/2025/d08/ex2/input +++ /dev/null @@ -1,1000 +0,0 @@ -96616,810,75978 -47,21512,72240 -37204,32405,96978 -29869,39703,17245 -85469,86947,73441 -30718,17071,51096 -41362,30138,67009 -598,13948,14379 -76389,15190,48555 -49893,73440,15307 -29849,31150,65844 -43789,38501,72225 -1289,51970,81957 -94777,88446,92003 -67115,73782,47139 -34918,73782,76791 -10226,21601,9106 -25255,34515,55484 -15907,71527,29965 -81513,47000,15653 -80059,88130,47907 -38982,78390,65861 -52404,53380,32169 -57890,49601,15440 -124,21347,33712 -34031,15726,61115 -74713,70099,55008 -5651,21087,42325 -7646,22850,56910 -77521,99356,56389 -21748,86110,49763 -33638,70698,70272 -72192,16208,6392 -44081,77872,46151 -77812,33943,16761 -73761,81089,45679 -8774,27775,53496 -7575,13375,22609 -58036,91575,80779 -59110,66473,56545 -86077,10459,63254 -66197,87350,40327 -81411,92072,72676 -49748,9698,89965 -78439,17433,63349 -21784,15350,87174 -20127,8208,29553 -68687,89811,29134 -37359,84624,5746 -16185,94710,97793 -18231,95999,20306 -46807,93766,75186 -66175,64946,13827 -2379,85923,41962 -49923,83393,61215 -49402,16213,59895 -16578,1185,60394 -26992,44142,77991 -11815,61668,19454 -49157,21692,51961 -70475,72818,83517 -60133,50809,14515 -36769,65052,9338 -68358,29041,16515 -68765,91605,30936 -93634,60030,23295 -75141,909,75737 -77063,82141,8421 -29230,5618,66027 -60311,44944,84379 -6727,40525,76384 -60892,71273,13434 -99336,47605,54010 -4854,66583,83047 -41024,75773,25856 -61313,40857,75555 -92580,94652,34432 -66175,63087,68137 -862,46037,40611 -9364,61053,96965 -96197,97478,31849 -46012,78260,93076 -4284,3783,29454 -79377,111,81121 -36895,62273,40991 -28332,83678,6091 -124,6836,46015 -58191,32091,27558 -83664,90573,74440 -47684,52380,13614 -35120,46095,58900 -75844,70060,25294 -22872,85463,81740 -55383,79835,82127 -44744,64274,86800 -60852,70621,32428 -91516,39702,39626 -3688,20727,56814 -49311,23987,86560 -44548,2875,53676 -16841,24697,97455 -17788,80255,91151 -83290,1708,4577 -39021,78132,21442 -12009,82267,12399 -91035,14375,97595 -94085,31799,99374 -88944,58929,65104 -82345,84761,71280 -62780,13633,35806 -70571,95978,95108 -52888,93487,88078 -29130,16331,14409 -92304,65168,58557 -28472,46629,22552 -832,89716,12881 -8947,49372,18917 -53393,62848,85813 -14570,95609,71932 -34906,59313,55734 -37689,47610,81231 -48410,8422,91050 -43870,76541,8153 -5427,34304,38621 -76919,40838,49838 -89295,69748,69369 -50411,60493,56509 -26826,15701,77344 -24956,47561,88427 -56537,24378,40188 -84314,39970,40106 -13090,35301,17852 -60153,99913,7345 -21147,67767,86352 -94054,90953,58835 -81837,49253,53459 -64686,71238,47767 -74230,40836,81723 -86599,29209,24915 -94641,86178,95813 -45007,59187,71572 -33557,77915,37965 -10,26480,78523 -49998,17424,383 -72243,16533,32163 -96153,76105,53137 -67890,80555,76817 -58274,24705,50617 -90297,95948,32697 -44469,83877,56552 -15831,6265,94385 -55836,6873,75895 -90337,23678,21982 -35012,30025,70177 -42902,52640,67628 -51436,86883,38944 -72763,97457,11606 -50955,3969,92867 -91443,54845,20378 -2133,70178,55310 -17613,15558,96325 -62436,31322,23281 -53947,2865,94764 -40898,32429,56964 -53537,52879,22200 -42871,1669,76000 -63615,86744,87542 -93336,17798,45244 -56804,65416,20724 -49294,21904,85931 -45336,49650,26151 -38314,46233,85923 -64085,1875,33253 -6740,22204,3436 -94916,13931,65156 -65933,21535,26507 -45670,48945,7381 -88012,2945,38942 -8597,15275,7742 -37182,10617,88064 -44966,19938,98403 -52444,10373,45375 -2510,89230,59817 -41311,12069,30872 -42173,92528,45714 -81874,83719,21053 -66914,60637,68318 -9977,30378,74103 -77500,5036,80383 -14977,54324,58522 -64913,27528,28552 -79234,26215,79253 -65555,68595,19347 -48129,62152,56907 -55931,49134,27039 -81533,76718,78435 -27041,48960,99966 -12471,11450,99887 -44614,14647,11244 -7064,79634,40939 -47042,12530,41088 -2893,25877,88592 -93696,12076,1871 -46418,97089,52542 -67033,30021,91392 -80133,5826,11001 -10958,41254,28841 -31153,7589,15039 -17780,43539,49617 -76429,94380,46400 -15092,32751,31607 -34046,15838,20784 -75419,51308,44185 -47445,41839,7061 -91239,85946,6742 -2606,30107,86190 -57460,64139,20675 -47311,26384,38310 -75437,20187,60579 -45740,25222,35810 -89165,70723,56270 -83116,55684,54082 -18207,17844,67662 -9674,58573,66797 -44733,89585,51527 -83277,92121,15913 -4249,7080,93485 -92675,37985,23278 -68824,25339,15228 -98817,25303,50014 -79441,94633,94983 -3538,68284,7729 -90071,19613,80286 -35338,57531,87102 -13284,79098,7934 -52860,41073,17367 -63008,43331,63254 -78540,80209,43105 -8114,96893,96242 -33065,15885,38404 -93180,10260,1406 -49667,46625,92829 -33003,24911,14339 -38778,55485,59791 -72543,61880,87071 -85741,95244,22418 -85620,63879,96866 -67367,81893,85550 -50325,33325,35215 -39346,39396,46554 -68496,87768,76749 -25295,69389,65559 -95779,28875,6542 -95024,16913,1461 -54393,79624,66654 -22568,66655,17707 -42154,25195,2845 -94777,25624,50767 -29674,369,53974 -29667,70763,48673 -90169,60090,15118 -99124,57348,86302 -63913,1301,25716 -81174,63073,69642 -59620,25265,48206 -7818,69808,55040 -1176,94990,88053 -62167,61746,50297 -10710,51779,51561 -55335,99261,74317 -94526,24185,92724 -98776,71390,17390 -74558,87154,35918 -40211,49179,4540 -74967,488,56683 -76881,89746,20583 -83194,11163,55480 -58293,85409,68879 -22119,39436,26300 -33552,10044,448 -32230,13128,38117 -81887,5361,46790 -72993,66761,17603 -47638,80029,73438 -39481,64315,79268 -58135,18165,18841 -2042,62057,70204 -9114,12242,22985 -35882,13857,4096 -18964,762,17683 -38511,95699,6284 -73814,1119,60942 -83070,32272,95920 -84551,68696,99564 -62889,86971,44801 -30741,80485,10486 -7872,31662,84503 -65006,93089,15350 -72897,5321,3410 -84915,37773,941 -66303,31900,55969 -88175,91065,44552 -9797,71120,30801 -18859,592,52302 -48347,85770,56567 -2175,35684,92455 -39724,11001,65710 -61391,86663,37548 -45330,58198,7425 -70936,54231,13355 -42914,38762,66826 -1884,93081,23928 -70788,2959,68377 -31287,77424,53853 -49782,74150,12616 -22011,27058,19827 -35744,39142,141 -46698,44490,42526 -99503,65888,29700 -23109,2935,55599 -73873,86052,88730 -41705,73980,37236 -79535,44606,82017 -45461,52915,48898 -20403,23037,50390 -52469,52324,71746 -27849,17692,85574 -63316,98722,95925 -11186,46337,14356 -83076,32036,79529 -61105,8234,11086 -95435,83738,68003 -61421,61582,42741 -18857,40910,67067 -97733,90507,91159 -62126,69029,10771 -51588,89853,31246 -14402,45890,62651 -4576,99380,53771 -40711,89434,94430 -6203,98731,77355 -45700,46430,87272 -36822,67855,58488 -9902,41517,24442 -93293,91156,74863 -71444,13876,4077 -42980,68701,9986 -97660,73023,2494 -19956,5786,58572 -43631,25027,61813 -47487,71311,92859 -1627,86846,1636 -76397,34793,31510 -69137,69406,53854 -51824,63534,67604 -48669,7752,35759 -35347,91796,83425 -66421,72114,65991 -41769,65462,64707 -52154,83731,18679 -93093,80021,2843 -59961,87369,41338 -61774,67916,56576 -61238,83388,22624 -87301,35647,21220 -18563,40513,46270 -31431,89556,22191 -18400,15064,32441 -19586,56478,91982 -10018,46780,77058 -39406,7841,36230 -15191,12600,21150 -16792,47932,24378 -60440,92024,4940 -6052,10147,48120 -1230,94468,22896 -90393,69014,78693 -20778,6823,5014 -12785,38994,51536 -15309,27025,40538 -9455,93063,94175 -52963,63538,24640 -76876,99767,20424 -88675,70704,84876 -29837,572,89758 -24665,43287,4124 -19596,39044,22506 -23320,89139,12457 -16298,43802,18588 -13863,53279,86359 -65756,38823,39017 -87980,76503,68792 -29808,1133,5547 -65225,76422,23690 -97926,56995,73309 -52631,46378,86930 -9699,19378,79988 -50576,35602,76568 -10475,51282,28809 -10841,6595,69501 -68477,7514,78298 -80172,90885,77294 -794,74931,66380 -16579,66603,50677 -677,38561,19559 -3076,24613,17121 -48482,23484,4486 -96978,26894,96599 -29550,67389,6448 -59980,27451,80958 -60956,37227,24831 -40202,40948,35792 -25500,21049,18829 -95357,78024,61424 -66165,41073,67961 -3900,18562,90386 -5993,41426,12575 -55978,14534,4710 -62310,98833,3965 -36662,21431,3535 -1247,94520,16658 -56495,63277,82136 -60227,11533,3984 -55190,46612,75533 -55832,29751,10128 -60037,5341,11856 -88331,37751,9479 -12410,76462,51822 -50775,10467,22268 -31249,97861,29215 -51633,19235,43441 -26172,13202,69249 -20710,13243,16076 -72953,93560,87352 -16585,67087,56128 -78,97449,5581 -7850,39585,11593 -56185,25107,62693 -20769,86165,77245 -54030,10493,82291 -20323,16227,72965 -20539,97065,5529 -11191,69352,16214 -24808,74182,6714 -32750,7109,5245 -30078,95393,61862 -95086,84632,26437 -89669,27166,69617 -97663,85156,84583 -65200,24901,58281 -32476,59684,22183 -88333,75537,24786 -97754,39828,21801 -57090,90810,81819 -17456,68293,6317 -60663,86154,2830 -11207,37715,44558 -96412,78170,57495 -34637,65683,61943 -5630,25259,60799 -40213,29880,79917 -87800,58721,69438 -54801,54714,63846 -88524,99139,48762 -50727,68520,46641 -66039,79990,40004 -58332,89351,39201 -51305,50160,14617 -28711,75570,86916 -26603,6518,63794 -72342,6476,18513 -99389,15571,47630 -93384,1223,9329 -63826,83729,39849 -45497,91340,64174 -67149,76,31547 -44954,36510,44 -14335,56031,90974 -98817,18441,97055 -84815,20683,90130 -16029,52282,25647 -4673,72115,50859 -8478,9303,92507 -48363,95236,35571 -50476,39311,79493 -32214,61642,19903 -42575,26360,22095 -9005,97980,95725 -38370,19056,61572 -22433,32537,82787 -74722,90590,41988 -63986,47474,95387 -83201,90859,69588 -7211,61064,74448 -87248,6356,93720 -20158,17109,94009 -89712,24089,73478 -35006,76016,16268 -1824,84875,87901 -76893,26724,55166 -14099,98873,46158 -29978,52099,97563 -98961,36113,91465 -6965,37774,7694 -69426,38603,96398 -62390,58816,85791 -15607,4487,68388 -10489,3819,94356 -88826,63999,54207 -24275,72347,35567 -14595,36746,21829 -46424,34568,29156 -8091,71151,70584 -43115,66533,65697 -66238,19311,21142 -62809,94372,60354 -83256,94129,30351 -31516,1932,54914 -52641,9316,43683 -16236,46067,72858 -32497,42313,23951 -5145,30764,1848 -23996,9112,22069 -94277,56791,44035 -15141,99918,59303 -95687,11722,19938 -94496,21896,20355 -93225,72983,12458 -4839,68108,21219 -47380,48890,5259 -12663,60051,41363 -76954,60657,52851 -52305,41381,47981 -24778,91820,73082 -35675,9601,80940 -28456,92478,39358 -51958,60200,63049 -51650,52676,11650 -48081,33850,64276 -87064,1720,63296 -40433,12725,18266 -94348,43418,45799 -20470,21702,94090 -12004,23132,27411 -89986,31923,8502 -85648,47680,41230 -51972,45075,30931 -97869,98693,51228 -68981,64466,42538 -79201,4048,35804 -59814,65659,33387 -67253,20434,5822 -99162,32642,40954 -88951,94213,70431 -66956,10283,79203 -50472,19167,19814 -77595,34367,9152 -52200,30637,98911 -9572,56961,51688 -21728,42000,95581 -34644,82476,46113 -49920,7112,42564 -99372,53953,7932 -25640,30738,4419 -38390,14097,87763 -62913,35208,1032 -78886,46674,34610 -29481,84778,33270 -4136,12091,60037 -18100,71599,44697 -83013,56763,57956 -10506,43444,67437 -47624,60852,29131 -33347,1017,60890 -11269,30794,19962 -298,67872,64086 -28053,403,93977 -41764,80623,49348 -51190,6989,99367 -79404,16174,93582 -56124,67785,13804 -24384,50933,10733 -14984,83175,28379 -45916,48239,59985 -10967,99826,7620 -2997,51633,23639 -34753,71335,92675 -75660,39969,10715 -83824,72792,94541 -9061,46619,93357 -43832,99088,59806 -84001,38257,78243 -85568,33320,66853 -8783,8617,92299 -76061,39130,39721 -78880,16258,75417 -57278,21997,40354 -4559,60796,14693 -75173,78782,69586 -30588,47763,69657 -69813,51508,8619 -66973,39919,83925 -93116,65750,35214 -49428,75151,61072 -99304,453,24846 -64857,75563,81408 -99758,7054,93834 -60990,98648,73787 -4153,51510,43699 -30768,63940,92372 -44204,47525,71638 -58279,27840,69103 -87149,98184,8365 -20501,17223,72651 -27456,95880,46643 -27906,57479,1243 -8916,81885,58480 -34538,53272,46977 -31376,1084,39050 -36311,17922,51330 -79624,94586,41997 -70740,42495,24029 -24404,52571,61354 -93458,825,3 -21917,90222,28768 -67330,83159,6462 -40946,95176,96946 -12360,29184,83047 -94636,18556,71984 -86584,42247,40325 -30412,15684,94710 -59413,69110,34094 -43275,11397,32663 -38312,82394,71991 -50954,92538,77890 -53986,21917,62472 -96368,75398,45486 -70828,27018,1180 -60612,65119,56177 -28171,45411,45312 -80693,73816,54751 -39115,3128,11970 -78907,6226,32605 -26051,24623,12847 -43169,3632,81127 -72407,61325,65026 -80694,39461,55748 -28953,33984,16018 -17340,97547,32755 -298,28373,37454 -68428,19166,26358 -81883,45188,87649 -74802,44106,71842 -77704,1463,75014 -87334,7436,48879 -95479,14681,67734 -72300,12948,90266 -29920,88606,86139 -86951,52647,24937 -22086,36572,63814 -87668,86806,70369 -1200,97676,40547 -83998,79586,44813 -97007,10381,20433 -57917,74956,51309 -48901,72861,1907 -93789,81139,93024 -30414,75217,98870 -58580,95454,82328 -28177,84260,29178 -80996,2150,52258 -30211,259,23066 -96922,77069,96152 -36905,31544,67887 -24998,62122,12193 -45677,76513,54279 -27945,34130,83745 -49823,46546,13147 -7112,85252,26375 -26021,16210,84105 -53145,46690,86495 -3610,48225,81447 -23818,28027,76288 -15867,2347,37266 -6657,95764,89140 -484,34773,97330 -58783,86276,79156 -63051,15779,17616 -42935,68871,21255 -62612,76887,26788 -8593,56089,39178 -93484,3650,14149 -2940,47948,86899 -89602,80937,62602 -34040,33292,82330 -37219,99156,70790 -82351,1733,439 -79284,15436,52520 -86629,92093,16274 -41450,95994,62484 -53514,32949,25695 -61243,75842,22016 -54266,48744,20085 -25976,63680,69662 -92436,30860,89517 -42543,5132,65960 -51498,15404,36682 -68737,34406,98600 -40474,78936,67870 -66152,87039,2599 -98037,93472,24095 -21175,24538,12389 -36564,91001,51018 -60963,98829,7138 -39623,65980,22582 -61402,80958,58207 -6536,46233,67184 -5251,6313,77704 -51855,82850,32709 -87166,75005,54035 -99871,61178,43781 -6037,28496,63688 -69792,9256,36639 -18169,45582,20739 -47133,46218,79206 -99231,7619,83999 -22531,30483,60079 -30053,13538,63244 -41213,14032,83358 -19612,24452,32798 -46331,91809,86738 -40064,26655,52982 -57841,31154,72898 -56635,73059,63085 -55312,50346,39193 -40347,28418,89452 -52846,71841,9491 -68673,95159,28260 -73176,39675,10294 -60776,83560,4247 -50158,60720,81557 -52300,5490,70598 -60491,95648,15378 -94407,3440,59489 -52223,90064,18409 -68582,67041,69493 -2010,71946,77616 -38521,38306,13975 -17469,5414,10282 -89535,91811,95346 -69364,31928,13834 -70031,90204,24476 -3797,54613,88896 -5812,8985,75003 -22793,45011,55540 -61147,27621,93151 -36269,48287,5527 -2649,10723,27605 -17791,32979,86074 -48507,84122,1818 -26671,41278,61634 -72879,25592,15274 -99759,7284,58489 -44039,10648,13272 -25317,94599,90036 -61642,92926,9170 -92451,51251,55900 -39169,42097,2939 -86180,44776,21256 -81870,97141,59508 -59849,30747,84612 -25083,80413,80812 -57339,93998,73598 -67947,40278,88085 -71103,49165,35603 -73164,90129,5035 -94186,40896,79885 -48358,72402,76865 -53985,93911,89396 -82555,29679,91328 -24284,21738,66560 -78977,93294,88178 -43656,84564,67611 -70657,88671,14706 -53874,98002,69623 -34961,83067,26014 -34355,20976,88292 -20243,83630,45228 -97840,54203,48912 -70094,3728,87602 -15885,22135,65573 -90065,52616,82741 -80262,3897,19480 -12949,45545,86824 -22964,34014,3490 -79424,33014,67174 -2004,9673,83023 -35263,20547,81573 -71872,93083,82170 -19235,61149,62626 -41483,47173,54942 -88241,48949,77808 -49569,81928,2796 -23992,7742,2713 -42194,33740,82279 -4985,47773,18486 -66575,40452,60523 -57640,23071,63549 -77021,79670,33706 -97362,41882,71030 -58685,64389,69989 -33625,30256,65375 -94237,40730,83689 -20251,40207,11770 -55200,59388,1538 -95924,18294,1616 -10295,82720,18580 -72200,30002,30603 -59517,42844,17238 -9554,4993,90531 -63439,49409,94765 -15016,44792,35985 -26963,78156,51701 -85011,95060,76739 -46454,50866,89711 -96060,82846,91659 -83037,59319,94577 -8290,65634,79205 -43973,80688,10500 -6481,98859,30186 -7909,53917,69252 -81053,79295,78868 -496,85261,91125 -55593,87845,28416 -57944,1184,65874 -537,30202,23691 -89984,99697,91522 -95379,86410,29013 -52840,70782,10030 -45392,89876,41492 -65937,12179,84915 -44975,21436,11367 -91749,40933,81747 -4394,33870,72074 -30503,54402,41910 -90388,29049,99214 -73084,9468,2846 -43703,86295,80347 -66369,25581,37351 -68141,46918,95767 -80843,29490,95476 -55487,50085,90603 -6519,62962,64539 -11129,5495,18000 -79627,21265,69007 -47555,41141,56667 -35418,33436,32838 -92217,41311,18613 -87607,78095,7303 -12374,17570,64957 -59264,30016,93434 -82306,73860,63935 -19314,1277,72635 -98737,45817,73515 -599,82828,95784 -28168,33778,27577 -36334,23307,87450 -67557,75339,63636 -91325,21865,36016 -97705,59880,7858 -30360,12961,92047 -62707,80663,85148 -28282,23753,39358 -20484,28395,71223 -10840,9341,48297 -90035,3390,96894 -56994,93652,85405 -42510,99407,93703 -39446,36668,65599 -76602,58135,93364 -44819,19878,85464 -35839,26022,40879 -45179,57834,13928 -52043,98603,39397 -50845,68890,91754 -4333,30718,24748 -85718,44038,82496 -36811,84974,81632 -86975,15165,50972 -82208,84572,34824 -98514,15014,73770 -91731,46928,81094 -69747,92990,78259 -68183,42665,77481 -19611,75932,19865 -91689,10370,21722 -49668,40708,74950 -94405,93768,35688 -1023,458,13922 -53258,1329,35183 -89336,19276,61280 -99141,48439,642 -99347,35502,7385 -34396,61785,21270 -67865,33068,456 -77457,61399,46096 -74406,42306,31269 -36090,99467,76063 -7026,41996,80380 -85809,60651,59086 -64441,913,93940 -17508,79886,22233 -19798,163,74563 -65879,87452,9465 -87573,10666,29235 -19440,71454,64779 -80368,81746,42378 -37497,82571,6031 -17805,40743,51561 -99430,54794,72102 -71081,12906,49982 -29729,30666,30274 -57623,28424,80051 -58177,19137,2554 -96505,7588,34090 -71558,6884,85993 -73899,36484,70026 -94708,2893,89823 -97027,81418,7995 -61130,83329,25406 -18626,51289,69051 -1429,29676,69214 -88701,99619,69548 -13765,16487,43486 -12314,21972,37452 -35899,89588,30736 -72539,74685,45191 -58884,92790,49418 -63125,17196,26531 -60646,30082,6629 -42734,66619,99223 -45935,91192,51495 -63356,98654,60871 -88030,11109,17034 -95560,3923,57626 -89105,12290,13002 -92937,14797,41207 -53584,91001,6559 -274,18596,41925 -42345,94771,1754 -54611,9066,71752 -91105,96036,42456 -39235,30011,31715 -20747,12314,73330 -15122,61490,7637 -733,11696,42854 -35153,12422,94022 -70000,44092,48455 -81860,14081,58066 -9514,35503,3768 -72622,53367,19479 -68031,4916,31380 -767,42546,48127 -38350,69122,98407 -88119,35828,60076 -28315,60103,29161 -19170,68838,38067 -15589,56043,16922 -34957,94254,17877 -70527,77168,35752 -74229,34735,33462 -90067,82557,76853 -24472,47475,5789 -33669,84848,31096 -99008,47931,80792 -35028,37251,66246 -91743,14312,48414 -50456,18764,20102 -92576,36976,88684 -69341,84968,60432 -45576,58907,58240 -39931,5153,21603 -59648,98603,47109 -69689,59695,53475 -21397,51003,35263 -16441,91456,25256 -77545,95209,57368 -52314,53248,71775 -29646,20210,27412 -75484,27781,55025 -93626,7439,81898 -75820,78773,26176 -29572,40252,16137 -73749,38852,76768 -54913,22959,2008 -38918,43540,38659 -63895,14206,21558 -39549,83596,5315 -90015,38967,79682 -98057,39297,15666