diff options
author | tomsmeding <tom.smeding@gmail.com> | 2018-12-23 23:44:22 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2018-12-23 23:44:22 +0100 |
commit | 5e48424b6456b49d3a37fd75040ccf7ea5f9b31c (patch) | |
tree | 94859d0d7f20dab52c4c7fc1cd20c22f3a81a0fd | |
parent | 25a0973c66ad916029a277e57c506cf39cfde096 (diff) |
Day 23
This isn't fun anymore. Because I was tired of this one and didn't care
anymore, I looked at what others did and was baffled to see that there
were basically two groups of people: one that used Z3 or an ILP solver,
and one that wrote a direct solution that only worked on their own
input, by accident.
So I also used Z3. It worked. It takes a minute, though.
-rw-r--r-- | 2018/23_draw.html | 1050 | ||||
-rw-r--r-- | 2018/Cargo.lock | 150 | ||||
-rw-r--r-- | 2018/Cargo.toml | 1 | ||||
-rw-r--r-- | 2018/input/23.txt | 1000 | ||||
-rw-r--r-- | 2018/src/day23.rs | 492 | ||||
-rw-r--r-- | 2018/src/main.rs | 4 |
6 files changed, 2696 insertions, 1 deletions
diff --git a/2018/23_draw.html b/2018/23_draw.html new file mode 100644 index 0000000..a4335dc --- /dev/null +++ b/2018/23_draw.html @@ -0,0 +1,1050 @@ +<!doctype html> +<html> +<head> +<meta charset="utf-8"> +<script> +const bots = [ + [[136613456,-512820,-739737],87427481], + [[-53697593,55277802,49040699],86116187], + [[3220880,75515511,53337027],50746552], + [[88414078,70781701,66277674],98943677], + [[-17988814,83735639,57607927],84446784], + [[7905695,86080636,69893638],73183217], + [[-106237978,86340882,82036549],85944614], + [[-39951484,51796765,70217077],87079969], + [[-41339171,48697955,55193194],73297553], + [[-42571382,53083825,53317409],74087026], + [[-7368751,52027496,-9560976],95138965], + [[-8239116,41812660,62596194],54485758], + [[-1137951,49037154,75388024],52951810], + [[7650881,79141366,92778865],89383763], + [[-17148778,67167319,69069673],78500152], + [[-34682895,65463074,55433727],80694128], + [[92864435,72243385,52889446],91467469], + [[23342790,57278342,66486606],96631618], + [[16097469,22492567,11010000],76930041], + [[-27239715,74048890,47983162],79486831], + [[48014242,79716366,40015768],62251861], + [[511676,64398402,63621216],52622716], + [[-29486239,66238746,61923874],82763569], + [[92097957,57353083,58524935],81446016], + [[-2615864,64900611,68273820],60905066], + [[17304995,87864295,58127670],53801410], + [[36460810,70793722,116450849],97175553], + [[91303570,59210855,59663955],83648530], + [[17400055,51714900,106525287],65954578], + [[-9201950,68270611,75924360],78511311], + [[10184185,63093052,93307967],71331241], + [[24739666,43259195,5573675],52957566], + [[-18267592,52724555,76111483],72218039], + [[-35598801,54737022,27433735],89083529], + [[35813819,73515444,94558754],77358361], + [[6642272,22056475,91067625],87832335], + [[17645774,89603262,67321149],64393217], + [[-10216980,27634811,38770566],70341591], + [[12799318,81249393,71992414],65556938], + [[-10218046,74437078,62070349],71839923], + [[-1309123,20674953,59788059],65885225], + [[-27217791,66526827,53078642],71937695], + [[-34737368,44315647,75994929],91879642], + [[30808903,39024070,99557972],65161437], + [[18233335,72395211,90831029],70107346], + [[37186749,-678419,57742780],69426693], + [[-9615179,80576697,64086230],79392664], + [[33935621,102484176,52277559],62167524], + [[21730454,116532754,59523052],79439730], + [[-44299553,51849314,52674431],73937932], + [[98820726,52369354,56304096],80964285], + [[-14670863,53307196,63286058],56378495], + [[21141579,52692533,60648771],77839132], + [[106030705,57863782,38674931],99756568], + [[3660762,56362269,113500773],91316727], + [[-407093,36114871,62900059],52655349], + [[17300250,90851621,82759279],81425029], + [[3552610,79637006,46529196],55736575], + [[19340107,84837235,62352207],52963786], + [[8521013,89819722,24371259],83109002], + [[14563407,28673587,78383971],60610219], + [[105274857,48490223,59505360],90108685], + [[6522669,68013196,92958454],79563377], + [[61441811,62255240,63607848],60775173], + [[-30662880,72201886,57781685],85760834], + [[-5704121,74191612,91679671],96690023], + [[22440794,115302243,29587291],89455675], + [[16846226,85850758,26219592],68966703], + [[-11181912,74609397,43701422],68271328], + [[112019147,48094141,55257089],93000920], + [[-58029664,63702221,52791218],99637517], + [[56546279,54927537,104557578],89501416], + [[13690470,51265122,54792423],53548975], + [[-20863525,78114651,44421611],80738144], + [[20071309,136046599,55636529],96726219], + [[-9825817,54458897,71973514],61373140], + [[-13643977,45813902,94182312],87475383], + [[4214048,57552549,55230473],97407755], + [[-44465852,38322072,54656647],86263523], + [[-8532222,52266115,71351598],57264679], + [[15789835,78397136,91588786],79310551], + [[87644233,71738261,52393733],85246435], + [[24700943,90988926,103171122],94573621], + [[-16261249,63121025,87229161],91725871], + [[-52294570,67135761,48053370],97558456], + [[18918374,81332072,97803514],85331838], + [[11760283,82388891,26779326],70030661], + [[19928626,82449711,96833465],84469124], + [[-18348975,19999142,52648068],76460901], + [[-12075601,71251550,85024678],93466308], + [[80062151,62500897,78775775],94808908], + [[12337661,103647294,81418622],97842757], + [[-11115387,60112851,66531714],62874491], + [[16906477,63764749,85558216],57530991], + [[-4672303,54855285,1301903],84407059], + [[-37982464,58456898,68225299],89779132], + [[-17681001,71939994,60038525],74774035], + [[-11837172,58467855,79274314],74693725], + [[29729949,7390010,64977794],61136429], + [[-12679395,87224461,58161931],83180457], + [[-11559100,72144044,77817800],86635361], + [[-2084469,25684278,55681143],57544326], + [[20590016,129914590,49426051],86080032], + [[-7571416,69794846,69085384],71566033], + [[-34145880,48469543,51820255],62959690], + [[-8692081,31985652,52581756],54751347], + [[-24455978,69065733,52902609],71539034], + [[-2667941,59922398,71227376],58932198], + [[-38020475,72881338,61644325],97660532], + [[-21527600,53755812,51653194],52050984], + [[-8830611,33006975,78898650],80185902], + [[19025250,113913931,63618165],83621311], + [[8387089,77230233,57248610],51206312], + [[9535513,118434510,37136580],97943806], + [[78992433,58822717,31347868],81004338], + [[-16906193,77442482,52709412],72172536], + [[22311017,63448797,51701106],94242941], + [[43179406,2818296,30763106],84483777], + [[-363630,57933199,98730777],82142085], + [[-3421442,71654138,81584493],81774527], + [[105294101,47765605,48049117],84365008], + [[-14236037,92920841,48040781],85297524], + [[5696945,87936599,71179435],78533668], + [[70714071,41126802,64803849],68209814], + [[-18725349,54598292,52699640],51138183], + [[59897823,71653281,71202033],76223304], + [[48123775,102241419,73882598],97717918], + [[-27257912,59427348,52360090],64159728], + [[7347141,78617861,96938400],93323519], + [[98970812,42594863,66538549],96733304], + [[60136017,76634280,74781184],85021510], + [[-38514792,65847495,52025409],81502116], + [[-5508508,4887248,43864104],83287138], + [[21727987,54693625,95057154],53137390], + [[-15479704,40894383,53779209],53827666], + [[-50001012,42594012,56389944],89260340], + [[-49970116,64164073,53317682],92566258], + [[-56357341,55323528,59446041],96241383], + [[625968,53683329,98614903],76786891], + [[21482773,117944535,70699492],92275780], + [[16203712,73330825,69917915],52159463], + [[13906226,70337776,30608175],52004893], + [[-21655059,68530571,79036384],94336614], + [[-6379112,70074314,96974691],98542673], + [[37257281,88232345,55974220],54934223], + [[-153042,61570334,64745296],51583144], + [[75744358,74770786,74235757],98220949], + [[2593526,12576425,76209878],86502916], + [[-3213601,79186838,80823018],88337919], + [[-9431288,52885294,66308318],53739421], + [[39457172,77981561,77781961],68690851], + [[3658726,45027232,78570696],55347772], + [[19540854,59560050,33221913],66437344], + [[-23991955,53819675,65495637],68421679], + [[-15925338,62003166,71681923],74724861], + [[179979,95055064,72345095],92334745], + [[32084825,113714994,57462206],76732047], + [[-79456713,-30995940,73253681],71108738], + [[-5085269,56556449,63274512],50030649], + [[-1823099,53617693,74353439],54908645], + [[-21582671,87360226,64824893],98882268], + [[-54047120,52572271,45012396],87788501], + [[-621964,40254302,67623764],53454465], + [[10705962,52178757,-10564055],78218262], + [[-27052117,72974854,68996532],94137885], + [[-5333720,61326896,75858050],67633053], + [[-442860,-7927774,60719749],94553540], + [[20190232,59561903,101548027],66034633], + [[-7907411,40629427,68521654],61262635], + [[-9455107,66611005,94728621],95909233], + [[22122168,62372400,119686289],85051023], + [[-16418814,91187751,60788730],93509810], + [[-12210203,71963130,19080036],91275101], + [[-16069946,54585553,55218935],50988886], + [[73589783,36919962,51760461],62248915], + [[10988236,47525791,7585386],60430836], + [[10516253,63819008,75162627],53580091], + [[54978561,77777004,81843099],88068740], + [[843965,59034530,26718598],57653476], + [[8390445,51933284,106893232],75550828], + [[55468357,41898786,6292104],82163240], + [[-15657432,59791539,54996025],55559386], + [[21925705,56064114,98432334],57685472], + [[2045205,54926092,91406478],69401804], + [[18964578,82009106,68170256],56329266], + [[-5020873,58135455,83138917],71409692], + [[11206282,18758794,90297569],85795593], + [[60429823,65420118,62455940],61775922], + [[-50071054,65142864,56916609],97245137], + [[37522973,119514287,68154460],98661779], + [[-24546116,79951244,52341069],81952965], + [[-42895143,51426102,49103721],71398899], + [[19847811,70965352,88276453],64508398], + [[31969885,74676586,119451667],99568484], + [[43133639,79493715,70091589],66189023], + [[3536597,70013464,59700142],51291540], + [[-43456481,62212963,55178319],85962366], + [[66908155,61377553,55147564],56903339], + [[-6338837,64186892,67392177],63032325], + [[24582754,12428156,39119902],50399652], + [[19622738,107750729,55849974],69092525], + [[-50422280,58990076,62168244],96695006], + [[58134510,61311825,96239969],89156504], + [[-30966037,57564421,54587595],68232489], + [[12569803,83417760,58547639],54510046], + [[16028817,91085624,85099394],85270691], + [[26948233,79274928,118354187],98047375], + [[-52310680,47522666,64367435],94618457], + [[-6416427,79465208,59490450],70486528], + [[20092186,68488461,91337971],64848774], + [[-15142198,42300705,54605738],52910257], + [[-27837357,69166421,45527549],77657747], + [[-40369484,73666973,51836487],90987378], + [[85019354,56875805,38052709],78379725], + [[-4826865,73385493,74154124],77481047], + [[-44327050,62980445,57928726],90350601], + [[2268051,71674062,18320627],77266756], + [[7560942,23918555,95582539],89566155], + [[-40522661,58387981,55190926],79216025], + [[17493703,92481489,21602524],79566649], + [[-549853,30548349,59679581],55144150], + [[-11540623,61439486,75747954],73842446], + [[-27425143,66943956,51613022],71096670], + [[7492358,52336684,59482404],62591245], + [[8199261,52115157,61979910],52924169], + [[-5227038,75473558,53223397],59038494], + [[69304179,60217316,90678830],93670829], + [[-27825322,58595174,52943775],64478650], + [[-3930520,44822324,83076659],67647944], + [[-15669371,56863526,61131713],58778995], + [[28136546,52898534,69587237],88623606], + [[-65393666,51826191,55613912],97948204], + [[-15477551,51180735,42248775],50591359], + [[40449375,72513414,96662908],83095857], + [[-33924420,53998875,71917916],84955612], + [[10793863,52565615,51767299],98060212], + [[9995273,60527127,91707845],67354108], + [[-60284471,51756689,57993530],95149079], + [[18376558,10452573,62217674],58851640], + [[6437033,60403963,76732508],55814249], + [[-28335460,51550727,67141191],72141764], + [[-20795148,56783730,53199338],55892601], + [[12754662,84841524,53799805],51001164], + [[9355656,37410878,81929957],60626411], + [[70162685,52698231,62479018],58810202], + [[3593617,1103985,61329203],82094839], + [[-11110833,76403444,81998629],94627295], + [[-2911501,68332204,55930359],52288511], + [[-5611352,24754525,54946306],61266149], + [[8852382,71155727,68890982],56308709], + [[61447488,68409236,69588689],72915436], + [[7800512,89666253,65758055],72738393], + [[10592995,54945607,58732681],89051922], + [[42798128,-12649279,56562836],85829241], + [[11562554,75630041,86875504],76057543], + [[77961659,71510466,54153352],77095503], + [[31055259,54921299,-9869494],70383159], + [[-27501669,62023219,47541351],68164946], + [[42374475,68761335,72601978],57207824], + [[-33321254,51983321,59677321],70096300], + [[24068578,39736961,60654009],88299248], + [[-19116561,56737201,34200348],67834972], + [[22969648,52249055,100644454],55038258], + [[-42911185,51860830,61376355],81262991], + [[-42633368,44611772,66190367],89674954], + [[-3829240,75255688,21232601],84033808], + [[5934856,57988042,76585113],53752725], + [[-32964350,68530123,57108410],83717261], + [[43876005,92164898,87846839],97357843], + [[-2417792,58943300,65531206],52006718], + [[54964722,89070986,53056518],70562253], + [[-290623,31446470,65443341],59750487], + [[7639935,101059316,58888687],77422498], + [[-28253746,62612782,71235848],87217278], + [[-7422094,56693858,109005575],98235920], + [[61189820,88854622,44952918],79628549], + [[-16010449,60503569,67814188],69442584], + [[31995549,99041054,92811203],97317853], + [[14407890,68606212,88656048],67968926], + [[3797019,93897803,59385476],74600640], + [[89982687,70799922,58816742],93069386], + [[-47391381,58920806,47022977],85470601], + [[-18682541,52396968,60465510],56659507], + [[-33603071,56312429,61658802],76688781], + [[-1966320,58483882,29754668],56877265], + [[-6876331,35253483,65966223],63052064], + [[-39772638,75789985,47508955],94235051], + [[-24980812,-1938691,-46278539],50540858], + [[-14975005,78724644,39316097],80565111], + [[-2885944,65589513,76516656],70106553], + [[3541691,72547980,70693895],64814600], + [[-44510906,63214333,63320805],96160422], + [[185135951,79371810,69897884],92278734], + [[-15712941,69417771,56680209],66925482], + [[3371300,64063926,70577995],56385028], + [[20093270,89812250,83966344],78799702], + [[-44882626,56482809,44012736],83534067], + [[7807097,59338218,93406346],70052015], + [[83206185,54254511,65285920],76216650], + [[-9128452,31764042,52408460],55235957], + [[9273140,58063106,84328894],58233459], + [[12730173,65723179,86216535],64323934], + [[-5370160,21333035,52408548],61908782], + [[-50412106,36708544,57003999],96170823], + [[-12428116,56614507,59912876],54070441], + [[23530187,55890018,101558624],59032841], + [[24076853,75872593,84021081],60931262], + [[66742911,53159306,102755650],96128101], + [[52985633,69568131,100732548],96756344], + [[21276856,95454549,27263024],73096105], + [[18634979,90055348,78648309],75183223], + [[59296178,97443382,58785611],88995359], + [[-9151924,60937196,63129967],58333507], + [[-131439802,11932397,63801725],91099003], + [[-15182359,51945676,96531706],88774362], + [[37456150,58413739,90785927],60125884], + [[55535275,58675694,68529536],56210588], + [[-23901453,82911425,51765843],83693104], + [[20400242,84135488,38426476],51490217], + [[86127079,53137259,73699744],86434146], + [[-37504970,65330192,58356041],86305590], + [[-36229876,54144877,76073195],91562525], + [[7122807,47260000,60037998],92003347], + [[14241003,60321844,84135837],55331088], + [[-58054472,54730510,42664262],96302105], + [[11128985,-3179856,61388093],78901954], + [[-86171724,81676146,128118766],65629454], + [[-32477909,54111811,66095298],77799414], + [[16473884,29685000,94881174],74185298], + [[-39673388,54367240,60656362],79811579], + [[-36820899,56003364,51780853],69719509], + [[33393407,80286458,76512600],63663115], + [[18145724,41961673,52085548],82246846], + [[773269,56344730,109740475],90426345], + [[23227623,20924988,89657454],70967862], + [[29769636,51258040,101968164],56466105], + [[-3255302,91302711,53052997],72725506], + [[63288029,31756890,15053302],91363738], + [[-696254,82267064,54884033],62961850], + [[24224162,74018463,80725407],55634090], + [[-31583375,35116342,57915541],79845595], + [[-20265647,61458300,53421504],60260040], + [[-3625510,70617596,85973701],85331222], + [[38592662,72038274,107230244],91331550], + [[20947230,95753333,5848876],95138602], + [[65256974,42508621,53997591],50564655], + [[56144525,-47809394,138757109],88873477], + [[12536114,44878759,53725314],86437546], + [[-20301103,44075250,52762962],54451813], + [[-461902,80465125,84487814],90529307], + [[7130680,32413231,68883794],54802893], + [[-50296082,60195477,45850842],90822087], + [[-14564832,72623628,17948114],95421720], + [[-22686155,63096629,54372268],65269532], + [[69844001,61172133,56055801],60541966], + [[-52847704,61819166,58790940],98572688], + [[14547281,53614270,69916715],64925594], + [[11858628,69801510,83476504],66533825], + [[-19237228,57038668,55663966],57054287], + [[-2272553,98539746,62554872],88481774], + [[-8556006,44686979,74145414],63477536], + [[2504323,61605769,51711818],54478689], + [[47588454,79992799,94986516],96037851], + [[103658947,51685093,57082700],85896762], + [[-30259191,60236324,60596487],76206463], + [[-16899083,75972745,75204218],93190621], + [[-16138352,72149890,57424797],70827421], + [[-32022269,39108198,51836967],70214052], + [[-253386,60377315,87086253],72831391], + [[70319029,58272431,24333949],78795019], + [[98140448,55305455,54099422],81015347], + [[-9894221,46215061,90692267],79835086], + [[8135694,75227546,75981649],68187909], + [[3050471,53586527,55188089],52075619], + [[1872493,96006217,77781926],97030112], + [[33059309,107988331,79210607],93728745], + [[16673776,69427534,108363123],86231293], + [[-55714690,52582577,37933926],96544709], + [[593835,83505567,68365123],76391300], + [[43486018,76414497,67060559],60431122], + [[-103710,79781165,51942827],56942322], + [[10133283,63186363,55221028],90994744], + [[23438290,54031653,67704842],75155252], + [[-67769695,52775484,52431198],98090761], + [[-18104986,52809731,54267642],50296769], + [[109991188,53156356,60594209],97211931], + [[-13768977,54140486,59831889],52855852], + [[-12489665,47714331,86555741],76794067], + [[-26482316,33973790,58911081],76882915], + [[-160197435,53199007,15047334],72701562], + [[23358129,69976926,85439610],57172786], + [[24201045,82557215,112270801],95741523], + [[72394082,20781518,37930394],88568308], + [[45145254,31095571,82460069],70328402], + [[-24815015,78740100,66702713],95372303], + [[-11180118,63194518,51850772],51339974], + [[-30260369,77069699,58001879],90446543], + [[12841613,54905801,60405944],69102701], + [[69379484,75759864,80677420],99286807], + [[-19898305,56022498,52114906],53150117], + [[23972174,63400531,63593334],88610729], + [[-7853869,55653210,30754191],58934358], + [[40004815,92174613,37712106],69004511], + [[-18970401,64246847,57001969],65333603], + [[-55945729,46641309,41200961],94633445], + [[10448314,60832634,-13979245],90545188], + [[104420953,54797004,51761342],84449325], + [[-7833268,56419777,64966118],54333552], + [[-41600051,53218447,75060610],94993621], + [[-23285697,51988784,62294935],62683806], + [[-6906170,52717101,66490995],51228649], + [[-36994277,58578684,69447528],90134897], + [[13894089,90601100,71559173],73380713], + [[5549488,90598003,63587583],73750520], + [[27986859,65318406,569711],67272566], + [[11420671,52635330,54320974],70384136], + [[58986016,64249155,26039401],71732796], + [[5530635,65978466,18218016],68411191], + [[-5385393,46216210,79409449],64041818], + [[-21799629,90568144,46789063],91760239], + [[-36265254,58098351,59809891],79287875], + [[-85146141,88950855,-3714880],50044292], + [[38619326,-4038243,77668519],94144770], + [[2694518,54614333,-4908892],83010409], + [[5313262,51345161,59838196],72136128], + [[14843630,-1349878,43928227],69108117], + [[22464636,120847792,40757992],83806553], + [[-9865777,51214858,90863194],77058488], + [[19167267,52510615,54852693],90699829], + [[14593457,70653650,97885859],79060557], + [[-8818822,61716404,18373136],78343826], + [[1060,70746123,74820827],70680268], + [[2440131,63910700,77731744],64316854], + [[9446148,94030616,72483361],82182217], + [[99080786,67236493,59091021],98878926], + [[-1302538,90260423,63215145],79892689], + [[8394619,77120518,104185074],98025497], + [[8809237,89970368,88703357],94978937], + [[61696969,53031317,25103817],64161515], + [[-17945953,52730115,54562544],50352996], + [[5573049,75894102,57995185],53430728], + [[1734159,18182439,88390315],93936719], + [[16427148,60790813,57255534],77938471], + [[-5794985,58712237,72538823],62160526], + [[114104963,48165299,48341508],92483804], + [[66162561,63632542,48965213],55367138], + [[-10848319,68498736,72425408],76886851], + [[35960404,57952302,83825949],51208802], + [[-7537899,63784540,26119781],71384092], + [[7597577,78226192,54364713],50108075], + [[-4944468,85203935,56866419],72129314], + [[-31664056,74767063,66581879],98127721], + [[-30554637,64050408,69381798],89101226], + [[15180605,89452073,84996875],84382933], + [[24727280,106040899,27094989],80399998], + [[-32937600,57802552,41091533],75830264], + [[-24285878,55135192,45900921],59701557], + [[99942558,60451396,53076615],86940865], + [[-8142431,63656427,70896708],67810159], + [[19572931,72289003,88954380],66784918], + [[17178080,32326459,98036814],73995977], + [[-40327597,60321955,30752519],96078407], + [[-26708621,51303087,68660841],71786962], + [[5298440,71150886,98998933],89965866], + [[-26727384,52712004,60606804],65160630], + [[-42515019,36860711,54621755],85739222], + [[-19692936,52880476,53505130],51192967], + [[-2862751,72059619,56687442],56724369], + [[23309701,73678498,90297260],65780546], + [[103591531,51292218,54785000],83139488], + [[13334478,40067215,41788503],53285143], + [[-19529026,52222981,57621425],54488069], + [[-1797950,83874608,63370131],74157238], + [[-25984963,45705100,63968004],69711376], + [[-24664085,26439550,59809899],83497673], + [[19736100,80301464,65388701],51068468], + [[-25320635,61777368,77622402],89834801], + [[-17286284,77658389,79260938],99320666], + [[70330963,53068965,53858287],50728428], + [[-3076230,90554067,55114683],73859363], + [[-20974395,51855715,72542126],70486673], + [[1092644,-4119326,69709754],98199427], + [[15938133,59416689,58855448],92943839], + [[-9112976,52910350,69896190],57034132], + [[52773451,30360939,79247967],75479113], + [[-6680030,26114817,19182073],87913270], + [[1482965,86244061,74533437],84409063], + [[24689402,71291292,83726812],55443483], + [[30350862,66160075,106804338],76785312], + [[-4063590,84853935,56872509],70904417], + [[5856723,68860058,67443259],55561024], + [[-7092718,83599936,62097932],77904977], + [[-10322894,95735574,63377690],94550544], + [[19921997,12113475,95509859],88937502], + [[11534894,57463560,99207505],70250571], + [[12352413,63309310,95136075],71207369], + [[41175395,95875663,40694251],70893868], + [[59891986,74136560,19271752],89293819], + [[-23086309,46188709,61304958],63666046], + [[-35534522,46755845,63454442],77696176], + [[-17431848,55911646,61066276],59524206], + [[19833014,98941413,53373702],57596603], + [[-28451505,62393147,51769902],67729137], + [[8178175,-29195966,48404389],99143478], + [[-10800811,66052879,72255412],74223622], + [[7592515,82345414,73497606],73364887], + [[18762382,82447623,97073423],85873084], + [[-10487671,31987978,73584470],77547158], + [[-9056504,62925961,53357292],50454349], + [[27999580,85878361,92076324],79424309], + [[51800702,30641723,78124579],73102228], + [[12642813,82894579,64946494],60312761], + [[-61807304,47686811,53275056],92858540], + [[-7276796,60434304,88907028],81732530], + [[-29599217,39708375,83129734],98483597], + [[-23520152,26844092,62214412],84353826], + [[-28877325,61946397,69770777],85708879], + [[-14608106,72848679,65361364],77932548], + [[-36824990,70391000,43020520],90376960], + [[44969927,68147155,35692982],51961138], + [[19011433,65149442,-12540316],84859740], + [[18764314,69338844,96926694],72615606], + [[-25391985,54173991,76565456],81246468], + [[-37132499,58605126,57299821],78151951], + [[317469,47901411,90999015],68243137], + [[4732566,82416141,64829451],67627448], + [[-4438337,64068128,59428063],53049034], + [[-7510390,65454288,58686238],56765295], + [[13297331,71022908,83309651],66149656], + [[-2443890,-1053307,49146976],80880201], + [[18424959,-25894837,57469563],90402436], + [[19134835,37687041,81457411],50098606], + [[30727267,74338302,16287433],63315163], + [[76426391,60025595,56674928],66597034], + [[-37764165,64665026,63738632],91282254], + [[73841307,45244034,7979885],95503095], + [[8518776,102619990,65620373],84836052], + [[33279437,-14820526,57737587],79656722], + [[-12641079,64685181,53396171],55837091], + [[-9951596,57691018,18966738],74857701], + [[11705830,39289792,103172595],77639987], + [[32755328,86575935,59301361],52102968], + [[-56381974,51244757,51903260],84644396], + [[10573573,67254309,71343991],53139256], + [[23178882,99249505,53062798],54247805], + [[-30438220,43249726,63852895],76504484], + [[-18008082,91354098,61662797],96139463], + [[58130621,-5410250,53763204],91122775], + [[38376500,5309795,68536851],75422199], + [[40568207,55819371,111949414],81807094], + [[13385608,58751181,87916220],58396316], + [[10652780,62923714,16913699],61538816], + [[66584605,90471059,59953467],90479328], + [[23828597,9229466,82674549],75079685], + [[-2374305,51653149,81806283],60948119], + [[15686944,101308548,58364945],69100929], + [[12725742,68880644,106967805],88237088], + [[17716933,53898766,92455242],53751453], + [[-33372359,56824192,52416697],67727660], + [[4982549,62244620,102018278],84394819], + [[9097870,2277106,23511783],91643276], + [[104095420,52061506,57103657],86730620], + [[38111501,86440374,53482963],51504912], + [[58344818,61400907,63284974],56500739], + [[16884807,19231253,82990003],72336956], + [[-42692945,65946169,41961384],92859217], + [[-28034754,55487947,62126726],70763811], + [[19274376,79870506,35147693],51629912], + [[21320145,55312624,92060702],51167634], + [[-36291008,37650308,58389536],82493243], + [[-10796796,41489105,66097601],60868304], + [[-40177150,63607920,46375716],83590789], + [[16877383,57508433,130889109],96634562], + [[78035795,47558838,61699900],65995510], + [[-12157529,59079739,94459705],90811614], + [[-14719298,67293961,58776388],65904037], + [[23165472,48319134,141014934],94993386], + [[14483307,55545491,83869510],50046127], + [[-13975465,72281297,75555056],86926409], + [[54944081,54012748,104500519],86928029], + [[15118634,63975046,120649575],94620419], + [[18002868,89743987,46547787],51375023], + [[118470960,53314916,47200144],99123142], + [[-18823495,55420905,53701803],53060582], + [[-5467064,58554591,77050896],66186932], + [[22160794,74878846,55706389],70447601], + [[-27826743,71164171,56998262],81103878], + [[-60219520,57279767,54018988],96632668], + [[11765030,64865953,25690628],53591753], + [[-77604253,51195582,160265663],82321239], + [[8895376,94389845,70206097],80814976], + [[72068955,61735419,61931626],69206024], + [[71294850,57747925,61258998],63771982], + [[-12500311,87983348,41185110],85480069], + [[13165281,58734390,57751380],71578498], + [[-16519504,56287098,41988135],57000006], + [[15702065,59567300,125776377],94756321], + [[104067037,56353806,59893063],93783989], + [[-2443051,34066815,59811244],53650485], + [[78659016,53301646,58395591],63826456], + [[-5395135,51489915,53108186],54457449], + [[43783348,70786755,68608325],56648600], + [[15861882,75526752,70870247],55649551], + [[-21433110,60201366,71144216],77893311], + [[16927373,30534856,57344675],79447115], + [[-23582240,51182170,53671182],53550212], + [[48377124,87322307,57807776],66977272], + [[-24658235,34774969,55408108],70754558], + [[-57025118,51608427,56368656],90116625], + [[-40956808,54872377,58233637],79177201], + [[-7940696,64406847,65491844],62954392], + [[18514021,116278681,67137430],90016641], + [[43358506,27845033,68486380],57818557], + [[1110894,83500413,68255453],75759354], + [[-37948234,63772147,53141588],79976703], + [[13559648,85475298,69747661],66777842], + [[52847535,100951259,70145575],97414722], + [[-21363508,51195381,52333138],50006604], + [[42775136,24331657,88882389],81144757], + [[-1933203,45916056,85330850],66811316], + [[-57987412,55995732,52031150],91128682], + [[-42000373,57698338,58535687],83348916], + [[-22415966,68748566,55301911],71580898], + [[63130941,60546452,58913823],56061251], + [[-25360,94955513,32263639],88899014], + [[16041791,46748455,54886958],52853925], + [[21841806,63659499,51701479],64043047], + [[1507336,30781882,86426870],79600758], + [[-61462214,51930278,59048201],97555074], + [[5596619,62910768,103402603],85831362], + [[-17947167,60351558,52786859],56199984], + [[8310608,110445624,30715607],97601075], + [[57809969,62546762,83913036],77739845], + [[-4243002,78023652,59272973],66654140], + [[-38346139,46279251,81595137],99125137], + [[-39505659,59077659,30772250],93992534], + [[70748692,61615798,69299886],75134429], + [[-8927983,72196971,41805506],65500828], + [[18230519,71253951,55091105],51783470], + [[-82741,89299947,70860177],85357733], + [[19408526,70959236,391121],77341247], + [[-118838868,96481794,83622656],81565538], + [[7699857,77112966,58676603],53204091], + [[-5285832,98989634,54909145],84299424], + [[-9949091,79675756,62952022],77691300], + [[6548040,71704033,79332787],69603175], + [[41519552,70838659,77663756],63492002], + [[24672816,51183711,105057962],56683540], + [[26979282,57437475,67725517],91990453], + [[-146316585,60113902,86014018],74912650], + [[72430683,58332575,69349806],73583276], + [[20029551,67957881,114673401],87716194], + [[-12896053,72374875,79141839],89527418], + [[10238771,77142540,70645372],62663967], + [[-3216297,27169332,60070123],61580077], + [[-23930209,54633761,66648944],70327317], + [[-18679703,21196655,30842395],93170631], + [[44655563,9533925,46538296],63469153], + [[-59378193,54454082,43217955],96795689], + [[24496603,92577304,64368811],57563942], + [[-27053938,59501992,52024839],63695171], + [[-9529140,74055507,52153025],60852050], + [[44555529,104038871,53349626],75414106], + [[-14679818,88223002,52168606],80185804], + [[4552719,62659754,92650998],75872423], + [[-19881238,63944538,24064643],85942719], + [[16076790,55601668,101552666],66191930], + [[21912528,118540961,52911368],74654179], + [[-42123089,64929314,59158052],91325104], + [[10936357,81890391,20134023],77001665], + [[10351597,9179596,62138956],68070751], + [[92774311,53165517,56634384],76044462], + [[14950682,78188149,16646479],72772458], + [[-36369450,41148166,38468120],83283873], + [[78960321,78942802,53919616],85293057], + [[-158664912,45952974,29905855],62185933], + [[114294274,47756105,53682861],94039744], + [[20046552,73002532,57617045],54110780], + [[-29832468,53561561,86264939],94773352], + [[5152614,124285693,53684633],97932108], + [[31373573,67528454,85096814],57468866], + [[-34521748,54572314,66408185],80616625], + [[21670677,109269914,16882176],96898951], + [[-13862893,59818682,65331199],64127296], + [[17318835,71965542,106868073],86629159], + [[78142676,48758577,56205332],59408131], + [[-23340878,51182474,58635784],58273523], + [[-26740311,87129579,52453722],91438117], + [[4303903,69818029,63437040],54065753], + [[3266332,71031490,81452081],74331764], + [[13702746,18039813,44354215],50433215], + [[-3482754,38377262,76574157],67142882], + [[-9228255,63064015,42837554],55636176], + [[-50838633,55818579,60038300],91809905], + [[12044855,110909031,26804479],98241104], + [[3069579,54401690,81614434],58061261], + [[-55632341,51473141,61974878],94194739], + [[47405039,61876630,72051227],54803065], + [[-54699622,62927561,51595043],94336968], + [[-5193725,62373908,96721874],89403908], + [[39277912,51487063,98292773],62527889], + [[28453914,55902735,104745928],62572701], + [[70028230,51756434,45557821],50764114], + [[6794251,79565242,72837497],70723039], + [[-13346572,55208620,19942682],74793897], + [[-26551619,52981805,64542889],69190740], + [[-43505598,52177986,74471561],95270055], + [[-36730243,57166097,70373519],89384321], + [[67837280,44038045,5154880],93530016], + [[24819569,59550660,112300422],72145934], + [[22889616,60439671,109383201],72047709], + [[16010141,59272902,95102320],63479459], + [[45785695,3672162,40921594],76077574], + [[52634264,230093674,55591446],92328001], + [[-1093816,65699672,61755421],53663391], + [[-2927319,46551949,115336543],97175126], + [[9846871,97494787,27660769],86168853], + [[14575046,54156478,106441784],71137652], + [[3693372,64829888,65085318],51336253], + [[-14475986,58191102,40490687],58358086], + [[-32625219,54193671,54687567],66620839], + [[19841368,112790310,53953991],72017337], + [[-36529548,56646542,73106232],91396775], + [[21383461,52564742,65263630],69168248], + [[-25544951,69296904,55993281],75949615], + [[5520910,41049609,87926413],66818890], + [[78361286,55145660,70961730],77938767], + [[-12502650,52118530,26315830],64486867], + [[-8502681,43100643,60553969],51419015], + [[30788480,91079544,72453023],67791399], + [[-41582270,52471539,51548548],70716745], + [[22495328,56368486,39214022],54868649], + [[629350,38620684,-5628651],92908951], + [[54092772,69401105,92313004],89276951], + [[-5909105,43864786,12211016],76363299], + [[3912827,52322153,79041627],52565376], + [[-58023857,53967358,52040730],89146355], + [[-31872996,52197859,61603944],70789344], + [[15997340,97237977,68995404],75350443], + [[-47277488,55104503,30071304],98492088], + [[-8126606,68416175,57612004],59269187], + [[-41526057,70666640,40848412],97525664], + [[73462661,56792015,64535899],68260624], + [[17561494,61650408,18024697],52245702], + [[18999409,83239866,79157013],68511878], + [[-17147426,82949543,58049486],83260838], + [[-18999109,63366752,88314976],95795304], + [[22782196,90426553,59952512],52711323], + [[3870299,63602471,24263373],61650297], + [[-28961118,57302888,47585264],64860112], + [[-54015783,52509914,54351945],85992387], + [[-31431674,55933418,55746724],68226308], + [[6227367,990142,64669121],82914608], + [[5035135,38115972,99202791],81514672], + [[-33418983,63482456,38640418],84442392], + [[-10795967,62940846,61879242],60730704], + [[109337482,53196724,58133710],94138173], + [[24242369,44107239,101663495],58776882], + [[13836970,62942011,18092686],57193751], + [[22307447,72298904,83902781],59008632], + [[61542152,47395133,73538238],61503948], + [[-24075040,59046188,54656470],62892239], + [[2709891,16928362,83441813],89266699], + [[18108186,51788474,56989142],80851857], + [[8783157,59841041,97619446],73792049], + [[-11464337,-1808695,45620039],94183197], + [[-27362762,61729073,63812346],78018926], + [[-16479685,60701430,70404170],72700118], + [[18072359,95490781,46478814],57121005], + [[22305099,61060570,52457431],91124722], + [[-3144103,35052829,41802786],52818565], + [[14700849,76137475,4759707],82858288], + [[24087216,72433922,86093140],59554341], + [[78515636,57323047,62505044],71813766], + [[-24840821,74681746,64511653],89148740], + [[-23826296,65180883,55787778],69909354], + [[75346962,35126022,80923207],94962783], + [[17008079,55328336,57579351],53041203], + [[-7356211,68676554,73449531],74596693], + [[-17162496,73932992,66248811],82458915], + [[-136511398,24674918,81631631],52044146], + [[17677665,60697644,59711178],87163127], + [[-23195799,53013298,81013306],82336819], + [[-11747126,98444482,59328815],94634945], + [[5844912,56397886,77450074],53117462], + [[-34509639,55837799,78666373],94128480], + [[5904302,91792190,56962332],67964633], + [[-17032381,59374519,60271759],61793041], + [[126401,73284278,37689172],61650102], + [[13058035,58217638,117787893],88061922], + [[13828494,55793337,5715352],62430875], + [[-38076711,68063369,58208411],89462874], + [[11310783,64077677,47800713],90266880], + [[71295692,59864191,53931657],58561571], + [[-28401409,54456913,64786142],72758897], + [[7099165,104942769,74968888],97926943], + [[-13995801,56919587,69332174],65361965], + [[-26207717,59423657,75475224],86221043], + [[6284415,23177140,26461281],70607154], + [[215192914,61945607,54981371],57239098], + [[570884,53692018,83080045],61315597], + [[82035008,70009886,45451263],81130714], + [[56491702,68916341,58674725],57552984], + [[41387757,67423761,76216212],58497788], + [[-13813748,54323195,39213241],55105070], + [[-6283377,38226161,58990807],52511441], + [[-26649360,45588196,46247152],61344017], + [[-14376863,65982584,89020987],94494818], + [[-3323474,29138548,66137005],65784968], + [[58981819,73400065,67082387],72934311], + [[-24602073,59590457,54064654],63371721], + [[36151757,93220459,79425935],82268360], + [[87119215,67120469,66106290],93816049], + [[-48564056,44611797,43001926],87480464], + [[-184831138,45972224,52522771],50154575], + [[-15029762,39315381,53334088],54511484], + [[-63442720,56809824,159032480],72599634], + [[60777021,86337479,55149072],75733594], + [[92444973,55329391,26343979],95967763], + [[-21559036,59753239,49501583],57992092], + [[9746816,62098999,110099681],87566354], + [[10180395,73435400,84209682],72579076], + [[9869506,63811097,-18666569],98789533], + [[-13838113,59406279,58751626],57110750], + [[64073559,55987760,56938593],50470036], + [[122002455,-29528127,89467426],76860378], + [[933085,106082663,68426376],98690342], + [[-2675758,105102702,49288669],84671159], + [[21148930,85952702,88820154],78738465], + [[-20327181,54015158,64694298],64151435], + [[1808162,74371192,54758455],52436239], + [[42135947,69930651,489911],86113750], + [[-12374999,90510715,64743102],92743325], + [[-4294480,65880302,57264170],52553487], + [[-11380714,79284188,78361214],94140720], + [[-18741699,56843996,93948119],94648195], + [[-15112925,57666102,84178102],82071526], + [[48905117,61145192,67255382],50775815], + [[22577383,65607571,119314309],87458960], + [[15014461,96714632,60980637],67795269], + [[47428343,39689983,86775385],68333041], + [[-28078465,61095714,45936858],69419061], + [[-23524262,42214714,78362442],85135301], + [[11059849,57287793,87820074],59162425], + [[3565314,29345958,18633562],74985191], + [[66387470,53690251,35786796],58828200], + [[3116731,79442759,52841036],54281677], + [[-19604720,61128015,61910900],67758297], + [[57308392,70794674,32711619],69928478], + [[12845664,78795191,27148691],64982288], + [[80886361,60430853,61195181],75982584], + [[23065226,55203444,121115562],78368206], + [[-1767172,87142211,34592050],80499249], + [[13751120,55697434,59007891],91399024], + [[-21912028,56562619,52196254],55785461], + [[24434582,75675617,15708816],61713746], + [[-752271,77413609,96554782],99835052], + [[17710144,89394902,70841612],67640873], + [[-29164492,60989567,53774351],69042803], + [[65721828,57739878,71302517],68234456], + [[51294874,74255591,89905897],88926704], + [[122447102,164387501,54549178],86167801], + [[-2233409,26924269,59265799],60037952], + [[3711632,67371720,79918709],68693447], + [[-39313716,47720889,55898562],72954666], + [[-29988637,48099743,66238336],73590241], + [[7092311,93600756,55598390],67221312], + [[94926391,52295037,52035414],72727059], + [[58322954,64494143,14681677],82672475], + [[-30606897,52115517,55916025],63752817], + [[33683678,52234183,65402997],77026018], + [[2893581,30919431,63800326],55450312], + [[-10073625,68787754,42712060],62330691], + [[-13226028,58548045,37442239],60513212], + [[13341702,123874963,58254419],93902154], + [[682234,97911898,48242929],75168144], + [[18722317,56674681,90606505],53673250], + [[90077460,56726877,60520864],80795256], + [[11265077,100200311,67941274],81990966], + [[10217162,21958720,59276183],52563693], + [[82134787,48069587,56864579],64748411], + [[20010404,57114507,56739832],95448884], + [[298850,62853941,18970195],69766264], + [[-34773033,48567904,55236028],66904149], + [[3075957,26623236,63055783],58819651], + [[16457975,57122257,70087795],86513850], + [[90103819,53683092,69699596],86956610], + [[-17689799,58550974,60782619],62138075], + [[9338392,37129212,14441408],65620968], + [[10278172,104026582,58505957],77369117], + [[-36648669,53313763,57070182],72147006], + [[3644850,75873038,60944199],58286859], + [[-55768152,64438408,48348049],98040163], + [[23966354,61323517,66723852],63170986], + [[83907332,75993772,60160048],93531174], + [[-49160977,51421296,51777959],77474735], + [[-19554495,83185945,68889433],96744324], + [[4083844,61211766,78812607],61054908], + [[-28740891,76035877,59783586],89674749], + [[1477390,92187674,62374371],78199589], + [[27555445,100617770,28346459],74363771], + [[61157488,92524005,67778649],94930233], + [[44509108,57672466,-14457614],91176410], + [[-49301441,57583231,64690420],96689478], + [[6254148,63730492,98438208],81029012], + [[-65249177,51697848,46584216],96544404], + [[-18251430,74523624,66136947],84026579], + [[-38032746,59650424,49516347],74348754], + [[1025165,71664650,57908627],53662668], + [[-47108245,52145065,40842431],84592249], + [[-48768564,66546374,54932017],95361722], + [[-21610139,44024485,61168243],64217401], + [[10087091,107246375,62170269],84443931], + [[51033289,57777223,79683838],61964875], + [[-1515410,54504740,89312112],70446642], + [[6955077,59969833,119903931],98033598], + [[-22531794,48719765,58184485],57459504], + [[-5094294,59314583,76395596],65919004], + [[76187323,83948474,38225082],96447759], + [[-21294072,54806425,61700229],62915134], + [[22543466,42317235,91615254],52217555], + [[28314112,89701628,91872856],83358628], + [[-4228579,64941150,75051735],69335866], + [[50966330,77605764,84252544],86294744], + [[-6737743,107415917,54338071],93606463], + [[23145972,65757098,91211071],58936588], + [[19007479,87503572,82855617],76466297], + [[-14765231,68331156,77316912],85528263], + [[-949424,70946763,65236949],62247745], + [[-32803143,52738611,60060225],70716401], + [[66822816,56906431,65665714],62865107], + [[9680974,91968172,80327678],87729365], + [[8343767,56768063,52291322],57842575], + [[38074555,75932657,94592379],82069623], + [[-19059954,72759195,75265940],92199655], + [[17867950,85793108,72307124],65346674], + [[4765057,109187888,51558662],81095880], + [[-18597182,56282648,71097542],71091807], + [[-53544594,48732733,55083403],85358259], + [[-14162311,76553349,71226487],87056545], + [[-47205943,48535879,60516002],84649054], + [[-51865413,61371035,54334719],92685802], + [[-10560072,67389213,73620186],76683871], + [[18319316,72506183,-3063602],83431987], + [[-3588999,72423545,64377299],65504222], + [[11888209,56845438,49310444],80146809], + [[21726851,54782153,26405131],94721944], + [[-21291084,56654299,74535249],77595146], + [[936181,103600381,67588131],95367106], + [[-13782512,64133232,74692014],77722142], + [[-36410139,62335051,70838270],94697845], + [[-13219359,55905482,102146596],96385842], + [[7982302,72795551,71059219],60987001], + [[14814723,60392314,88790377],59482349], + [[-46730374,59535255,39966466],92480718], + [[-12683668,63360272,34527358],67698165], + [[34918460,61167889,51688378],99658139], + [[65522795,5172637,52395633],86564425], + [[21631208,32413943,104746960],76164801], + [[-11979634,65490331,75294207],77878552], + [[6957102,71949660,103009238],93116178], + [[16501855,87396298,22166944],74908909], + [[-3903540,38079649,95576440],86863330], + [[20206463,69766028,75938015],50611973], + [[4305930,14987890,73560026],79729291], + [[-7564317,16601205,60800573],77226681], + [[78960025,77022559,51882781],81335395], + [[-2691592,55376094,83330088],66512406], + [[-47250869,37081123,43153632],93546119], + [[8536338,15031904,58255252],60150014], + [[60376108,86278760,75828759],95953668], + [[-6882477,55533881,67317545],54848322], + [[9678384,78681532,76529906],70647662], + [[10075511,91722489,53804756],60566307], + [[21285284,59022109,91758839],54610451], + [[-37992414,58278309,25526337],96925765], + [[-2709806,59275400,67729392],54828981], + [[7011597,20313939,78973760],77111391], + [[-52588778,60847764,58672703],97223909], + [[-15256628,22229514,41271494],78285813], + [[34156359,101451279,54422671],63500492], + [[21509300,111056381,53419268],68080733], + [[14593452,57851278,-19237975],88677170], + [[1781540,75186457,59902472],58421778], + [[-33041189,51450575,51533175],61139326], + [[15782750,66980930,90439887],66752517], + [[-36107313,40071259,65952487],87451603], + [[-14638698,63394833,75249799],78397768], + [[-22832073,77228624,62320318],87495607], + [[87393628,62821666,29411048],95341264], + [[-16740099,42436581,56244211],56010749], + [[20445816,54943259,60909642],73012739], + [[15983434,51447682,96599706],57178341], + [[-1059151,70062397,74572375],70808526], + [[-35739090,59134133,40541874],80512741], + [[22868206,41119100,92637902],54114178], + [[13457096,20227235,89352457],81131188], + [[53583940,59655001,69818825],56527814], + [[37367140,55788282,41622861],90197118], + [[12409098,92091021,58284823],63081300], +]; +</script> +<script> +function project(pt) { + return [pt[0], pt[1]]; +} + +function scale(pt) { + return add([pt[0] / 2.3e8 * 250, pt[1] / 2.3e8 * 250], [250, 250]); +} + +function add(p1, p2) { + const res = new Array(p1.length); + for (let i = 0; i < p1.length; i++) res[i] = p1[i] + p2[i]; + return res; +} + +function neg(pt) { + const res = new Array(pt.length); + for (let i = 0; i < pt.length; i++) res[i] = -pt[i]; + return res; +} + +window.addEventListener("load", function() { + const cvs = document.getElementById("c"); + const ctx = cvs.getContext("2d"); + + ctx.fillStyle = "rgba(0, 0, 255, 0.005)"; + + for (const bot of bots) { + ctx.beginPath(); + ctx.moveTo(...scale(add(project(bot[0]), [-bot[1], 0]))); + ctx.lineTo(...scale(add(project(bot[0]), [0, bot[1]]))); + ctx.lineTo(...scale(add(project(bot[0]), [bot[1], 0]))); + ctx.lineTo(...scale(add(project(bot[0]), [0, -bot[1]]))); + ctx.fill(); + } +}); +</script> +</head> +<body> +<canvas id="c" width=500 height=500></canvas> +</body> +</html> diff --git a/2018/Cargo.lock b/2018/Cargo.lock index 1d233ab..32017f4 100644 --- a/2018/Cargo.lock +++ b/2018/Cargo.lock @@ -12,6 +12,7 @@ version = "0.1.0" dependencies = [ "argparse 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -21,11 +22,38 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "bitflags" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "cfg-if" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "lazy_static" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -46,6 +74,71 @@ dependencies = [ ] [[package]] +name = "rand" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_chacha" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_pcg" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "regex" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -66,6 +159,27 @@ dependencies = [ ] [[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "thread_local" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -88,16 +202,52 @@ name = "version_check" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [metadata] "checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" "checksum argparse 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3f8ebf5827e4ac4fd5946560e6a99776ea73b596d80898f357007317a7141e47" +"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" +"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" "checksum libc 0.2.44 (registry+https://github.com/rust-lang/crates.io-index)" = "10923947f84a519a45c8fefb7dd1b3e8c08747993381adee176d7a82b4195311" "checksum memchr 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0a3eb002f0535929f1199681417029ebea04aadc0c7a4224b46be99c7f5d6a16" +"checksum rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9d223d52ae411a33cf7e54ec6034ec165df296ccd23533d671a28252b6f66a" +"checksum rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "771b009e3a508cb67e8823dda454aaa5368c7bc1c16829fb77d3e980440dd34a" +"checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" +"checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +"checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" +"checksum rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effa3fcaa47e18db002bdde6060944b6d2f9cfd8db471c30e873448ad9187be3" "checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" "checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" +"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/2018/Cargo.toml b/2018/Cargo.toml index 484f482..33eca25 100644 --- a/2018/Cargo.toml +++ b/2018/Cargo.toml @@ -8,3 +8,4 @@ edition = "2018" argparse = "0.2.2" regex = "1" lazy_static = "1.2.0" +rand = "0.6.1" diff --git a/2018/input/23.txt b/2018/input/23.txt new file mode 100644 index 0000000..f762f20 --- /dev/null +++ b/2018/input/23.txt @@ -0,0 +1,1000 @@ +pos=<136613456,-512820,-739737>, r=87427481 +pos=<-53697593,55277802,49040699>, r=86116187 +pos=<3220880,75515511,53337027>, r=50746552 +pos=<88414078,70781701,66277674>, r=98943677 +pos=<-17988814,83735639,57607927>, r=84446784 +pos=<7905695,86080636,69893638>, r=73183217 +pos=<-106237978,86340882,82036549>, r=85944614 +pos=<-39951484,51796765,70217077>, r=87079969 +pos=<-41339171,48697955,55193194>, r=73297553 +pos=<-42571382,53083825,53317409>, r=74087026 +pos=<-7368751,52027496,-9560976>, r=95138965 +pos=<-8239116,41812660,62596194>, r=54485758 +pos=<-1137951,49037154,75388024>, r=52951810 +pos=<7650881,79141366,92778865>, r=89383763 +pos=<-17148778,67167319,69069673>, r=78500152 +pos=<-34682895,65463074,55433727>, r=80694128 +pos=<92864435,72243385,52889446>, r=91467469 +pos=<23342790,57278342,66486606>, r=96631618 +pos=<16097469,22492567,11010000>, r=76930041 +pos=<-27239715,74048890,47983162>, r=79486831 +pos=<48014242,79716366,40015768>, r=62251861 +pos=<511676,64398402,63621216>, r=52622716 +pos=<-29486239,66238746,61923874>, r=82763569 +pos=<92097957,57353083,58524935>, r=81446016 +pos=<-2615864,64900611,68273820>, r=60905066 +pos=<17304995,87864295,58127670>, r=53801410 +pos=<36460810,70793722,116450849>, r=97175553 +pos=<91303570,59210855,59663955>, r=83648530 +pos=<17400055,51714900,106525287>, r=65954578 +pos=<-9201950,68270611,75924360>, r=78511311 +pos=<10184185,63093052,93307967>, r=71331241 +pos=<24739666,43259195,5573675>, r=52957566 +pos=<-18267592,52724555,76111483>, r=72218039 +pos=<-35598801,54737022,27433735>, r=89083529 +pos=<35813819,73515444,94558754>, r=77358361 +pos=<6642272,22056475,91067625>, r=87832335 +pos=<17645774,89603262,67321149>, r=64393217 +pos=<-10216980,27634811,38770566>, r=70341591 +pos=<12799318,81249393,71992414>, r=65556938 +pos=<-10218046,74437078,62070349>, r=71839923 +pos=<-1309123,20674953,59788059>, r=65885225 +pos=<-27217791,66526827,53078642>, r=71937695 +pos=<-34737368,44315647,75994929>, r=91879642 +pos=<30808903,39024070,99557972>, r=65161437 +pos=<18233335,72395211,90831029>, r=70107346 +pos=<37186749,-678419,57742780>, r=69426693 +pos=<-9615179,80576697,64086230>, r=79392664 +pos=<33935621,102484176,52277559>, r=62167524 +pos=<21730454,116532754,59523052>, r=79439730 +pos=<-44299553,51849314,52674431>, r=73937932 +pos=<98820726,52369354,56304096>, r=80964285 +pos=<-14670863,53307196,63286058>, r=56378495 +pos=<21141579,52692533,60648771>, r=77839132 +pos=<106030705,57863782,38674931>, r=99756568 +pos=<3660762,56362269,113500773>, r=91316727 +pos=<-407093,36114871,62900059>, r=52655349 +pos=<17300250,90851621,82759279>, r=81425029 +pos=<3552610,79637006,46529196>, r=55736575 +pos=<19340107,84837235,62352207>, r=52963786 +pos=<8521013,89819722,24371259>, r=83109002 +pos=<14563407,28673587,78383971>, r=60610219 +pos=<105274857,48490223,59505360>, r=90108685 +pos=<6522669,68013196,92958454>, r=79563377 +pos=<61441811,62255240,63607848>, r=60775173 +pos=<-30662880,72201886,57781685>, r=85760834 +pos=<-5704121,74191612,91679671>, r=96690023 +pos=<22440794,115302243,29587291>, r=89455675 +pos=<16846226,85850758,26219592>, r=68966703 +pos=<-11181912,74609397,43701422>, r=68271328 +pos=<112019147,48094141,55257089>, r=93000920 +pos=<-58029664,63702221,52791218>, r=99637517 +pos=<56546279,54927537,104557578>, r=89501416 +pos=<13690470,51265122,54792423>, r=53548975 +pos=<-20863525,78114651,44421611>, r=80738144 +pos=<20071309,136046599,55636529>, r=96726219 +pos=<-9825817,54458897,71973514>, r=61373140 +pos=<-13643977,45813902,94182312>, r=87475383 +pos=<4214048,57552549,55230473>, r=97407755 +pos=<-44465852,38322072,54656647>, r=86263523 +pos=<-8532222,52266115,71351598>, r=57264679 +pos=<15789835,78397136,91588786>, r=79310551 +pos=<87644233,71738261,52393733>, r=85246435 +pos=<24700943,90988926,103171122>, r=94573621 +pos=<-16261249,63121025,87229161>, r=91725871 +pos=<-52294570,67135761,48053370>, r=97558456 +pos=<18918374,81332072,97803514>, r=85331838 +pos=<11760283,82388891,26779326>, r=70030661 +pos=<19928626,82449711,96833465>, r=84469124 +pos=<-18348975,19999142,52648068>, r=76460901 +pos=<-12075601,71251550,85024678>, r=93466308 +pos=<80062151,62500897,78775775>, r=94808908 +pos=<12337661,103647294,81418622>, r=97842757 +pos=<-11115387,60112851,66531714>, r=62874491 +pos=<16906477,63764749,85558216>, r=57530991 +pos=<-4672303,54855285,1301903>, r=84407059 +pos=<-37982464,58456898,68225299>, r=89779132 +pos=<-17681001,71939994,60038525>, r=74774035 +pos=<-11837172,58467855,79274314>, r=74693725 +pos=<29729949,7390010,64977794>, r=61136429 +pos=<-12679395,87224461,58161931>, r=83180457 +pos=<-11559100,72144044,77817800>, r=86635361 +pos=<-2084469,25684278,55681143>, r=57544326 +pos=<20590016,129914590,49426051>, r=86080032 +pos=<-7571416,69794846,69085384>, r=71566033 +pos=<-34145880,48469543,51820255>, r=62959690 +pos=<-8692081,31985652,52581756>, r=54751347 +pos=<-24455978,69065733,52902609>, r=71539034 +pos=<-2667941,59922398,71227376>, r=58932198 +pos=<-38020475,72881338,61644325>, r=97660532 +pos=<-21527600,53755812,51653194>, r=52050984 +pos=<-8830611,33006975,78898650>, r=80185902 +pos=<19025250,113913931,63618165>, r=83621311 +pos=<8387089,77230233,57248610>, r=51206312 +pos=<9535513,118434510,37136580>, r=97943806 +pos=<78992433,58822717,31347868>, r=81004338 +pos=<-16906193,77442482,52709412>, r=72172536 +pos=<22311017,63448797,51701106>, r=94242941 +pos=<43179406,2818296,30763106>, r=84483777 +pos=<-363630,57933199,98730777>, r=82142085 +pos=<-3421442,71654138,81584493>, r=81774527 +pos=<105294101,47765605,48049117>, r=84365008 +pos=<-14236037,92920841,48040781>, r=85297524 +pos=<5696945,87936599,71179435>, r=78533668 +pos=<70714071,41126802,64803849>, r=68209814 +pos=<-18725349,54598292,52699640>, r=51138183 +pos=<59897823,71653281,71202033>, r=76223304 +pos=<48123775,102241419,73882598>, r=97717918 +pos=<-27257912,59427348,52360090>, r=64159728 +pos=<7347141,78617861,96938400>, r=93323519 +pos=<98970812,42594863,66538549>, r=96733304 +pos=<60136017,76634280,74781184>, r=85021510 +pos=<-38514792,65847495,52025409>, r=81502116 +pos=<-5508508,4887248,43864104>, r=83287138 +pos=<21727987,54693625,95057154>, r=53137390 +pos=<-15479704,40894383,53779209>, r=53827666 +pos=<-50001012,42594012,56389944>, r=89260340 +pos=<-49970116,64164073,53317682>, r=92566258 +pos=<-56357341,55323528,59446041>, r=96241383 +pos=<625968,53683329,98614903>, r=76786891 +pos=<21482773,117944535,70699492>, r=92275780 +pos=<16203712,73330825,69917915>, r=52159463 +pos=<13906226,70337776,30608175>, r=52004893 +pos=<-21655059,68530571,79036384>, r=94336614 +pos=<-6379112,70074314,96974691>, r=98542673 +pos=<37257281,88232345,55974220>, r=54934223 +pos=<-153042,61570334,64745296>, r=51583144 +pos=<75744358,74770786,74235757>, r=98220949 +pos=<2593526,12576425,76209878>, r=86502916 +pos=<-3213601,79186838,80823018>, r=88337919 +pos=<-9431288,52885294,66308318>, r=53739421 +pos=<39457172,77981561,77781961>, r=68690851 +pos=<3658726,45027232,78570696>, r=55347772 +pos=<19540854,59560050,33221913>, r=66437344 +pos=<-23991955,53819675,65495637>, r=68421679 +pos=<-15925338,62003166,71681923>, r=74724861 +pos=<179979,95055064,72345095>, r=92334745 +pos=<32084825,113714994,57462206>, r=76732047 +pos=<-79456713,-30995940,73253681>, r=71108738 +pos=<-5085269,56556449,63274512>, r=50030649 +pos=<-1823099,53617693,74353439>, r=54908645 +pos=<-21582671,87360226,64824893>, r=98882268 +pos=<-54047120,52572271,45012396>, r=87788501 +pos=<-621964,40254302,67623764>, r=53454465 +pos=<10705962,52178757,-10564055>, r=78218262 +pos=<-27052117,72974854,68996532>, r=94137885 +pos=<-5333720,61326896,75858050>, r=67633053 +pos=<-442860,-7927774,60719749>, r=94553540 +pos=<20190232,59561903,101548027>, r=66034633 +pos=<-7907411,40629427,68521654>, r=61262635 +pos=<-9455107,66611005,94728621>, r=95909233 +pos=<22122168,62372400,119686289>, r=85051023 +pos=<-16418814,91187751,60788730>, r=93509810 +pos=<-12210203,71963130,19080036>, r=91275101 +pos=<-16069946,54585553,55218935>, r=50988886 +pos=<73589783,36919962,51760461>, r=62248915 +pos=<10988236,47525791,7585386>, r=60430836 +pos=<10516253,63819008,75162627>, r=53580091 +pos=<54978561,77777004,81843099>, r=88068740 +pos=<843965,59034530,26718598>, r=57653476 +pos=<8390445,51933284,106893232>, r=75550828 +pos=<55468357,41898786,6292104>, r=82163240 +pos=<-15657432,59791539,54996025>, r=55559386 +pos=<21925705,56064114,98432334>, r=57685472 +pos=<2045205,54926092,91406478>, r=69401804 +pos=<18964578,82009106,68170256>, r=56329266 +pos=<-5020873,58135455,83138917>, r=71409692 +pos=<11206282,18758794,90297569>, r=85795593 +pos=<60429823,65420118,62455940>, r=61775922 +pos=<-50071054,65142864,56916609>, r=97245137 +pos=<37522973,119514287,68154460>, r=98661779 +pos=<-24546116,79951244,52341069>, r=81952965 +pos=<-42895143,51426102,49103721>, r=71398899 +pos=<19847811,70965352,88276453>, r=64508398 +pos=<31969885,74676586,119451667>, r=99568484 +pos=<43133639,79493715,70091589>, r=66189023 +pos=<3536597,70013464,59700142>, r=51291540 +pos=<-43456481,62212963,55178319>, r=85962366 +pos=<66908155,61377553,55147564>, r=56903339 +pos=<-6338837,64186892,67392177>, r=63032325 +pos=<24582754,12428156,39119902>, r=50399652 +pos=<19622738,107750729,55849974>, r=69092525 +pos=<-50422280,58990076,62168244>, r=96695006 +pos=<58134510,61311825,96239969>, r=89156504 +pos=<-30966037,57564421,54587595>, r=68232489 +pos=<12569803,83417760,58547639>, r=54510046 +pos=<16028817,91085624,85099394>, r=85270691 +pos=<26948233,79274928,118354187>, r=98047375 +pos=<-52310680,47522666,64367435>, r=94618457 +pos=<-6416427,79465208,59490450>, r=70486528 +pos=<20092186,68488461,91337971>, r=64848774 +pos=<-15142198,42300705,54605738>, r=52910257 +pos=<-27837357,69166421,45527549>, r=77657747 +pos=<-40369484,73666973,51836487>, r=90987378 +pos=<85019354,56875805,38052709>, r=78379725 +pos=<-4826865,73385493,74154124>, r=77481047 +pos=<-44327050,62980445,57928726>, r=90350601 +pos=<2268051,71674062,18320627>, r=77266756 +pos=<7560942,23918555,95582539>, r=89566155 +pos=<-40522661,58387981,55190926>, r=79216025 +pos=<17493703,92481489,21602524>, r=79566649 +pos=<-549853,30548349,59679581>, r=55144150 +pos=<-11540623,61439486,75747954>, r=73842446 +pos=<-27425143,66943956,51613022>, r=71096670 +pos=<7492358,52336684,59482404>, r=62591245 +pos=<8199261,52115157,61979910>, r=52924169 +pos=<-5227038,75473558,53223397>, r=59038494 +pos=<69304179,60217316,90678830>, r=93670829 +pos=<-27825322,58595174,52943775>, r=64478650 +pos=<-3930520,44822324,83076659>, r=67647944 +pos=<-15669371,56863526,61131713>, r=58778995 +pos=<28136546,52898534,69587237>, r=88623606 +pos=<-65393666,51826191,55613912>, r=97948204 +pos=<-15477551,51180735,42248775>, r=50591359 +pos=<40449375,72513414,96662908>, r=83095857 +pos=<-33924420,53998875,71917916>, r=84955612 +pos=<10793863,52565615,51767299>, r=98060212 +pos=<9995273,60527127,91707845>, r=67354108 +pos=<-60284471,51756689,57993530>, r=95149079 +pos=<18376558,10452573,62217674>, r=58851640 +pos=<6437033,60403963,76732508>, r=55814249 +pos=<-28335460,51550727,67141191>, r=72141764 +pos=<-20795148,56783730,53199338>, r=55892601 +pos=<12754662,84841524,53799805>, r=51001164 +pos=<9355656,37410878,81929957>, r=60626411 +pos=<70162685,52698231,62479018>, r=58810202 +pos=<3593617,1103985,61329203>, r=82094839 +pos=<-11110833,76403444,81998629>, r=94627295 +pos=<-2911501,68332204,55930359>, r=52288511 +pos=<-5611352,24754525,54946306>, r=61266149 +pos=<8852382,71155727,68890982>, r=56308709 +pos=<61447488,68409236,69588689>, r=72915436 +pos=<7800512,89666253,65758055>, r=72738393 +pos=<10592995,54945607,58732681>, r=89051922 +pos=<42798128,-12649279,56562836>, r=85829241 +pos=<11562554,75630041,86875504>, r=76057543 +pos=<77961659,71510466,54153352>, r=77095503 +pos=<31055259,54921299,-9869494>, r=70383159 +pos=<-27501669,62023219,47541351>, r=68164946 +pos=<42374475,68761335,72601978>, r=57207824 +pos=<-33321254,51983321,59677321>, r=70096300 +pos=<24068578,39736961,60654009>, r=88299248 +pos=<-19116561,56737201,34200348>, r=67834972 +pos=<22969648,52249055,100644454>, r=55038258 +pos=<-42911185,51860830,61376355>, r=81262991 +pos=<-42633368,44611772,66190367>, r=89674954 +pos=<-3829240,75255688,21232601>, r=84033808 +pos=<5934856,57988042,76585113>, r=53752725 +pos=<-32964350,68530123,57108410>, r=83717261 +pos=<43876005,92164898,87846839>, r=97357843 +pos=<-2417792,58943300,65531206>, r=52006718 +pos=<54964722,89070986,53056518>, r=70562253 +pos=<-290623,31446470,65443341>, r=59750487 +pos=<7639935,101059316,58888687>, r=77422498 +pos=<-28253746,62612782,71235848>, r=87217278 +pos=<-7422094,56693858,109005575>, r=98235920 +pos=<61189820,88854622,44952918>, r=79628549 +pos=<-16010449,60503569,67814188>, r=69442584 +pos=<31995549,99041054,92811203>, r=97317853 +pos=<14407890,68606212,88656048>, r=67968926 +pos=<3797019,93897803,59385476>, r=74600640 +pos=<89982687,70799922,58816742>, r=93069386 +pos=<-47391381,58920806,47022977>, r=85470601 +pos=<-18682541,52396968,60465510>, r=56659507 +pos=<-33603071,56312429,61658802>, r=76688781 +pos=<-1966320,58483882,29754668>, r=56877265 +pos=<-6876331,35253483,65966223>, r=63052064 +pos=<-39772638,75789985,47508955>, r=94235051 +pos=<-24980812,-1938691,-46278539>, r=50540858 +pos=<-14975005,78724644,39316097>, r=80565111 +pos=<-2885944,65589513,76516656>, r=70106553 +pos=<3541691,72547980,70693895>, r=64814600 +pos=<-44510906,63214333,63320805>, r=96160422 +pos=<185135951,79371810,69897884>, r=92278734 +pos=<-15712941,69417771,56680209>, r=66925482 +pos=<3371300,64063926,70577995>, r=56385028 +pos=<20093270,89812250,83966344>, r=78799702 +pos=<-44882626,56482809,44012736>, r=83534067 +pos=<7807097,59338218,93406346>, r=70052015 +pos=<83206185,54254511,65285920>, r=76216650 +pos=<-9128452,31764042,52408460>, r=55235957 +pos=<9273140,58063106,84328894>, r=58233459 +pos=<12730173,65723179,86216535>, r=64323934 +pos=<-5370160,21333035,52408548>, r=61908782 +pos=<-50412106,36708544,57003999>, r=96170823 +pos=<-12428116,56614507,59912876>, r=54070441 +pos=<23530187,55890018,101558624>, r=59032841 +pos=<24076853,75872593,84021081>, r=60931262 +pos=<66742911,53159306,102755650>, r=96128101 +pos=<52985633,69568131,100732548>, r=96756344 +pos=<21276856,95454549,27263024>, r=73096105 +pos=<18634979,90055348,78648309>, r=75183223 +pos=<59296178,97443382,58785611>, r=88995359 +pos=<-9151924,60937196,63129967>, r=58333507 +pos=<-131439802,11932397,63801725>, r=91099003 +pos=<-15182359,51945676,96531706>, r=88774362 +pos=<37456150,58413739,90785927>, r=60125884 +pos=<55535275,58675694,68529536>, r=56210588 +pos=<-23901453,82911425,51765843>, r=83693104 +pos=<20400242,84135488,38426476>, r=51490217 +pos=<86127079,53137259,73699744>, r=86434146 +pos=<-37504970,65330192,58356041>, r=86305590 +pos=<-36229876,54144877,76073195>, r=91562525 +pos=<7122807,47260000,60037998>, r=92003347 +pos=<14241003,60321844,84135837>, r=55331088 +pos=<-58054472,54730510,42664262>, r=96302105 +pos=<11128985,-3179856,61388093>, r=78901954 +pos=<-86171724,81676146,128118766>, r=65629454 +pos=<-32477909,54111811,66095298>, r=77799414 +pos=<16473884,29685000,94881174>, r=74185298 +pos=<-39673388,54367240,60656362>, r=79811579 +pos=<-36820899,56003364,51780853>, r=69719509 +pos=<33393407,80286458,76512600>, r=63663115 +pos=<18145724,41961673,52085548>, r=82246846 +pos=<773269,56344730,109740475>, r=90426345 +pos=<23227623,20924988,89657454>, r=70967862 +pos=<29769636,51258040,101968164>, r=56466105 +pos=<-3255302,91302711,53052997>, r=72725506 +pos=<63288029,31756890,15053302>, r=91363738 +pos=<-696254,82267064,54884033>, r=62961850 +pos=<24224162,74018463,80725407>, r=55634090 +pos=<-31583375,35116342,57915541>, r=79845595 +pos=<-20265647,61458300,53421504>, r=60260040 +pos=<-3625510,70617596,85973701>, r=85331222 +pos=<38592662,72038274,107230244>, r=91331550 +pos=<20947230,95753333,5848876>, r=95138602 +pos=<65256974,42508621,53997591>, r=50564655 +pos=<56144525,-47809394,138757109>, r=88873477 +pos=<12536114,44878759,53725314>, r=86437546 +pos=<-20301103,44075250,52762962>, r=54451813 +pos=<-461902,80465125,84487814>, r=90529307 +pos=<7130680,32413231,68883794>, r=54802893 +pos=<-50296082,60195477,45850842>, r=90822087 +pos=<-14564832,72623628,17948114>, r=95421720 +pos=<-22686155,63096629,54372268>, r=65269532 +pos=<69844001,61172133,56055801>, r=60541966 +pos=<-52847704,61819166,58790940>, r=98572688 +pos=<14547281,53614270,69916715>, r=64925594 +pos=<11858628,69801510,83476504>, r=66533825 +pos=<-19237228,57038668,55663966>, r=57054287 +pos=<-2272553,98539746,62554872>, r=88481774 +pos=<-8556006,44686979,74145414>, r=63477536 +pos=<2504323,61605769,51711818>, r=54478689 +pos=<47588454,79992799,94986516>, r=96037851 +pos=<103658947,51685093,57082700>, r=85896762 +pos=<-30259191,60236324,60596487>, r=76206463 +pos=<-16899083,75972745,75204218>, r=93190621 +pos=<-16138352,72149890,57424797>, r=70827421 +pos=<-32022269,39108198,51836967>, r=70214052 +pos=<-253386,60377315,87086253>, r=72831391 +pos=<70319029,58272431,24333949>, r=78795019 +pos=<98140448,55305455,54099422>, r=81015347 +pos=<-9894221,46215061,90692267>, r=79835086 +pos=<8135694,75227546,75981649>, r=68187909 +pos=<3050471,53586527,55188089>, r=52075619 +pos=<1872493,96006217,77781926>, r=97030112 +pos=<33059309,107988331,79210607>, r=93728745 +pos=<16673776,69427534,108363123>, r=86231293 +pos=<-55714690,52582577,37933926>, r=96544709 +pos=<593835,83505567,68365123>, r=76391300 +pos=<43486018,76414497,67060559>, r=60431122 +pos=<-103710,79781165,51942827>, r=56942322 +pos=<10133283,63186363,55221028>, r=90994744 +pos=<23438290,54031653,67704842>, r=75155252 +pos=<-67769695,52775484,52431198>, r=98090761 +pos=<-18104986,52809731,54267642>, r=50296769 +pos=<109991188,53156356,60594209>, r=97211931 +pos=<-13768977,54140486,59831889>, r=52855852 +pos=<-12489665,47714331,86555741>, r=76794067 +pos=<-26482316,33973790,58911081>, r=76882915 +pos=<-160197435,53199007,15047334>, r=72701562 +pos=<23358129,69976926,85439610>, r=57172786 +pos=<24201045,82557215,112270801>, r=95741523 +pos=<72394082,20781518,37930394>, r=88568308 +pos=<45145254,31095571,82460069>, r=70328402 +pos=<-24815015,78740100,66702713>, r=95372303 +pos=<-11180118,63194518,51850772>, r=51339974 +pos=<-30260369,77069699,58001879>, r=90446543 +pos=<12841613,54905801,60405944>, r=69102701 +pos=<69379484,75759864,80677420>, r=99286807 +pos=<-19898305,56022498,52114906>, r=53150117 +pos=<23972174,63400531,63593334>, r=88610729 +pos=<-7853869,55653210,30754191>, r=58934358 +pos=<40004815,92174613,37712106>, r=69004511 +pos=<-18970401,64246847,57001969>, r=65333603 +pos=<-55945729,46641309,41200961>, r=94633445 +pos=<10448314,60832634,-13979245>, r=90545188 +pos=<104420953,54797004,51761342>, r=84449325 +pos=<-7833268,56419777,64966118>, r=54333552 +pos=<-41600051,53218447,75060610>, r=94993621 +pos=<-23285697,51988784,62294935>, r=62683806 +pos=<-6906170,52717101,66490995>, r=51228649 +pos=<-36994277,58578684,69447528>, r=90134897 +pos=<13894089,90601100,71559173>, r=73380713 +pos=<5549488,90598003,63587583>, r=73750520 +pos=<27986859,65318406,569711>, r=67272566 +pos=<11420671,52635330,54320974>, r=70384136 +pos=<58986016,64249155,26039401>, r=71732796 +pos=<5530635,65978466,18218016>, r=68411191 +pos=<-5385393,46216210,79409449>, r=64041818 +pos=<-21799629,90568144,46789063>, r=91760239 +pos=<-36265254,58098351,59809891>, r=79287875 +pos=<-85146141,88950855,-3714880>, r=50044292 +pos=<38619326,-4038243,77668519>, r=94144770 +pos=<2694518,54614333,-4908892>, r=83010409 +pos=<5313262,51345161,59838196>, r=72136128 +pos=<14843630,-1349878,43928227>, r=69108117 +pos=<22464636,120847792,40757992>, r=83806553 +pos=<-9865777,51214858,90863194>, r=77058488 +pos=<19167267,52510615,54852693>, r=90699829 +pos=<14593457,70653650,97885859>, r=79060557 +pos=<-8818822,61716404,18373136>, r=78343826 +pos=<1060,70746123,74820827>, r=70680268 +pos=<2440131,63910700,77731744>, r=64316854 +pos=<9446148,94030616,72483361>, r=82182217 +pos=<99080786,67236493,59091021>, r=98878926 +pos=<-1302538,90260423,63215145>, r=79892689 +pos=<8394619,77120518,104185074>, r=98025497 +pos=<8809237,89970368,88703357>, r=94978937 +pos=<61696969,53031317,25103817>, r=64161515 +pos=<-17945953,52730115,54562544>, r=50352996 +pos=<5573049,75894102,57995185>, r=53430728 +pos=<1734159,18182439,88390315>, r=93936719 +pos=<16427148,60790813,57255534>, r=77938471 +pos=<-5794985,58712237,72538823>, r=62160526 +pos=<114104963,48165299,48341508>, r=92483804 +pos=<66162561,63632542,48965213>, r=55367138 +pos=<-10848319,68498736,72425408>, r=76886851 +pos=<35960404,57952302,83825949>, r=51208802 +pos=<-7537899,63784540,26119781>, r=71384092 +pos=<7597577,78226192,54364713>, r=50108075 +pos=<-4944468,85203935,56866419>, r=72129314 +pos=<-31664056,74767063,66581879>, r=98127721 +pos=<-30554637,64050408,69381798>, r=89101226 +pos=<15180605,89452073,84996875>, r=84382933 +pos=<24727280,106040899,27094989>, r=80399998 +pos=<-32937600,57802552,41091533>, r=75830264 +pos=<-24285878,55135192,45900921>, r=59701557 +pos=<99942558,60451396,53076615>, r=86940865 +pos=<-8142431,63656427,70896708>, r=67810159 +pos=<19572931,72289003,88954380>, r=66784918 +pos=<17178080,32326459,98036814>, r=73995977 +pos=<-40327597,60321955,30752519>, r=96078407 +pos=<-26708621,51303087,68660841>, r=71786962 +pos=<5298440,71150886,98998933>, r=89965866 +pos=<-26727384,52712004,60606804>, r=65160630 +pos=<-42515019,36860711,54621755>, r=85739222 +pos=<-19692936,52880476,53505130>, r=51192967 +pos=<-2862751,72059619,56687442>, r=56724369 +pos=<23309701,73678498,90297260>, r=65780546 +pos=<103591531,51292218,54785000>, r=83139488 +pos=<13334478,40067215,41788503>, r=53285143 +pos=<-19529026,52222981,57621425>, r=54488069 +pos=<-1797950,83874608,63370131>, r=74157238 +pos=<-25984963,45705100,63968004>, r=69711376 +pos=<-24664085,26439550,59809899>, r=83497673 +pos=<19736100,80301464,65388701>, r=51068468 +pos=<-25320635,61777368,77622402>, r=89834801 +pos=<-17286284,77658389,79260938>, r=99320666 +pos=<70330963,53068965,53858287>, r=50728428 +pos=<-3076230,90554067,55114683>, r=73859363 +pos=<-20974395,51855715,72542126>, r=70486673 +pos=<1092644,-4119326,69709754>, r=98199427 +pos=<15938133,59416689,58855448>, r=92943839 +pos=<-9112976,52910350,69896190>, r=57034132 +pos=<52773451,30360939,79247967>, r=75479113 +pos=<-6680030,26114817,19182073>, r=87913270 +pos=<1482965,86244061,74533437>, r=84409063 +pos=<24689402,71291292,83726812>, r=55443483 +pos=<30350862,66160075,106804338>, r=76785312 +pos=<-4063590,84853935,56872509>, r=70904417 +pos=<5856723,68860058,67443259>, r=55561024 +pos=<-7092718,83599936,62097932>, r=77904977 +pos=<-10322894,95735574,63377690>, r=94550544 +pos=<19921997,12113475,95509859>, r=88937502 +pos=<11534894,57463560,99207505>, r=70250571 +pos=<12352413,63309310,95136075>, r=71207369 +pos=<41175395,95875663,40694251>, r=70893868 +pos=<59891986,74136560,19271752>, r=89293819 +pos=<-23086309,46188709,61304958>, r=63666046 +pos=<-35534522,46755845,63454442>, r=77696176 +pos=<-17431848,55911646,61066276>, r=59524206 +pos=<19833014,98941413,53373702>, r=57596603 +pos=<-28451505,62393147,51769902>, r=67729137 +pos=<8178175,-29195966,48404389>, r=99143478 +pos=<-10800811,66052879,72255412>, r=74223622 +pos=<7592515,82345414,73497606>, r=73364887 +pos=<18762382,82447623,97073423>, r=85873084 +pos=<-10487671,31987978,73584470>, r=77547158 +pos=<-9056504,62925961,53357292>, r=50454349 +pos=<27999580,85878361,92076324>, r=79424309 +pos=<51800702,30641723,78124579>, r=73102228 +pos=<12642813,82894579,64946494>, r=60312761 +pos=<-61807304,47686811,53275056>, r=92858540 +pos=<-7276796,60434304,88907028>, r=81732530 +pos=<-29599217,39708375,83129734>, r=98483597 +pos=<-23520152,26844092,62214412>, r=84353826 +pos=<-28877325,61946397,69770777>, r=85708879 +pos=<-14608106,72848679,65361364>, r=77932548 +pos=<-36824990,70391000,43020520>, r=90376960 +pos=<44969927,68147155,35692982>, r=51961138 +pos=<19011433,65149442,-12540316>, r=84859740 +pos=<18764314,69338844,96926694>, r=72615606 +pos=<-25391985,54173991,76565456>, r=81246468 +pos=<-37132499,58605126,57299821>, r=78151951 +pos=<317469,47901411,90999015>, r=68243137 +pos=<4732566,82416141,64829451>, r=67627448 +pos=<-4438337,64068128,59428063>, r=53049034 +pos=<-7510390,65454288,58686238>, r=56765295 +pos=<13297331,71022908,83309651>, r=66149656 +pos=<-2443890,-1053307,49146976>, r=80880201 +pos=<18424959,-25894837,57469563>, r=90402436 +pos=<19134835,37687041,81457411>, r=50098606 +pos=<30727267,74338302,16287433>, r=63315163 +pos=<76426391,60025595,56674928>, r=66597034 +pos=<-37764165,64665026,63738632>, r=91282254 +pos=<73841307,45244034,7979885>, r=95503095 +pos=<8518776,102619990,65620373>, r=84836052 +pos=<33279437,-14820526,57737587>, r=79656722 +pos=<-12641079,64685181,53396171>, r=55837091 +pos=<-9951596,57691018,18966738>, r=74857701 +pos=<11705830,39289792,103172595>, r=77639987 +pos=<32755328,86575935,59301361>, r=52102968 +pos=<-56381974,51244757,51903260>, r=84644396 +pos=<10573573,67254309,71343991>, r=53139256 +pos=<23178882,99249505,53062798>, r=54247805 +pos=<-30438220,43249726,63852895>, r=76504484 +pos=<-18008082,91354098,61662797>, r=96139463 +pos=<58130621,-5410250,53763204>, r=91122775 +pos=<38376500,5309795,68536851>, r=75422199 +pos=<40568207,55819371,111949414>, r=81807094 +pos=<13385608,58751181,87916220>, r=58396316 +pos=<10652780,62923714,16913699>, r=61538816 +pos=<66584605,90471059,59953467>, r=90479328 +pos=<23828597,9229466,82674549>, r=75079685 +pos=<-2374305,51653149,81806283>, r=60948119 +pos=<15686944,101308548,58364945>, r=69100929 +pos=<12725742,68880644,106967805>, r=88237088 +pos=<17716933,53898766,92455242>, r=53751453 +pos=<-33372359,56824192,52416697>, r=67727660 +pos=<4982549,62244620,102018278>, r=84394819 +pos=<9097870,2277106,23511783>, r=91643276 +pos=<104095420,52061506,57103657>, r=86730620 +pos=<38111501,86440374,53482963>, r=51504912 +pos=<58344818,61400907,63284974>, r=56500739 +pos=<16884807,19231253,82990003>, r=72336956 +pos=<-42692945,65946169,41961384>, r=92859217 +pos=<-28034754,55487947,62126726>, r=70763811 +pos=<19274376,79870506,35147693>, r=51629912 +pos=<21320145,55312624,92060702>, r=51167634 +pos=<-36291008,37650308,58389536>, r=82493243 +pos=<-10796796,41489105,66097601>, r=60868304 +pos=<-40177150,63607920,46375716>, r=83590789 +pos=<16877383,57508433,130889109>, r=96634562 +pos=<78035795,47558838,61699900>, r=65995510 +pos=<-12157529,59079739,94459705>, r=90811614 +pos=<-14719298,67293961,58776388>, r=65904037 +pos=<23165472,48319134,141014934>, r=94993386 +pos=<14483307,55545491,83869510>, r=50046127 +pos=<-13975465,72281297,75555056>, r=86926409 +pos=<54944081,54012748,104500519>, r=86928029 +pos=<15118634,63975046,120649575>, r=94620419 +pos=<18002868,89743987,46547787>, r=51375023 +pos=<118470960,53314916,47200144>, r=99123142 +pos=<-18823495,55420905,53701803>, r=53060582 +pos=<-5467064,58554591,77050896>, r=66186932 +pos=<22160794,74878846,55706389>, r=70447601 +pos=<-27826743,71164171,56998262>, r=81103878 +pos=<-60219520,57279767,54018988>, r=96632668 +pos=<11765030,64865953,25690628>, r=53591753 +pos=<-77604253,51195582,160265663>, r=82321239 +pos=<8895376,94389845,70206097>, r=80814976 +pos=<72068955,61735419,61931626>, r=69206024 +pos=<71294850,57747925,61258998>, r=63771982 +pos=<-12500311,87983348,41185110>, r=85480069 +pos=<13165281,58734390,57751380>, r=71578498 +pos=<-16519504,56287098,41988135>, r=57000006 +pos=<15702065,59567300,125776377>, r=94756321 +pos=<104067037,56353806,59893063>, r=93783989 +pos=<-2443051,34066815,59811244>, r=53650485 +pos=<78659016,53301646,58395591>, r=63826456 +pos=<-5395135,51489915,53108186>, r=54457449 +pos=<43783348,70786755,68608325>, r=56648600 +pos=<15861882,75526752,70870247>, r=55649551 +pos=<-21433110,60201366,71144216>, r=77893311 +pos=<16927373,30534856,57344675>, r=79447115 +pos=<-23582240,51182170,53671182>, r=53550212 +pos=<48377124,87322307,57807776>, r=66977272 +pos=<-24658235,34774969,55408108>, r=70754558 +pos=<-57025118,51608427,56368656>, r=90116625 +pos=<-40956808,54872377,58233637>, r=79177201 +pos=<-7940696,64406847,65491844>, r=62954392 +pos=<18514021,116278681,67137430>, r=90016641 +pos=<43358506,27845033,68486380>, r=57818557 +pos=<1110894,83500413,68255453>, r=75759354 +pos=<-37948234,63772147,53141588>, r=79976703 +pos=<13559648,85475298,69747661>, r=66777842 +pos=<52847535,100951259,70145575>, r=97414722 +pos=<-21363508,51195381,52333138>, r=50006604 +pos=<42775136,24331657,88882389>, r=81144757 +pos=<-1933203,45916056,85330850>, r=66811316 +pos=<-57987412,55995732,52031150>, r=91128682 +pos=<-42000373,57698338,58535687>, r=83348916 +pos=<-22415966,68748566,55301911>, r=71580898 +pos=<63130941,60546452,58913823>, r=56061251 +pos=<-25360,94955513,32263639>, r=88899014 +pos=<16041791,46748455,54886958>, r=52853925 +pos=<21841806,63659499,51701479>, r=64043047 +pos=<1507336,30781882,86426870>, r=79600758 +pos=<-61462214,51930278,59048201>, r=97555074 +pos=<5596619,62910768,103402603>, r=85831362 +pos=<-17947167,60351558,52786859>, r=56199984 +pos=<8310608,110445624,30715607>, r=97601075 +pos=<57809969,62546762,83913036>, r=77739845 +pos=<-4243002,78023652,59272973>, r=66654140 +pos=<-38346139,46279251,81595137>, r=99125137 +pos=<-39505659,59077659,30772250>, r=93992534 +pos=<70748692,61615798,69299886>, r=75134429 +pos=<-8927983,72196971,41805506>, r=65500828 +pos=<18230519,71253951,55091105>, r=51783470 +pos=<-82741,89299947,70860177>, r=85357733 +pos=<19408526,70959236,391121>, r=77341247 +pos=<-118838868,96481794,83622656>, r=81565538 +pos=<7699857,77112966,58676603>, r=53204091 +pos=<-5285832,98989634,54909145>, r=84299424 +pos=<-9949091,79675756,62952022>, r=77691300 +pos=<6548040,71704033,79332787>, r=69603175 +pos=<41519552,70838659,77663756>, r=63492002 +pos=<24672816,51183711,105057962>, r=56683540 +pos=<26979282,57437475,67725517>, r=91990453 +pos=<-146316585,60113902,86014018>, r=74912650 +pos=<72430683,58332575,69349806>, r=73583276 +pos=<20029551,67957881,114673401>, r=87716194 +pos=<-12896053,72374875,79141839>, r=89527418 +pos=<10238771,77142540,70645372>, r=62663967 +pos=<-3216297,27169332,60070123>, r=61580077 +pos=<-23930209,54633761,66648944>, r=70327317 +pos=<-18679703,21196655,30842395>, r=93170631 +pos=<44655563,9533925,46538296>, r=63469153 +pos=<-59378193,54454082,43217955>, r=96795689 +pos=<24496603,92577304,64368811>, r=57563942 +pos=<-27053938,59501992,52024839>, r=63695171 +pos=<-9529140,74055507,52153025>, r=60852050 +pos=<44555529,104038871,53349626>, r=75414106 +pos=<-14679818,88223002,52168606>, r=80185804 +pos=<4552719,62659754,92650998>, r=75872423 +pos=<-19881238,63944538,24064643>, r=85942719 +pos=<16076790,55601668,101552666>, r=66191930 +pos=<21912528,118540961,52911368>, r=74654179 +pos=<-42123089,64929314,59158052>, r=91325104 +pos=<10936357,81890391,20134023>, r=77001665 +pos=<10351597,9179596,62138956>, r=68070751 +pos=<92774311,53165517,56634384>, r=76044462 +pos=<14950682,78188149,16646479>, r=72772458 +pos=<-36369450,41148166,38468120>, r=83283873 +pos=<78960321,78942802,53919616>, r=85293057 +pos=<-158664912,45952974,29905855>, r=62185933 +pos=<114294274,47756105,53682861>, r=94039744 +pos=<20046552,73002532,57617045>, r=54110780 +pos=<-29832468,53561561,86264939>, r=94773352 +pos=<5152614,124285693,53684633>, r=97932108 +pos=<31373573,67528454,85096814>, r=57468866 +pos=<-34521748,54572314,66408185>, r=80616625 +pos=<21670677,109269914,16882176>, r=96898951 +pos=<-13862893,59818682,65331199>, r=64127296 +pos=<17318835,71965542,106868073>, r=86629159 +pos=<78142676,48758577,56205332>, r=59408131 +pos=<-23340878,51182474,58635784>, r=58273523 +pos=<-26740311,87129579,52453722>, r=91438117 +pos=<4303903,69818029,63437040>, r=54065753 +pos=<3266332,71031490,81452081>, r=74331764 +pos=<13702746,18039813,44354215>, r=50433215 +pos=<-3482754,38377262,76574157>, r=67142882 +pos=<-9228255,63064015,42837554>, r=55636176 +pos=<-50838633,55818579,60038300>, r=91809905 +pos=<12044855,110909031,26804479>, r=98241104 +pos=<3069579,54401690,81614434>, r=58061261 +pos=<-55632341,51473141,61974878>, r=94194739 +pos=<47405039,61876630,72051227>, r=54803065 +pos=<-54699622,62927561,51595043>, r=94336968 +pos=<-5193725,62373908,96721874>, r=89403908 +pos=<39277912,51487063,98292773>, r=62527889 +pos=<28453914,55902735,104745928>, r=62572701 +pos=<70028230,51756434,45557821>, r=50764114 +pos=<6794251,79565242,72837497>, r=70723039 +pos=<-13346572,55208620,19942682>, r=74793897 +pos=<-26551619,52981805,64542889>, r=69190740 +pos=<-43505598,52177986,74471561>, r=95270055 +pos=<-36730243,57166097,70373519>, r=89384321 +pos=<67837280,44038045,5154880>, r=93530016 +pos=<24819569,59550660,112300422>, r=72145934 +pos=<22889616,60439671,109383201>, r=72047709 +pos=<16010141,59272902,95102320>, r=63479459 +pos=<45785695,3672162,40921594>, r=76077574 +pos=<52634264,230093674,55591446>, r=92328001 +pos=<-1093816,65699672,61755421>, r=53663391 +pos=<-2927319,46551949,115336543>, r=97175126 +pos=<9846871,97494787,27660769>, r=86168853 +pos=<14575046,54156478,106441784>, r=71137652 +pos=<3693372,64829888,65085318>, r=51336253 +pos=<-14475986,58191102,40490687>, r=58358086 +pos=<-32625219,54193671,54687567>, r=66620839 +pos=<19841368,112790310,53953991>, r=72017337 +pos=<-36529548,56646542,73106232>, r=91396775 +pos=<21383461,52564742,65263630>, r=69168248 +pos=<-25544951,69296904,55993281>, r=75949615 +pos=<5520910,41049609,87926413>, r=66818890 +pos=<78361286,55145660,70961730>, r=77938767 +pos=<-12502650,52118530,26315830>, r=64486867 +pos=<-8502681,43100643,60553969>, r=51419015 +pos=<30788480,91079544,72453023>, r=67791399 +pos=<-41582270,52471539,51548548>, r=70716745 +pos=<22495328,56368486,39214022>, r=54868649 +pos=<629350,38620684,-5628651>, r=92908951 +pos=<54092772,69401105,92313004>, r=89276951 +pos=<-5909105,43864786,12211016>, r=76363299 +pos=<3912827,52322153,79041627>, r=52565376 +pos=<-58023857,53967358,52040730>, r=89146355 +pos=<-31872996,52197859,61603944>, r=70789344 +pos=<15997340,97237977,68995404>, r=75350443 +pos=<-47277488,55104503,30071304>, r=98492088 +pos=<-8126606,68416175,57612004>, r=59269187 +pos=<-41526057,70666640,40848412>, r=97525664 +pos=<73462661,56792015,64535899>, r=68260624 +pos=<17561494,61650408,18024697>, r=52245702 +pos=<18999409,83239866,79157013>, r=68511878 +pos=<-17147426,82949543,58049486>, r=83260838 +pos=<-18999109,63366752,88314976>, r=95795304 +pos=<22782196,90426553,59952512>, r=52711323 +pos=<3870299,63602471,24263373>, r=61650297 +pos=<-28961118,57302888,47585264>, r=64860112 +pos=<-54015783,52509914,54351945>, r=85992387 +pos=<-31431674,55933418,55746724>, r=68226308 +pos=<6227367,990142,64669121>, r=82914608 +pos=<5035135,38115972,99202791>, r=81514672 +pos=<-33418983,63482456,38640418>, r=84442392 +pos=<-10795967,62940846,61879242>, r=60730704 +pos=<109337482,53196724,58133710>, r=94138173 +pos=<24242369,44107239,101663495>, r=58776882 +pos=<13836970,62942011,18092686>, r=57193751 +pos=<22307447,72298904,83902781>, r=59008632 +pos=<61542152,47395133,73538238>, r=61503948 +pos=<-24075040,59046188,54656470>, r=62892239 +pos=<2709891,16928362,83441813>, r=89266699 +pos=<18108186,51788474,56989142>, r=80851857 +pos=<8783157,59841041,97619446>, r=73792049 +pos=<-11464337,-1808695,45620039>, r=94183197 +pos=<-27362762,61729073,63812346>, r=78018926 +pos=<-16479685,60701430,70404170>, r=72700118 +pos=<18072359,95490781,46478814>, r=57121005 +pos=<22305099,61060570,52457431>, r=91124722 +pos=<-3144103,35052829,41802786>, r=52818565 +pos=<14700849,76137475,4759707>, r=82858288 +pos=<24087216,72433922,86093140>, r=59554341 +pos=<78515636,57323047,62505044>, r=71813766 +pos=<-24840821,74681746,64511653>, r=89148740 +pos=<-23826296,65180883,55787778>, r=69909354 +pos=<75346962,35126022,80923207>, r=94962783 +pos=<17008079,55328336,57579351>, r=53041203 +pos=<-7356211,68676554,73449531>, r=74596693 +pos=<-17162496,73932992,66248811>, r=82458915 +pos=<-136511398,24674918,81631631>, r=52044146 +pos=<17677665,60697644,59711178>, r=87163127 +pos=<-23195799,53013298,81013306>, r=82336819 +pos=<-11747126,98444482,59328815>, r=94634945 +pos=<5844912,56397886,77450074>, r=53117462 +pos=<-34509639,55837799,78666373>, r=94128480 +pos=<5904302,91792190,56962332>, r=67964633 +pos=<-17032381,59374519,60271759>, r=61793041 +pos=<126401,73284278,37689172>, r=61650102 +pos=<13058035,58217638,117787893>, r=88061922 +pos=<13828494,55793337,5715352>, r=62430875 +pos=<-38076711,68063369,58208411>, r=89462874 +pos=<11310783,64077677,47800713>, r=90266880 +pos=<71295692,59864191,53931657>, r=58561571 +pos=<-28401409,54456913,64786142>, r=72758897 +pos=<7099165,104942769,74968888>, r=97926943 +pos=<-13995801,56919587,69332174>, r=65361965 +pos=<-26207717,59423657,75475224>, r=86221043 +pos=<6284415,23177140,26461281>, r=70607154 +pos=<215192914,61945607,54981371>, r=57239098 +pos=<570884,53692018,83080045>, r=61315597 +pos=<82035008,70009886,45451263>, r=81130714 +pos=<56491702,68916341,58674725>, r=57552984 +pos=<41387757,67423761,76216212>, r=58497788 +pos=<-13813748,54323195,39213241>, r=55105070 +pos=<-6283377,38226161,58990807>, r=52511441 +pos=<-26649360,45588196,46247152>, r=61344017 +pos=<-14376863,65982584,89020987>, r=94494818 +pos=<-3323474,29138548,66137005>, r=65784968 +pos=<58981819,73400065,67082387>, r=72934311 +pos=<-24602073,59590457,54064654>, r=63371721 +pos=<36151757,93220459,79425935>, r=82268360 +pos=<87119215,67120469,66106290>, r=93816049 +pos=<-48564056,44611797,43001926>, r=87480464 +pos=<-184831138,45972224,52522771>, r=50154575 +pos=<-15029762,39315381,53334088>, r=54511484 +pos=<-63442720,56809824,159032480>, r=72599634 +pos=<60777021,86337479,55149072>, r=75733594 +pos=<92444973,55329391,26343979>, r=95967763 +pos=<-21559036,59753239,49501583>, r=57992092 +pos=<9746816,62098999,110099681>, r=87566354 +pos=<10180395,73435400,84209682>, r=72579076 +pos=<9869506,63811097,-18666569>, r=98789533 +pos=<-13838113,59406279,58751626>, r=57110750 +pos=<64073559,55987760,56938593>, r=50470036 +pos=<122002455,-29528127,89467426>, r=76860378 +pos=<933085,106082663,68426376>, r=98690342 +pos=<-2675758,105102702,49288669>, r=84671159 +pos=<21148930,85952702,88820154>, r=78738465 +pos=<-20327181,54015158,64694298>, r=64151435 +pos=<1808162,74371192,54758455>, r=52436239 +pos=<42135947,69930651,489911>, r=86113750 +pos=<-12374999,90510715,64743102>, r=92743325 +pos=<-4294480,65880302,57264170>, r=52553487 +pos=<-11380714,79284188,78361214>, r=94140720 +pos=<-18741699,56843996,93948119>, r=94648195 +pos=<-15112925,57666102,84178102>, r=82071526 +pos=<48905117,61145192,67255382>, r=50775815 +pos=<22577383,65607571,119314309>, r=87458960 +pos=<15014461,96714632,60980637>, r=67795269 +pos=<47428343,39689983,86775385>, r=68333041 +pos=<-28078465,61095714,45936858>, r=69419061 +pos=<-23524262,42214714,78362442>, r=85135301 +pos=<11059849,57287793,87820074>, r=59162425 +pos=<3565314,29345958,18633562>, r=74985191 +pos=<66387470,53690251,35786796>, r=58828200 +pos=<3116731,79442759,52841036>, r=54281677 +pos=<-19604720,61128015,61910900>, r=67758297 +pos=<57308392,70794674,32711619>, r=69928478 +pos=<12845664,78795191,27148691>, r=64982288 +pos=<80886361,60430853,61195181>, r=75982584 +pos=<23065226,55203444,121115562>, r=78368206 +pos=<-1767172,87142211,34592050>, r=80499249 +pos=<13751120,55697434,59007891>, r=91399024 +pos=<-21912028,56562619,52196254>, r=55785461 +pos=<24434582,75675617,15708816>, r=61713746 +pos=<-752271,77413609,96554782>, r=99835052 +pos=<17710144,89394902,70841612>, r=67640873 +pos=<-29164492,60989567,53774351>, r=69042803 +pos=<65721828,57739878,71302517>, r=68234456 +pos=<51294874,74255591,89905897>, r=88926704 +pos=<122447102,164387501,54549178>, r=86167801 +pos=<-2233409,26924269,59265799>, r=60037952 +pos=<3711632,67371720,79918709>, r=68693447 +pos=<-39313716,47720889,55898562>, r=72954666 +pos=<-29988637,48099743,66238336>, r=73590241 +pos=<7092311,93600756,55598390>, r=67221312 +pos=<94926391,52295037,52035414>, r=72727059 +pos=<58322954,64494143,14681677>, r=82672475 +pos=<-30606897,52115517,55916025>, r=63752817 +pos=<33683678,52234183,65402997>, r=77026018 +pos=<2893581,30919431,63800326>, r=55450312 +pos=<-10073625,68787754,42712060>, r=62330691 +pos=<-13226028,58548045,37442239>, r=60513212 +pos=<13341702,123874963,58254419>, r=93902154 +pos=<682234,97911898,48242929>, r=75168144 +pos=<18722317,56674681,90606505>, r=53673250 +pos=<90077460,56726877,60520864>, r=80795256 +pos=<11265077,100200311,67941274>, r=81990966 +pos=<10217162,21958720,59276183>, r=52563693 +pos=<82134787,48069587,56864579>, r=64748411 +pos=<20010404,57114507,56739832>, r=95448884 +pos=<298850,62853941,18970195>, r=69766264 +pos=<-34773033,48567904,55236028>, r=66904149 +pos=<3075957,26623236,63055783>, r=58819651 +pos=<16457975,57122257,70087795>, r=86513850 +pos=<90103819,53683092,69699596>, r=86956610 +pos=<-17689799,58550974,60782619>, r=62138075 +pos=<9338392,37129212,14441408>, r=65620968 +pos=<10278172,104026582,58505957>, r=77369117 +pos=<-36648669,53313763,57070182>, r=72147006 +pos=<3644850,75873038,60944199>, r=58286859 +pos=<-55768152,64438408,48348049>, r=98040163 +pos=<23966354,61323517,66723852>, r=63170986 +pos=<83907332,75993772,60160048>, r=93531174 +pos=<-49160977,51421296,51777959>, r=77474735 +pos=<-19554495,83185945,68889433>, r=96744324 +pos=<4083844,61211766,78812607>, r=61054908 +pos=<-28740891,76035877,59783586>, r=89674749 +pos=<1477390,92187674,62374371>, r=78199589 +pos=<27555445,100617770,28346459>, r=74363771 +pos=<61157488,92524005,67778649>, r=94930233 +pos=<44509108,57672466,-14457614>, r=91176410 +pos=<-49301441,57583231,64690420>, r=96689478 +pos=<6254148,63730492,98438208>, r=81029012 +pos=<-65249177,51697848,46584216>, r=96544404 +pos=<-18251430,74523624,66136947>, r=84026579 +pos=<-38032746,59650424,49516347>, r=74348754 +pos=<1025165,71664650,57908627>, r=53662668 +pos=<-47108245,52145065,40842431>, r=84592249 +pos=<-48768564,66546374,54932017>, r=95361722 +pos=<-21610139,44024485,61168243>, r=64217401 +pos=<10087091,107246375,62170269>, r=84443931 +pos=<51033289,57777223,79683838>, r=61964875 +pos=<-1515410,54504740,89312112>, r=70446642 +pos=<6955077,59969833,119903931>, r=98033598 +pos=<-22531794,48719765,58184485>, r=57459504 +pos=<-5094294,59314583,76395596>, r=65919004 +pos=<76187323,83948474,38225082>, r=96447759 +pos=<-21294072,54806425,61700229>, r=62915134 +pos=<22543466,42317235,91615254>, r=52217555 +pos=<28314112,89701628,91872856>, r=83358628 +pos=<-4228579,64941150,75051735>, r=69335866 +pos=<50966330,77605764,84252544>, r=86294744 +pos=<-6737743,107415917,54338071>, r=93606463 +pos=<23145972,65757098,91211071>, r=58936588 +pos=<19007479,87503572,82855617>, r=76466297 +pos=<-14765231,68331156,77316912>, r=85528263 +pos=<-949424,70946763,65236949>, r=62247745 +pos=<-32803143,52738611,60060225>, r=70716401 +pos=<66822816,56906431,65665714>, r=62865107 +pos=<9680974,91968172,80327678>, r=87729365 +pos=<8343767,56768063,52291322>, r=57842575 +pos=<38074555,75932657,94592379>, r=82069623 +pos=<-19059954,72759195,75265940>, r=92199655 +pos=<17867950,85793108,72307124>, r=65346674 +pos=<4765057,109187888,51558662>, r=81095880 +pos=<-18597182,56282648,71097542>, r=71091807 +pos=<-53544594,48732733,55083403>, r=85358259 +pos=<-14162311,76553349,71226487>, r=87056545 +pos=<-47205943,48535879,60516002>, r=84649054 +pos=<-51865413,61371035,54334719>, r=92685802 +pos=<-10560072,67389213,73620186>, r=76683871 +pos=<18319316,72506183,-3063602>, r=83431987 +pos=<-3588999,72423545,64377299>, r=65504222 +pos=<11888209,56845438,49310444>, r=80146809 +pos=<21726851,54782153,26405131>, r=94721944 +pos=<-21291084,56654299,74535249>, r=77595146 +pos=<936181,103600381,67588131>, r=95367106 +pos=<-13782512,64133232,74692014>, r=77722142 +pos=<-36410139,62335051,70838270>, r=94697845 +pos=<-13219359,55905482,102146596>, r=96385842 +pos=<7982302,72795551,71059219>, r=60987001 +pos=<14814723,60392314,88790377>, r=59482349 +pos=<-46730374,59535255,39966466>, r=92480718 +pos=<-12683668,63360272,34527358>, r=67698165 +pos=<34918460,61167889,51688378>, r=99658139 +pos=<65522795,5172637,52395633>, r=86564425 +pos=<21631208,32413943,104746960>, r=76164801 +pos=<-11979634,65490331,75294207>, r=77878552 +pos=<6957102,71949660,103009238>, r=93116178 +pos=<16501855,87396298,22166944>, r=74908909 +pos=<-3903540,38079649,95576440>, r=86863330 +pos=<20206463,69766028,75938015>, r=50611973 +pos=<4305930,14987890,73560026>, r=79729291 +pos=<-7564317,16601205,60800573>, r=77226681 +pos=<78960025,77022559,51882781>, r=81335395 +pos=<-2691592,55376094,83330088>, r=66512406 +pos=<-47250869,37081123,43153632>, r=93546119 +pos=<8536338,15031904,58255252>, r=60150014 +pos=<60376108,86278760,75828759>, r=95953668 +pos=<-6882477,55533881,67317545>, r=54848322 +pos=<9678384,78681532,76529906>, r=70647662 +pos=<10075511,91722489,53804756>, r=60566307 +pos=<21285284,59022109,91758839>, r=54610451 +pos=<-37992414,58278309,25526337>, r=96925765 +pos=<-2709806,59275400,67729392>, r=54828981 +pos=<7011597,20313939,78973760>, r=77111391 +pos=<-52588778,60847764,58672703>, r=97223909 +pos=<-15256628,22229514,41271494>, r=78285813 +pos=<34156359,101451279,54422671>, r=63500492 +pos=<21509300,111056381,53419268>, r=68080733 +pos=<14593452,57851278,-19237975>, r=88677170 +pos=<1781540,75186457,59902472>, r=58421778 +pos=<-33041189,51450575,51533175>, r=61139326 +pos=<15782750,66980930,90439887>, r=66752517 +pos=<-36107313,40071259,65952487>, r=87451603 +pos=<-14638698,63394833,75249799>, r=78397768 +pos=<-22832073,77228624,62320318>, r=87495607 +pos=<87393628,62821666,29411048>, r=95341264 +pos=<-16740099,42436581,56244211>, r=56010749 +pos=<20445816,54943259,60909642>, r=73012739 +pos=<15983434,51447682,96599706>, r=57178341 +pos=<-1059151,70062397,74572375>, r=70808526 +pos=<-35739090,59134133,40541874>, r=80512741 +pos=<22868206,41119100,92637902>, r=54114178 +pos=<13457096,20227235,89352457>, r=81131188 +pos=<53583940,59655001,69818825>, r=56527814 +pos=<37367140,55788282,41622861>, r=90197118 +pos=<12409098,92091021,58284823>, r=63081300 diff --git a/2018/src/day23.rs b/2018/src/day23.rs new file mode 100644 index 0000000..6246ee9 --- /dev/null +++ b/2018/src/day23.rs @@ -0,0 +1,492 @@ +use std::io; +use std::io::{BufRead, Write}; +use std::cmp; +use std::process::{Command, Stdio}; +use rand::prelude::*; + +const LARGE: i64 = i64::max_value() / 16; + +#[allow(dead_code)] +fn leq3<T: Ord>(a: T, b: T, c: T) -> bool { + a <= b && b <= c +} + +#[derive(Clone, PartialEq, Eq, Debug)] +struct Pos { x: i64, y: i64, z: i64 } + +impl Pos { + fn new(x: i64, y: i64, z: i64) -> Self { + Pos { x, y, z } + } + + fn new_v(v: i64) -> Self { + Pos::new(v, v, v) + } + + #[used] + fn dist(&self, b: &Pos) -> i64 { + (self.x - b.x).abs() + (self.y - b.y).abs() + (self.z - b.z).abs() + } + + fn distf(&self, b: &FPos) -> f64 { + (self.x as f64 - b.x).abs() + (self.y as f64 - b.y).abs() + (self.z as f64 - b.z).abs() + } + + #[used] + fn dot(&self, b: &Pos) -> i64 { + self.x * b.x + self.y * b.y + self.z * b.z + } + + #[used] + fn add(&self, b: &Pos) -> Pos { + Pos::new(self.x + b.x, self.y + b.y, self.z + b.z) + } + + fn max(&self, b: &Pos) -> Pos { + Pos::new(cmp::max(self.x, b.x), cmp::max(self.y, b.y), cmp::max(self.z, b.z)) + } + + fn min(&self, b: &Pos) -> Pos { + Pos::new(cmp::min(self.x, b.x), cmp::min(self.y, b.y), cmp::min(self.z, b.z)) + } +} + +#[derive(Debug)] +struct Bot { + pos: Pos, + rad: i64, +} + +fn parse_bot(line: &str) -> Bot { + let mut numbers = vec![0]; + let mut multiplier = 1; + + for c in line.chars() { + if c == ',' { + numbers.push(0); + multiplier = 1; + } else if c == '-' { + multiplier = -1; + } else if let Some(dig) = c.to_digit(10) { + let last = numbers.last_mut().unwrap(); + *last = *last * 10 + multiplier * dig as i64; + } + } + + assert!(numbers.len() == 4); + Bot { + pos: Pos { x: numbers[0], y: numbers[1], z: numbers[2] }, + rad: numbers[3], + } +} + +#[derive(Clone, PartialEq, Eq, Debug)] +struct Intersection { + // If p is any point inside the bounds, then order the 8 planes by intersection with the rays: + // <(1, 1, 1)>, <(1, 1, -1)>, <(1, -1, 1)>, <(1, -1, -1)>, <(-1, 1, 1)>, <(-1, 1, -1)>, <(-1, -1, 1)>, <(-1, -1, -1)> + // Then represent a plane by the x-coordinate of its intersection with the x-axis. + // All bounds are inclusive. + bounds: [i64; 8], +} + +impl Intersection { + fn all() -> Self { + let pos = LARGE; + let neg = -LARGE; + Self { bounds: [pos, pos, pos, pos, neg, neg, neg, neg] } + } + + #[used] + fn empty() -> Self { + let pos = LARGE; + let neg = -LARGE; + Self { bounds: [neg, neg, neg, neg, pos, pos, pos, pos] } + } + + fn is_empty(&self) -> bool { + self.bounds[0] < self.bounds[7] + || self.bounds[1] < self.bounds[6] + || self.bounds[2] < self.bounds[5] + || self.bounds[3] < self.bounds[4] + } + + fn from_bot(bot: &Bot) -> Self { + let pos = bot.pos.add(&Pos::new(bot.rad, 0, 0)); + let neg = bot.pos.add(&Pos::new(-bot.rad, 0, 0)); + + let res = Self { + bounds: [ + pos.dot(&Pos::new(1, 1, 1)), + pos.dot(&Pos::new(1, 1, -1)), + pos.dot(&Pos::new(1, -1, 1)), + pos.dot(&Pos::new(1, -1, -1)), + neg.dot(&Pos::new(1, -1, -1)), + neg.dot(&Pos::new(1, -1, 1)), + neg.dot(&Pos::new(1, 1, -1)), + neg.dot(&Pos::new(1, 1, 1)), + ] + }; + + if res.bounds[0] - res.bounds[7] != 2 * bot.rad + || res.bounds[1] - res.bounds[6] != 2 * bot.rad + || res.bounds[2] - res.bounds[5] != 2 * bot.rad + || res.bounds[3] - res.bounds[4] != 2 * bot.rad { + println!("bot={:?}", bot); + println!("bounds={:?}", res.bounds); + assert!(false); + } + + res + } + + fn intersection(&self, o: &Self) -> Self { + Self { + bounds: [ + cmp::min(self.bounds[0], o.bounds[0]), + cmp::min(self.bounds[1], o.bounds[1]), + cmp::min(self.bounds[2], o.bounds[2]), + cmp::min(self.bounds[3], o.bounds[3]), + cmp::max(self.bounds[4], o.bounds[4]), + cmp::max(self.bounds[5], o.bounds[5]), + cmp::max(self.bounds[6], o.bounds[6]), + cmp::max(self.bounds[7], o.bounds[7]), + ] + } + } + + fn dist_origin(&self) -> i64 { + println!("{:?}", self); + let pts = self.all_points(); + println!("{} points in self", pts.len()); + let res = pts.iter().map(|p| p.dist(&Pos::new(0, 0, 0))).min().unwrap(); + println!("{}", res); + res + } + + fn contains(&self, pos: &Pos) -> bool { + leq3(self.bounds[7], pos.dot(&Pos::new(1, 1, 1)), self.bounds[0]) + && leq3(self.bounds[6], pos.dot(&Pos::new(1, 1, -1)), self.bounds[1]) + && leq3(self.bounds[5], pos.dot(&Pos::new(1, -1, 1)), self.bounds[2]) + && leq3(self.bounds[4], pos.dot(&Pos::new(1, -1, -1)), self.bounds[3]) + } + + fn all_points(&self) -> Vec<Pos> { + (self.bounds[5] + self.bounds[6] ..= self.bounds[1] + self.bounds[2]).map(move |p1| { + (self.bounds[6] + self.bounds[7] - p1 ..= self.bounds[0] + self.bounds[1] - p1).map(move |p2| { + (-self.bounds[3] + p1 - p2 ..= -self.bounds[4] + p1 - p2).map(move |p3| { + println!("candidate {:?}", Pos::new(p1, p2, p3)); + Pos::new(p1, p2, p3) + }) + }).flatten() + }).flatten().filter(|p| self.contains(p)).collect() + } +} + +#[allow(dead_code)] +fn backtrack<F: Fn(&Intersection) -> i64>(bots: &[Intersection], selected: &[usize], max_count: &mut i64, min_dist: &mut i64, count: i64, inter: Intersection, dist_func: &F) { + // println!("backtrack: max_count={} min_dist={} count={}", max_count, min_dist, count); + + if count > *max_count { + *max_count = count; + *min_dist = dist_func(&inter); + // println!("New max count: {} at dist {}; inter={:?}", count, *min_dist, inter); + } else if count == *max_count { + let d = dist_func(&inter); + if d < *min_dist { + *min_dist = d; + // println!(" New min dist: {}", d); + } + } + + let rest = selected.iter().map(|&i| i).filter(|&i| !inter.intersection(&bots[i]).is_empty()).collect::<Vec<_>>(); + // println!("rest.len() = {}", rest.len()); + + if rest.len() as i64 + count < *max_count { + return; + } + + if rest.len() == 0 { + return; + } + + let inter2 = inter.intersection(&bots[rest[0]]); + backtrack(bots, &rest[1..], max_count, min_dist, count + 1, inter2, dist_func); + backtrack(bots, &rest[1..], max_count, min_dist, count, inter, dist_func); +} + +#[allow(dead_code)] +fn part2_via_backtracking(bots: &[Bot]) -> i64 { + let inters = bots.iter().map(|b| Intersection::from_bot(&b)).collect::<Vec<_>>(); + let mut max_count = 0; + let mut min_dist = LARGE; + backtrack(&inters, &(0..inters.len()).collect::<Vec<_>>(), &mut max_count, &mut min_dist, 0, Intersection::all(), &|_| 0); + min_dist = LARGE; + backtrack(&inters, &(0..inters.len()).collect::<Vec<_>>(), &mut max_count, &mut min_dist, 0, Intersection::all(), &|i| i.dist_origin()); + min_dist +} + +fn partial_min<'a, T: PartialOrd>(a: &'a T, b: &'a T) -> Option<&'a T> { + match a.partial_cmp(b) { + Some(cmp::Ordering::Less) => Some(a), + Some(cmp::Ordering::Equal) => Some(a), + Some(cmp::Ordering::Greater) => Some(b), + None => None + } +} + +fn partial_max<'a, T: PartialOrd>(a: &'a T, b: &'a T) -> Option<&'a T> { + match a.partial_cmp(b) { + Some(cmp::Ordering::Less) => Some(b), + Some(cmp::Ordering::Equal) => Some(a), + Some(cmp::Ordering::Greater) => Some(a), + None => None + } +} + +#[derive(Clone, PartialEq, Debug)] +struct FPos { x: f64, y: f64, z: f64 } + +impl FPos { + fn new(x: f64, y: f64, z: f64) -> Self { + Self { x, y, z } + } + + fn from_pos(pos: &Pos) -> Self { + Self { x: pos.x as f64, y: pos.y as f64, z: pos.z as f64 } + } + + fn add(&self, b: &Self) -> Self { + Self::new(self.x + b.x, self.y + b.y, self.z + b.z) + } + + fn scale(&self, b: f64) -> Self { + Self::new(self.x * b, self.y * b, self.z * b) + } + + fn max(&self, b: &Self) -> Self { + Self::new(*partial_max(&self.x, &b.x).unwrap(), *partial_max(&self.y, &b.y).unwrap(), *partial_max(&self.z, &b.z).unwrap()) + } + + fn min(&self, b: &Self) -> Self { + Self::new(*partial_min(&self.x, &b.x).unwrap(), *partial_min(&self.y, &b.y).unwrap(), *partial_min(&self.z, &b.z).unwrap()) + } +} + +fn dist_weight(bot: &Bot, pos: &FPos) -> f64 { + let d = bot.pos.distf(pos); + if d <= bot.rad as f64 { + 1.0 + } else { + let x = d - bot.rad as f64; + 0.0009 / (x + 1.0) + } +} + +fn score_function(bots: &[Bot], pos: &FPos) -> f64 { + bots.iter().map(|bot| dist_weight(bot, pos)).sum() +} + +fn random_point_in_box(minpt: &FPos, maxpt: &FPos) -> FPos { + FPos::new(random::<f64>() * (maxpt.x - minpt.x) + minpt.x, + random::<f64>() * (maxpt.y - minpt.y) + minpt.y, + random::<f64>() * (maxpt.z - minpt.z) + minpt.z) +} + +fn random_point() -> FPos { + random_point_in_box(&FPos::new(-1.0, -1.0, -1.0), &FPos::new(1.0, 1.0, 1.0)) +} + +fn improve(bots: &[Bot], pos: FPos, heat: f64) -> (FPos, f64) { + let mut best_pos = pos.clone(); + let mut best_score = score_function(bots, &pos); + + for _ in 0..10 { + let pt = pos.add(&random_point().scale(heat)); + let sc = score_function(bots, &pt); + if sc > best_score { + best_score = sc; + best_pos = pt; + } + } + + (best_pos, best_score) +} + +fn containing_box(pts: &[FPos]) -> (FPos, FPos) { + let minpt = pts.iter().fold(FPos::new(1.0e34, 1.0e34, 1.0e34), |p1, p| p1.min(p)); + let maxpt = pts.iter().fold(FPos::new(-1.0e34, -1.0e34, -1.0e34), |p1, p| p1.max(p)); + (minpt, maxpt) +} + +#[allow(dead_code)] +fn anneal_maximum(bots: &[Bot]) -> FPos { + let minpt = FPos::from_pos(&bots.iter().fold(Pos::new_v(LARGE), |p1, bot| p1.min(&bot.pos))); + let maxpt = FPos::from_pos(&bots.iter().fold(Pos::new_v(-LARGE), |p1, bot| p1.max(&bot.pos))); + + let num_points = 100; + + let mut pts = Vec::new(); + for _ in 0..num_points { + pts.push(random_point_in_box(&minpt, &maxpt)) + } + + let mut heat = 1000000.0; + for iter in 0..16000 { + let mut best_score = 0.0; + + for i in 0..pts.len() { + match improve(bots, pts[i].clone(), heat) { + (p, s) => { + pts[i] = p; + if s > best_score { + best_score = s; + } + } + } + } + + if iter % 100 == 0 { + println!("iter={} heat={} best_score={} {:?}", iter, heat, best_score, containing_box(&pts)); + heat *= 0.9; + if heat < 1.0 { heat = 1.0; } + + pts.sort_by(|a, b| score_function(bots, b).partial_cmp(&score_function(bots, a)).unwrap()); + pts.truncate(num_points / 2); + + for _ in 0..num_points / 2 { + pts.push(random_point_in_box(&minpt, &maxpt)); + } + } + } + + pts.iter().max_by_key(|pt| score_function(bots, &pt) as i64).unwrap().clone() +} + +fn build_smtlib(bots: &[Bot]) -> String { + let mut res = String::new(); + res.push_str("(define-fun abs ((x Int)) Int (ite (< x 0) (- x) x))\n"); + + res.push_str("(declare-const x Int)\n"); + res.push_str("(declare-const y Int)\n"); + res.push_str("(declare-const z Int)\n"); + res.push_str("(declare-const nrange Int)\n"); + res.push_str("(declare-const distorigin Int)\n"); + + for i in 0..bots.len() { + res.push_str(&format!("(declare-const eq{} Int)\n", i)); + } + + for i in 0..bots.len() { + res.push_str(&format!("(assert (= eq{} (ite (<= (+ (abs (- x {})) (abs (- y {})) (abs (- z {}))) {}) 1 0)))\n", + i, bots[i].pos.x, bots[i].pos.y, bots[i].pos.z, bots[i].rad)); + } + + res.push_str("(assert (= nrange (+\n"); + for i in 0..bots.len() { + res.push_str(&format!(" (ite (<= (+ (abs (- x {})) (abs (- y {})) (abs (- z {}))) {}) 1 0)\n", + bots[i].pos.x, bots[i].pos.y, bots[i].pos.z, bots[i].rad)); + } + res.push_str(")))\n"); + + res.push_str("(assert (= distorigin (+ (abs x) (abs y) (abs z))))\n"); + res.push_str("(maximize nrange)\n"); + res.push_str("(minimize distorigin)\n"); + res.push_str("(check-sat)\n"); + // res.push_str("(get-model)\n"); + res.push_str("(eval distorigin)\n"); + + res +} + +#[allow(dead_code)] +fn build_cplex(bots: &[Bot]) -> String { + let minpt = &bots.iter().fold(Pos::new_v(LARGE), |p1, bot| p1.min(&bot.pos)); + + let isign = |c, case| if case & (1 << c) == 0 { "" } else { "-" }; + let sign = |c, case| if case & (1 << c) == 0 { "+" } else { "-" }; + let mul = |c, case, n: i64| if case & (1 << c) == 0 { n } else { -n }; + + let mut res = String::new(); + res.push_str("maximize 300000000 nrange - distorigin\n"); + + res.push_str("subject to\n"); + for i in 0..bots.len() { + for case in 0..8 { + // bC = bot.C - min.C + // ±(x - bx) + ±(y - by) + ±(z - bz) <= rad + 1e12 (1 - ei) + // ±(x + y + z) - ±(bx + by + bz) <= rad + 1e12 - 1e12 ei + // ±(x + y + z) - ±(bx + by + bz) + 1e12 ei <= rad + 1e12 + // ±x ± y ± z + 1e12 ei <= rad + 1e12 ± bx ± by ± bz + res.push_str(&format!(" {}x {} y {} z + 1000000000000 e{} <= {}\n", + isign(0, case), sign(1, case), sign(2, case), i, + bots[i].rad + 1000000000000 + mul(0, case, bots[i].pos.x - minpt.x) + mul(1, case, bots[i].pos.x - minpt.x) + mul(2, case, bots[i].pos.x - minpt.x))); + } + } + + res.push_str(" nrange"); + for i in 0..bots.len() { + res.push_str(&format!(" - e{}", i)); + } + res.push_str(" = 0\n"); + + for case in 0..8 { + // ±(x - mx) + ±(y - my) + ±(z - mz) <= distorigin + // ±(x + y + z) - ±(mx + my + mz) <= distorigin + // ±x ± y ± z <= distorigin - ±(mx + my + mz) + // ±x ± y ± z - distorigin <= - ±mx - ±my - ±mz + res.push_str(&format!(" {}x {} y {} z - distorigin <= {}\n", + isign(0, case), sign(1, case), sign(2, case), + -mul(0, case, minpt.x) - mul(1, case, minpt.y) - mul(2, case, minpt.z))); + } + + res.push_str("bounds\n"); + res.push_str(" 0 <= nrange\n"); + res.push_str(" 0 <= distorigin\n"); + res.push_str(" 0 <= x\n"); + res.push_str(" 0 <= y\n"); + res.push_str(" 0 <= z\n"); + + res.push_str("general\n"); + res.push_str(" nrange distorigin x y z\n"); + + res.push_str("binary\n"); + for i in 0..bots.len() { + res.push_str(&format!(" e{}", i)); + } + res.push_str("\n"); + + res.push_str("end\n"); + + res +} + +pub fn main<T: BufRead>(reader: T) -> io::Result<(String, String)> { + let bots = reader.lines().map(|l| parse_bot(&l.unwrap())).collect::<Vec<_>>(); + + // println!("{}", build_smtlib(&bots)); + // println!("{}", build_cplex(&bots)); + + let largest = (0..bots.len()).max_by_key(|&i| bots[i].rad).unwrap(); + + let part1 = bots.iter().filter(|bot| bot.pos.dist(&bots[largest].pos) <= bots[largest].rad).count(); + + // let part2 = anneal_maximum(&bots); + // let part2 = part2_via_backtracking(&bots); + + let mut child = Command::new("z3") + .arg("-in") + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + .unwrap(); + + child.stdin.as_mut().unwrap().write_all(build_smtlib(&bots).as_bytes()).unwrap(); + + let output = String::from_utf8(child.wait_with_output().unwrap().stdout).unwrap(); + + let part2 = output.lines().last().unwrap().to_string(); + + // Ok((part1.to_string(), String::new())) + + Ok((part1.to_string(), part2)) +} diff --git a/2018/src/main.rs b/2018/src/main.rs index c45b084..aac9302 100644 --- a/2018/src/main.rs +++ b/2018/src/main.rs @@ -28,8 +28,9 @@ mod day19; mod day20; mod day21; mod day22; +mod day23; -static NUM_DAYS: i32 = 22; +static NUM_DAYS: i32 = 23; fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> { match day { @@ -55,6 +56,7 @@ fn day_switch<T: BufRead>(day: i32, reader: T) -> io::Result<(String, String)> { 20 => day20::main(reader), 21 => day21::main(reader), 22 => day22::main(reader), + 23 => day23::main(reader), _ => Err(Error::new(ErrorKind::Other, "Invalid day")) } } |