heh
25/3
| -rw-r--r-- | src/inp.txt | 336 | ||||
| -rw-r--r-- | src/main.rs | 151 | ||||
| -rw-r--r-- | src/util.rs | 12 |
3 files changed, 168 insertions, 331 deletions
diff --git a/src/inp.txt b/src/inp.txt index 0970814..50eac98 100644 --- a/src/inp.txt +++ b/src/inp.txt @@ -1,200 +1,136 @@ -3223323232423342133321323321133325222233342332323323343713331321434231231232333333232334233323322122 -3422323123349134332433333333432333313333323413433133433343234433433334323333452433843344143323335344 -3323113221321312236523622222221222225424323212132242333365351332221432232235143422248222121121832228 -3463333333523444333334433344544335323235227453444243335438244443585333243345323433342343323423544343 -4233366944836552382823534346549355354476555367335594833663342368343653554644862935563623533154857355 -1332332433331354333343732343231333333333333244331233163343322313323333333342353333433313332343313344 -2323333333132333133423233333532331333334313243333333432343123323232442532313323213333333223533324332 -5312224222713236213232382221222222216232352633323322223233232333323422323225662322323723232222222232 -2243331332223333322421433342323323331333332213223332233332153332433342223233221232112323323334332332 -3156557564452635362717784672442615553635257743349535442676644432474552623544224472653952463455546442 -1312431342342824244214465334554334223332235314353232153332244574432234522234334345234413323433435332 -3554245243536264333644415362575554525424533152554425565554435225545754365521344355555155556554244433 -3353433343933436853333343334433544533333353523333323331553333462333433233452343223323433553333333534 -7336455237364265332533353534645233452333753233274646144545334553331347633135465814457336666374354374 -2433722533332321213232333323222232322233342222371243322432283314643332334143336933224322221331822363 -2247224633427672333417546743363394719333635395533333441323733426343643343694333454335345367755643335 -2243232372672232322322321215224746323615328472712261262632721421227121452562656223322437218572422221 -1222929212582422112521233212223222234234242267327154222384122121223122512222523922212956222222252226 -3122322435422357222233333223232234352422221333433322342832323122234243231745124324563425262224222212 -1321332222443232432355222422425222244535264454241322322422345333244431431322113412444229424432364133 -1212211124122213456255217441532222222725521322332233213222221332222222331222522232142283122212112121 -1221222142222133332341312333325237232223222244224227223222113232232634322322222232323273223434131332 -5438843322344249174483324441333413342444444434313423752414444443442232434241744241444444333413444444 -2231336232333236334112243332332341353232312512325222263432225332633322235632375232223315283333433363 -1233232232244732342232235233433333134123235541423222432442243435221242423434242223322334433434343534 -2312422514215411132514322222222222222223235322134223312222221142221213222214314222122211213144122472 -2352312236346345122352672524653136221643242523462324342566643556212133253226462645113375562465463463 -2252285215225322621451522125151253218241242222322242421513142213122213274723222222122122212212242622 -4764556435435474434364374545434435645236634745385365324363447564667544243444254647645664366435256446 -2824332112222121122241422243122211121322131212222342523222233232222222122132221321211233223212242222 -1222322226122232414323112322352321231332324222222212212232243242322235213322222222322223222323222125 -2252722221562224322233133222324333222431232222232332122212212283223222235313323222321222263422212225 -3225322333142232533532322223341246336436425354236552512341262222442442432424316254235423242422424431 -1229234225411352533231233325262212262424612324412432524244236611122332236543432356222256232952224223 -4422322225363423225135213321451642433226538122141642663126542212332323422221342331242252432422222321 -4662664565466353654667543463541541665663656552266564563364254245666465446455433446366683366354765935 -8112122265252322231255272221125322122133222332245342272259236322132232234219412242132223323213224323 -4324545423224241227583333327531422243651534442323374373723223267428526133225253163132824362447344627 -1873223364414122262223231362223512323215135752522222734422222232212231222721127222262123742126233273 -2222222232222221212222211332112222311222111122232212223231322221122222222113422312422211221222221122 -6515552226443442213243133322422152331233434354121421266462313324312444525221525635242234252313112554 -2222223313344213211222422221252212321227222252322221425222221421222322222323332221423322222223243212 -3322352323333353343333333144233223226632532233333132133232322373233333433231243323133323363262322133 -1334333384313212233263453263443134334542743232641425424243735343422256314524379414634432354365527544 -2222122222122222232235222222222222323222211222222222221222222222222222223222223222238223222132112222 -4552545432554471442435255334542432343233452454373464454247443423525434455545443443545522253444253434 -2295142423439123226532549221326257642473736734226243554156257523327813952236236373774524212322953292 -6244442442833334532829613842222423522322338315233322255442882222783429222223272245232322442432445282 -2223281222122322425123122325432223222221231423221422223222352213222122222324122222254223212125222222 -4424433234542223532234133312344242223261233264433212442333234342234445123232234125135124322342223215 -3321444232221444232243522321232343434246434634325422431432452732234232342217314324414312252342131422 -4222445346344244345463442445444423442454352143434333444443353434236443445442344345444343422434444423 -7445335355442547323942325424544342334544545134465255335334523554434234624285444374443344455232725354 -6662469465375473453283843715347366454456464744242897948347645557473738466479664648345568563543338562 -3413332432331224232321343113423313124414141122312422131143212412143243221443322142222431112231356789 -4214514253524332351123524241342444644324422532442535662142332142423422322324342455541551561232442442 -1252555353483543522442375222325465493151255532427344524824242548554533654314332823448245125448973335 -3343353332423434432357344244332322345473752733743623253234344323353733563438364635433334363233353522 -4481475443864865466663533753723433263738268884757523682775288884487347484537562245448287533854845335 -2283214222572422472292362124185482222421528232637272162222421216223326222232322222122323112662222251 -3322123122222252214216221233333231532222212222523332422324122223222332113225227423275142352322812232 -2122255524233332323141342322365426641312343232525215312133422433431435222512532421153342412622412265 -4322333321433452432114212422222241244242232121244322242338222432342132722243242283444223443412426222 -2686481452258352754854574561574766144245484684536194922243385338627468565255352555437323339672423363 -1512123243234132232133124432222472421461652222346228249225222542231432532112315523336523213754323431 -2333221223222122392221223212213232222423132223334312122234323222211313242534322221224222222322233331 -2423143222321313224212232212221421231245322412232422113222245343432231342344413332121234212122432322 -5442623431233335321453824421252232355952141522433545543539332335311722233143332383725343442562123323 -4221221222122221241232222321323222252323226212221222222222221222222122421128222632321222132322122422 -2425957221421122363222228632835265272254223922243713292442232584413234282222222228223946421632156433 -2334313352234233444434474442432342455339475628455436233334243333444454472923441724248233274444144933 -1522122621421834525224232222117228283782114644247574537427343251232114632224436232222312132122332444 -2222323813234423333232323344324323313233224123343232323233542523322414233332223733231443245334326222 -2212311222211222222262232222233231324123222121122232212222322232332222232232221221221222222282121222 -6446555567535466665998357435643445437644844342775443548435536556654763995236662635659544948533464655 -5555555645569655663523984432435935347685533255235633344358886535634465343443534535566633715553544874 -2223642272622224221226212325212321232213222622321222325227222423127222232231622222242522321612232231 -2496484462443135438653377563534444657376332434415777934547754544584252525522367928355656352624353245 -2212122212231222211322212232212222263222222223222221222222222224123131222123242223282212273222121242 -4554475645355358566552555545455545864555435533456467357552458357789556143315353426543345644476644555 -5134335453346453622442534252724124434414324146262511242446444264242232752516413335453447442422256322 -8553685876753576369998575836755786969767886966796423549848793898689987896697887879864874974433698684 -3222221212433223229321122342423213211223141222324922213223412223522935613123272223824242726231274133 -2323214223322522212142232432421443422332332221222222424212432233113322625224233543322232222333442332 -1221332242334224512242343232434244233322411431122212133442112222122433423124423224285123324324422432 -3366435344323232643422212253242435322453143543135334442252422132533353345222473345344251424223333344 -5577695784874427654465756434554854566476757655434446776634753864496554464687473687744697477557496744 -2223331223122231238412212831223232322322212222122221222122222222221222252112422232122214223223122223 -2227576456152577554153253435177341723712527161376724362342426213664663134124547466564665756352111689 -5335337643654473353237332235453355166334545466422334734736326554332364443221164555535734523223763333 -1344466459323423455113777375337223859383757333338384523593433243747981433467243637342557221538535533 -7582359387865258737443328653655389875433894548344445667743258486498794928645678369824848385534734776 -2332322322342342412234222222123242322323433221333223322422225132333224332123221343213233322333223335 -1222212339322122758223313222222412234122252233631244134342224222122222223327233224222433319335255325 -6333333432353233327325334333323333274233333373223333337313333233353533323323353333332333333433223233 -2222231213132221223322123412222323242231322222422221123124312224211232331236231113222223242212222222 -6211221233212246222221221723221232332221222252212222122242232221211221222229233224323232222323634222 -4352121222222321222222929223222422223722623222225222222412282122222222222242422212222693244181222222 -8913337637249265653436452735736242455355355265685536925394769886566866374777555685751454834945789964 -6752637474433657857283376566544626855476477675654588677482837533623665555466364457344273957332432598 -4222413233422323343452222422233472623325342313333233232332524234234232143323733334434344324325327224 -8143572574121427425454114554163292434837485274446547432448523464544552394756325354741544552749493125 -2324242332224222222222222222322342426222122244332322222212222222223221222212232222222231222432223522 -2425251321241127455322154425742233534241444318282344443465142233458442232313443422323121526223256242 -5233541533952725232533434244442434334242514243352523321432353334334324654448344357263457437323422233 -1222222132122222224422244224221235421422122212343322242321222233222222222242212423224222222221232212 -4373334332463466333442362333753332443524543247336343243645323237488441333343346333295132124373733633 -2523534431224324414345482234444221454423424224333422322243448324312322434234442114435244442243441234 -5216772222555212556333333872237834577173233119353423313212327282523773262236416443872322221322534422 -4424454444342444524324435443234344844393334425484234434665336524452442786454756352213845227724656132 -3363354538235285633244636333445633466653126532211425338682456273436424254761431546225362531484356752 -3244434526534332442451233526275445263746427475576222343244732416444254472234325468473423233327523324 -2422544121232544222161323122663663125363226431332142232152243452376322341323334243243446643226633222 -2556357124477356153352651364546654358344426375261446425545358346436237863435535732553326661872325464 -5313342221214324343222333354423244423232415434421125243142423242452344323234424343233213432336333321 -2222222415222333212233322232232823223323532222223322234341323213222225132513233233144422241322323143 -2435536564346557977472363654558672655363255424452352727654342526452266662643477554244247634427452527 -2412313223331213327313121133331232322213221333333232231232222223452122132323126333523223212333232111 -3231332352212234212242355842132211432322343525228242534152254224252644227822521152241233542151273151 -1242242354442274547635266524274258756466558575646635642155345536824686545243645535452346434554656564 -6355664686264756488437865667634746736655788584654552586677568753312538543555254569657737547457458648 -3433333423124316324444328434113632222233763435842543934312343143673636821751634121614222233313442742 -2222422122222142252221232135222222325222244213424123245231122141312212221322221222121425222122122231 -4421273146345347671635465533646555455635434456635447367357366473634464635723765465847646573444674556 -8632543245483535984557352533562435234658334546456423545573444857755938555768254565451952547643543775 -3333333332333433543233332432433323323633133233233513335333433323432533333213334323333334434323233333 -3233333213323323313321331112423352233223333363332323322223225313335653333435322353221323233333233226 -3542224325544323334223433232434114234432125224324433142342313214416885443227423223233335124443443243 -5332424223422323232331421332142224234133323132312632224342362235122233232523311431244322126332325322 -3222323323312231332344313274322343223361261283233235222241251333332233123623322112244313232131231326 -3553546227454236346375443545175372962433445723533766777317531733331642245574676774264732264697226946 -2435643136269525431345566244444444225443349535623455444342423624564425263416364322344336355223562544 -5465346325726225434122422274252322744424443525523241734151312624357524433134543352446424544444254232 -1222232123121325324231422232221222322322222222222422433322222222224944125182233332122322122422222232 -2323423225235522223424422232612132311521844152232226655722121542532222142512472334432244213422312526 -5433221213531231256242366438214111642244562263723315543556223353574322732164154234244571947254521372 -4423444256245575277454484449462255466372224484443365354543562747423333494445434422443478532288535643 -7212212423321242211212221221222221222622921222662422614216245222324222251137525442122222222422532232 -3866324425639525332338773332267343827345232373334433521425625823323364613333729547256235334362325342 -3956721534132232125232223354253319653232234334419473243332814423252224323234341322431441435278353522 -6217536363656322526322115145666764366246463924636664266333265321456389562886565673152312236666533235 -2222245723222542322215462532312222252224331222122222216244622139221232245226732222225252322222232411 -2322543139452322455421152531422225323453243313452454242242151713542324264543313333713931223423342228 -3221312232421323282233234237522182224452253425262523326521312325322322162331221425332373123155232222 -2746432442536455442925944435593977235762735556344345555295341845842826452232744332536933645365525654 -2441574333821246122228322222312142252223248422252122432445221245132292339822481342645252222434225143 -2232222318242253123348232333344332226324544434534253222244322443222272822112142124233447132324441413 -2241442454535543312521314131131112335315542251251413111433321452321523234322331555423531515213426789 -2421866322223443213424411342422221235322434155242342122323443332862323334333223133323221232323212264 -4722432322464532321414334423442423222342212342124343424224224244443434442442312432312121412343262442 -7232221322321522232326122212222342222322222212312222323242222222122222353332122223122112131233222222 -2643222121222222322322422222222123223122243232324222142233112211223151322222212212232223422224342313 -3442333385524542324324223132392421244233363233622433141237435232425524131382333933335432333133587443 -4331133222243432515443224333732243383832244133237352433333264644322723221373325733371283342362332353 -2332332334232123233313332132122463332332122233223332332233512283342443333133633323321123362232323312 -2322323212232342232222232121232222131222122232233233122223221323233342222422222422212342221323231233 -4398433487689256957736447448958955647985575694458686573584458446529576886544765828746538614956782733 -5342265323223554344222423442443442244621452444334535623444364234751623434213245225222261231422234426 -3333222325132222521222231353123353122343112333353522222252252222131422235532213223231231323222525515 -1628322332616133411672142534245323296324442522322323333123232614218315222212122272229542333532312335 -4486646549621254343552376335367338931262676565364546652367262516243571456385522267463567256716552425 -3132342252574332243325555411453232224222542352542443223554226142523546322425433154312255325532432424 -3464267693574476953135666243136766777645656548444662243226644544487953443548557477854339565338341666 -4314322222132224222221232222222223222222221222122225422211222223523222231321322212252322222522213222 -8745345432452732543532735233374423435438343323453534332478358443637444436533235335315734845423235822 -2373227776462391365224136636227272715323636285134733342825834238571243345753251263333742335753333763 -6236531553554154255644321211121223122244435453611521363315445223336111124466261146114553363516454789 -2141132231122222128231324232242223212124232222531422221312221242422234223122222212222542422344222321 -5695222952453322424522524329243556774533752455554522244442365425913434264444322544692448456424433324 -2222412222322542232222321332222211332122221454432312321322242223222212422242242111232231324232212223 -1222262425251422221421121212622235222422222241533212232612522422162224642322213161325525522311233221 -2357329192452425321496232348725343236257672366346176324732582263123357855556254537754544333427777296 -4122365247223133236225133223821321627528418255422292622234621243613323235262236695346315222412823215 -8232327686335213853635467688643854864565678246571456562298523736225424931483345863684647465533884763 -5433644333734433692878966464333565342355277374345773865533443553344433483941615253737584393333253359 -2623182117312236223223229122232923282623243321226112232224293123133222127211521213222222127322222224 -4515355464345435252553259327524365344535354453245547753457653474554755537357543549834754544354454257 -4343242444454244355441446534224434653463254664462422444444454634424542754642545446454456443345236244 -6252564353123123234553322165573813992576675563459842432346475523255223746632435673632324542622232743 -3683762484734182117162245181271658436561472683238836883216376187475754326856275132257561553873514879 -8322422233253425332533442132461642333455462342214353436112244432434223443313413233444116359358325357 -2122231223214232212133332132222233931212222232322222122223221322223221227222122222223222222252212122 -2133522334323313232222243543222432433463536553452323324245443343254241133533234353342343255461321231 -4122333122212322225322231334325214312232223232222412212214232124422231324324242122124222322242232333 -2217222478253322421552352224222221422282251262322324321327622222623326421343522112272721225413222522 -4324333333323335332243333323654533332333343333342233442234332433134323213236333443231334333342313423 -4455855445424555743549549446445444185464658743359464455555473834547337497954564438854556355578864554 -4635155355543423242435552564645777735354562584442545334445744343552455484475445234235895615335665432 -3522213332223422221352222333332315223232321223112223132232223223343313337221335322113113312322321322 -2462451864722242312529223247244228744625352215342742231553326545451872824234526145272226523759472552 -3241433223333432443242352432251433253342224423323342235233224434235223342321431436384243233223323633 -2144222234232524322112262213224424242243432232442213442112222211362412221421223222233421212343242432 -5546565255544585455857545954555633553553535926559748584756454463543565551595454257455555595555855744 -4632332242242234293772618826288172757372366734632738945845236752479947259285477278212467375386832853 -2343553276363356535522332242643945654352263332355665563332352434334538634333234323524532646666532373 -6642233412433362523333233544252325392143222451732233234252432221136443244543244155633432322432142312 -6645513635553536456434465554555532563634624843245574253462583453246844857313433341876266423526473852 -1113233522332432321212222313412315521343627282223261232234221222322442422324222532621323222434113195 -2221255122222112321232232225222222242222221523222213222222221121122123224312322231221223212222222224 -1112121122222223222222222222112242222232323212322222213112322622222132213212123253423222223242122232 +@@@@@@@@.@.@@@@.@@@@@@@@..@..@@@@.@.@.@..@@.@@@@@.@@.@@@@@@@@.....@.@.@..@@@.@@@@@@@.@@......@.@@@@...@.@@.@.@...@@@.@....@.@@@@..@@@.@@ +@..@.@@@@@@@.@@@.@@@@@@.@@@@@@.@...@....@.@.@.@....@@@...@..@..@@@..@@@@@@@@@@.@..@.@..@.@.@@@.@.@@@.@@.@@@...@@.@@@.@@@@.@@.@.@@@@.@@.@ +@.@@.@.@..@@@..@.@@@@@.@.@@.@@.@.@@...@.@.@.@@@@.@@@.@@@@@@@@@@@@.@@..@@.@@@@@@@..@@.@.@@@.@@..@@@@@@@.@@@.@..@@@@@@.@@@@..@@.@.@@..@@.@ +@@..@@@@@..@@@@@..@@@.@@.@@.@@@@@@@.@@.@@.@@..@.@@.@..@.@@...@@@@@@@@.@@@.@@@.@@@@@@.@@@.@..@..@..@.@@.@.@@@@.@@@.....@@..@@...@@@.@@.@@ +@..@..@@..@@.@@.@@@@@.@@@.@.@@@@@@.@@@..@.@@@@@..@.@@..@@@.@@@@@@.@@.@@@@@@@.@@@@@..@@.@@@.@@@@@@@.@..@.@@@@@@@@....@@@.@@@@..@@@@@@.@@. +@@@@.@@@.@.@@.@@..@@@@@.@.@..@.@..@@@@@@.@@.@@@@@@.@@@...@.@.@@...@.@@.@.@.@.@.@@...@@@..@@@@...@.@.@@..@@@.@@@@.@@@@.@@@.@@@..@....@@@@ +@@@..@.@@@@@@@@@@...@@@@@@@@@@.@@.@....@.@@.@.@@..@@.@@@@@@@....@@@.@@@@.@.@@@@@@@@@@..@@.@@.@@.@@@.@.@@..@@@.@@..@@@@.@@@@@.@@.@@..@@.@ +@@@.@@@@@..@..@.@..@@.@@.@@@@@.@@@@...@@@...@@@@@.@@@@@@@@@@..@@@@@@@@@@@@@.@@@@@@@@@.@..@.@@@.@...@@@@.@.@.@.@@@@@.@..@.@.@@@@.@.@@.@@@ +@.@....@@@@@@@.@.@.@.@.@@@@...@....@@@.@@@.@@@@.@@..@@@@@@@@@@.@@@@.@@.@@.@@.@@@.@@@@....@@@@@@.@@@@@.....@.@.@@.@.@@@.@.@@@@.@@.....@@@ +@@@@@...@..@@.@.@@@@.@@@@@@.@...@.@.@@.@..@@.@.@.@@@@@..@@.@.@@@@..@@@..@.@@..@@@@@@..@@@...@@@@@.@@@.@@@.@.@@@@.@@@@.@@@@@@@@@@.@@@..@@ +@@@.@@.@@.@@@@@@@@..@@@.@@@@@@@@@.@@.@@@@@.@@@@@@@.....@@@@.@@@..@.@@....@@@@.@@..@@.@@.@@@@..@@@.@@@.@@@@@@@..@@@@@@@....@.@.@@@@@@.@@@ +@@@@@@@...@@@.@@@.....@@@..@...@...@.@@@@.@@@@@@@@.@@.@.@@@@@.@..@@@@@@@@@@....@@@@@@@..@.@..@@@..@@..@@..@.@.@@...@@@@@..@@@..@@.@@@@@. +@@@@@@@@@@@.@@@@..@@.@@@.@@..@@..@@.@.@@@@@@.@@@.@@@@@...@@.@@@@...@@@@..@..@@@.@@.@@@@.@..@.@.@@@.@@@@@@@.@.@@.@@@@.@@.@@.@@.@...@@@... +@.@.....@@.@@@@@@@.@@@@@@@..@@..@@@..@@.@..@..@@@@.@.@@@@.@..@@@@@@.@@@.@@@@@@.@.@@@@@.@@@@@@.@@.@@..@@@@@@@@.@@@.@@@@@.@.@.@@..@..@@.@. +@@....@@.@@@.@.@@.@@@@@..@@@@@.@@@@@.@@@..@@@.@..@@@@@@.@.@.@@@@@.@@@.@@@@@@@@.@.@@.@.@@@@.@@@..@@.@@@@....@@@@@.@@@@.@@@@@@@@@.@@.@@... +@@...@@@@@@@.@@@.@..@..@@@..@@@@@@@.@@@@.@.@.@@@@@@@@..@@@@.@.@.@@.@@@..@.@@@.@@@@@@.@.@@@@...@.@@@.@..@@@@@@.@@@@@@@..@@..@.@..@@.@@..@ +@@@@@@@.@@.@.@@@....@.@.@.@@@@@@@@@@@@@.@...@@.@@.@@..@@..@..@@@@@@@.@@..@@@@@@@@.@@@@@@..@.@@.@@@@@.@@...@...@@@@@@@..@@@@@@@..@@@.@.@@ +@@@.@@@@@@@...@@@.@@.@@@@@.@.@@@...@...@@@@.@@.@@@..@@@.@@@.@@@@.@@@@@@.@@...@@@@@@@@@.@.@@.@.@@@@@.@..@@..@@..@.@@...@@@.@@@@@.@@@@@@.. +@@@...@@@@@@@..@.@.@@@@@@@.@@@@@@@@@..@@@@...@@@@.@..@...@..@@@..@@@.@.@@.@@..@..@@..@@.@..@@.@..@@.@...@@@@@@...@@@@...@......@@@@@@@.@ +..@.@@.@@@@.@.@@@@..@@@.@@..@.@@@.@.@..@.@@.@.@.@.@@.@..@.@.@@@@@@.@@@.@@@.@@@@@@..@..@..@@.@@@..@.@.......@.@..@..@@@..@..@@@@@@@@@.@@. +@...@.@.@@@@@@@.@@@@.@@.@@@@@.@...@@@@@.@@.@@@.....@@@@.@@@@.@@@..@@.....@@.@@@@@@@@...@@@@@@...@@.@@@@@@@@@@@@@.@@.@@@.@@@@@@@.@@@..@@@ +@...@@.@@.@@.@@@@.@@@.@@@@@.@@.@.@.@@.@@.@@.@@..@@@@@@@.@.@@@.@@@.@@.@@.......@.@@@@.@@@..@@..@@@@@@..@@@@@.@@@@....@..@@@@.@@@....@@..@ +.@@@@@@.@@@@@.@..@@.@@.@@.@.@@@.@.@..@@@@@@.@@@@@@@.@@.@.@@@.@@.@.@.@@..@..@@@@@@@.@@@@@.@@@@@..@@@@.@..@@.@.@@.@...@..@.@.@@@.@.@.@@@@. +..@@@@@@@.@.@.@@@@.@@..@@@@@.@@.@.@@..@@...@.@.@@.@@..@.@..@@@.@..@....@@@@.@.@.@.@.@@@@@..@.@@@.@@@@...@@@@@@@@@@@@.@@@@.@@@@.@.@@@...@ +..@..@...@@@.@.@@@.@@@@@@@@@@@.@@...@@@@@.@@@@@...@.@@@@..@@@@.@@@@@.@@@@.@....@@@@@.@.@@@@@.@@@@.@..@.@@.@@@..@@.@@.@.@@@@@.@@@@@..@... +..@@@...@..@@@@..@.@@.....@@@@@@@.@@..@@@..@@@@@..@@@@@@@@@.@@.@@...@.@@@.@@.@.@@@..@@.@@@..@@.@....@@@.@.@@@.@.@@...@..@@.@@..@.@@@.@@@ +@@@..@@@@.@@@.@.@.@@.@@@@@..@@.@@@@@..@..@@@.@@@..@.@@.@@@..@@@..@@.@@.@...@.@@@@@.@@@@@@@.@@..@..@@@@..@.@@..@.@@.@.@@@@@@@@..@..@@@@@@ +@@.@@@@@.@@@@@.@@@@@@@.@@..@@.@@@@@@@@@@.@.@..@@@.@@...@.@@@@..@@@@.@.@...@.@@@.@.@@.@@@@@@@.@.@@.@@@@@@@@.@@@...@@@.@@@@@@.@....@@..@@@ +@@@...@@@.@.@...@@@@@@@@@@@@@.@@.@@@@@.@@@@@@@@@@@.@@@..@@@@.@..@.@.@.@@@@@@.@..@@..@.@..@.@.@@...@.@@@.@@@@@@.@@..@@@.@.@..@@.@.@@@..@@ +.@.@@.@.@.@@.@@@@.@@@..@@..@..@@.@.@.@.@@..@.@@@@@.@@@@@@@@@@.@.@@.@@@@@@@.@@@.@@@@..@@@@@@@.@@@@@.@@@@.@@@.@@@@@.@@@..@@@@@@@@@@..@@@@. +.@..@.@@..@@@..@@@...@@@@@@@@.@.@@@.@.@@.@@@@.@.@@@.@@@@.@@.@@@@...@@@@...@@.@@.@@.@@@@@@@@@@@@@.@.@@.@@@@@@@..@@@@@@..@...@.@.@@@@@@@@@ +..@@..@@..@@.@@@@@@@@@@.@@@@@@@@@.@.@@..@.@@@@@@@@@@...@@@@..@@@@@@.@@@@@.@.@@.@@.@..@@@@@@@@@.@@@@..@@@...@@@@@..@@@@.@@@@@@.@@@.@.@.@. +..@.@.@...@@@@@@.@.@....@..@@@.@@@@@@@.@.@.@@@@.@.@@@.@@@@@.@.@@@@.@..@@@@.@@@@@.@.@@@@.@@@@@@..@@.@.@@@@@@@@@@@.@.@.@@.@...@@@@@...@@@@ +@.@@@@@..@.@@@.@@@..@.@@@@@@..@.@..@.@@..@.@.@@@@@@.@.@@@@.@.@.@@@@@@@.@.@@@@.@.@@.@@@@..@@@.@@@...@.@@@@@.@@@....@@@......@....@@@@@@@@ +@.@...@@@.@@@@@@.@@@@..@..@@@@@@.@@@@.@@.@.@.@@.@@@@.@.@.@@.@@.@.@..@....@@@@....@.@.@@@@.@.@.@@@..@@.@...@.@.@@@.@@@.@@@@@.@@@.@@@@...@ +.@@.@@.@@@..@@@@@..@@.@@@@@@@.@@@@@@@@@@@@.@.@@@@@.@@.@@..@@@.@@@@@@@.@@@.@.@..@@@@@..@.@.@@..@..@@@.@@@@@@..@...@.@@@.@@@@@@@@.@...@... +.@@.@..@@@@@@@@@@@.@@@@..@.@@.@@@@@@@@...@.@@@.@@.@@...@@@@@@@@@@.@@.@..@@@.@..@@.@....@..@@@@@@@..@.@@@@.@@.@@@.@@@..@@@@@@.@@@@@@@.@.@ +@@@@.@.@.@@@@.@@@@@@...@@@.@.@.@@....@@....@..@@@@.@.@@.@..@.@@@@.@@@@@....@@@.@@.@.@@@.@@@@.@.@@@@@...@...@@..@@..@.@@@@@@@@...@@..@@.. +.@@@@.@@@@.@@@.@.@@@@.@@..@.@.@@@@@@@@@@...@@...@@.@@.@@.@@@@.@@.@@.@@.@@@.@@..@..@.@.@..@..@.@@.@.@@@@@@@@..@@.@@@@@@@.@.@.@.@..@.@@..@ +.@@..@@..@@@@@@@@.@@@@@@.@.@@..@.@.@.@...@@@@@@@@@..@@@.@@@@@@@@@@@.@@@@.@@@.@@@@.@@@..@..@.@@.@..@@@@@@.@@.@@@@@.@@.@@@@@.@.@.@.@@@.@.@ +@.@@@@.@@.....@@.@@@@@@@.@@@@.....@.@@@@.@@@@@@.@@@@..@.@@@..@@.@@@@@@@@@@@@@@....@@@.@@@@.@@@@@@@@..@..@@@@.@.@@...@.@@@@.@@@.@@.@@@@.. +@@..@@@@@@@@@@.@.@..@@.@.@@@@...@@@..@@..@..@.@.@@@@@@.....@@.@@.@@.@...@@.@@@@...@@@..@@@@@@@@@@@@..@@.@@.@@.@.@..@@@.@@@..@@@.@....@.@ +.@@@@@@@@@@@@.@@@.@.@@@@.@@@@.@.@.@.@@@@@.@..@..@@..@@@@@@.@.@..@..@@@@@@@.@@@@@@..@@.@@@...@@@@@.@....@@@@@.@@@@.@.@..@.@.@@.@.@@@@.@.@ +@..@@@@.@@@@@@..@.@@..@@@.@@@@@@.@.@@@.@@@@@.@.@.@.@@.@@@@.@@.@@@.@@@@@@@..@@.@@..@@...@.@@@@@.@@.@@@.@@...@@@@.@@.@@@.@..@@.@.@@@@@..@@ +@@@@.@@...@@..@.@@@@@@@.@.@@@@@@...@.@@.@@@@@@@.@@@...@@@@.@@....@@.@@@@@@.@@.@.@@.@.@@@..@@@@@....@@@@@...@@@@@@@@@@.@...@.@@@@...@.@@@ +@@.@@@@...@.@@@@.@@.@..@@@@@.@@@.@...@@..@..@@@@@.@@@@@@@.@.@@.@@@@@@.@@@@@@@@@@..@.@@@@...@.@@.@@@@@@@@.@.@@@@@@.@..@.@@@@@.@@.@@.@.@.. +@.@@@@@@@@@.@@@..@.@..@@.@@@...@@.@@@.@.@..@@@@.....@.@@.@.@@@@..@..@@..@..@@..@@...@@..@@@@@@@.@@.@...@@@@...@@@@.@@@@@.@..@@.@@@@@@... +@@@.@..@.@..@..@.@.@..@@.@..@@@@@.@..@@@@.@@@.@@@.@...@.@@.@.@@@@....@@.@.@@.@@...@@@..@@....@@@@@...@@...@.@.@@.@.@..@@@@..@@..@@..@@.@ +@@.@@.@@@@@.@@@@@@@@@@@@.@.@@@@..@@@@@@@@@...@@@@@.@.@.@@@@.@..@@@.@....@@.@@@..@@@@..@@@.@.@@@@.@...@@.@@@..@.@..@@@@.@@..@@.@.@@..@@@. +@@@.@@@.@@@@@.@@@@..@.@.@@@..@..@@@@@@@@@@@@@@@@@@.@@.@.....@@@@@@@.@@@.@@@.@@@@@@@@.@@@..@@@.@.@@.@@.@.@@..@@@@...@@@@@.@@@.@@@@@@@@.@@ +@@@@@.@..@@@.@.@.@.@@@...@@@.@@@@@@@.@@@@@@@@.@.@.@@@.@@.@@@.@.@@.@@@@@.@@@@@..@..@.@@@..@.@.@@.@@.@.@..@@@.@@@@@@.@.@...@@@@@@.@@.@@.@@ +@@@@.@@.@@@@@@@..@...@@@.@@@.@@.@@@@@@@@@@.@@@.@@@@..@@...@@.@.@@.@@@@@.@@@.@@@@.@@.@..@@@@@@.@@.@@@@@@@@@@..@@.@@@@@@.@..@@.@@@@@@@.@.@ +.@@@@@@@@@@.@@.@@@..@..@.@@@@@@@@....@@....@@.@@@@.@@@@.@.@@@@@@@.....@@@@@@.@...@..@@@.@.....@@.@@@.@@.@@.@...@@@@@@@.@@@@.@@@@...@.@@. +..@..@@.@@@.@..@@..@@@.@..@.@@....@@@@.@@.@.@@....@.@.@.........@@...@@@..@@@@...@@..@.@@@@@...@@.@@@...@.@..@.@@@@@@@.@@@@...@@..@.@@.. +.@@@@@..@.@@@@@@.@@@.@@@@@.@@@@.@@@@@@@...@@.@.@@..@@@@@@.@@@@@.@@@..@@@@@@.@@.@.@@@@@...@@@@@@@@@@@@.@.@@.@.@@@.@@.@@.@.@@@.@@@@.@.@@.@ +@@@@@@@@@.@.@@@@@.@..@@@...@@.@@@@..@.@.@@@.@@@@..@@.@@@@@.@@@@@..@@..@@@.@@@@@@@.@..@..@@.@@.@..@@@...@.@@.@@..@@@.@@@@.@.@...@@.@@..@. +@@...@@@@@..@@@.@@.@@@@.@@..@@..@@@@.@@@..@..@@@@@@.@@@.@@@@@@@@@...@.@.@@..@@@@.@@@..@...@...@@.@@@.@.@.@@.@.@@@@.@@@@..@@@@@@..@@@@@@@ +..@.@...@@@@@@.@@.@@.@@@.@@..@@@.@@@...@.@@...@@@@.@@.@@@@@..@.@.@@@@..@@@@@@.@@..@.@...@.@.@@@.@@.@@.@@....@@.@@.@@@.@@@@.@@@@.@@@@@..@ +@.....@@@@@..@@.@@@@@@@.@@@@@@..@@.@.@@.@@@@@@...@@..@..@@@.@.@@@.@@@@@@@..@@@..@.@@@@..@@@@@.@.@@...@@...@.@.@@.@@@.@@@.....@...@@@@@@@ +@@..@@@@.@.@@@@@..@@@@@@@.@...@@@@@@.@@@...@@@@..@.@@@@.@..@@@.@@.@@@@.@.@@..@@..@..@@.@@@@@@@..@.@@...@....@@@.@@.@@@.@.@@@...@@@....@@ +@.@@.@@.@..@@.@@.@@@.@@@@.@@@.@@.@@....@@@@.@@@@.@@.@.@.@@@.@.@@@@@@@@.@.@@.@@@.@.@@@@@@@.@@.@.@.@.@.@@@@.@@@@@.@@@.@..@.@@....@@..@@.@@ +.@@@@.@@@.@@@@.@@...@@.@@@@.@@@.@@@@@.@..@.@.@@.@....@@@@@@.@@.@@@..@@.@.@@.@@.@.@@@@..@@@.@..@@@@@@.@@@@@@@@.@...@.@.@@.@@.@@....@@@@.@ +@..@@@.@.@@@@@.@@...@@@@.@@@.@@.@@@@@.@@@@.@.@.@.@@.@.@.@@@@.@@.@@@@@@...@@@@.@@....@@@@...@@@...@...@@.@@...@.@@.@@@@..@@@@@@.@.@@..@.@ +@.@.@..@..@....@@@@@@.@@@.@.@@@.@@@@@@@@@@@@@.@@@@@.@@...@.@@...@@@@@..@.@@.@@.@@@..@@@@.@@@.@@...@@@.@@.@@@.@@@.@@@@.@@@@@@@@@@@@@.@@@@ +@@.@@.@@@@....@@@..@@.@@@@@@@.@@.@.@@@@@@@@@@@.@..@@.@@@.@.@@@@.@@@..@.@@..@@.@@.@@@@@@..@@@.@@.@@..@@@@.....@.....@.@.@.@.@@.@@.@@@@@@@ +@@@@..@@..@@@@.@@@@.@.@@@@.@.@@.@.@@@.@.@@@.@@.@.@@@@.@@@@@..@..@..@.@.@@@.@.@@...@@.@@@@@@@@@@@@@@@.@@@@@@.@@.@@@@@@@@..@@@@@..@@.@@@@@ +@@@@.@....@@@@..@@@@@@..@@@@@@@@@@@@@.@.@@@@@...@@...@@...@.@....@.@@.@.@@@@.@@.@@@@@..@.@@@@@@@..@@.@.@...@@@@.@@..@@@@@.@@@@@.@.@@.@.@ +@..@@@@@@..@@@@@..@@.@@@..@.@@@....@@@@@@.@..@@..@.@@@@@.@.@@@...@.@@@..@..@@..@@@@.@@@@@....@.@@.@..@...@@@@@@@@@@@@.@@@.@......@@@..@. +@@..@@@@@@@.@.@@..@@..@@...@@..@@@..@.@@@@@.@.....@@@@@@@@@@...@@.@@@@..@@.@@@@@@@@.@.@.@@@.@@@@@@@.@@@@@.@.@@@@@@.@@.@@@@.....@...@@... +@.@.....@@@@@.@@@..@.@..@.@@@@@@@@@@@@.@.@.@.@..@@@.@.@.@@@@@..@@@.@...@@@....@@.@@@@@@@@@@@@.@@.@@@@..@@.@...@@@@@.@@.@...@@@..@@@@@@.@ +..@@.@@@.@..@.@..@@@@.@@.@@@@@@..@.@@@@...@@.@@@.@..@@@.@.@@@@@@@@.@@.@@@@...@.@..@@@@@.@@@@@@@@@...@..@@@.@@...@@@@@@.@@@@@@..@.@.@.@.. +@.@@@@@.@.@@@@@.@..@..@@@@...@@.@...@.@@@...@.@@@@@@@@@@@@@@.@@@@.@@.@..@....@@@.@@@@.@@@.@@..@...@.@@@@@.@@@@....@@@@..@@@.@..@.@.@.@@@ +..@@@@.@..@@@@@.@@.@@@.@@@@@@.@@..@@@..@.@@@@@.@.@@@@.@..@@.@.@@@@.@@@@.@.@@@.@..@.....@.@@@.@@..@@.@..@@.@@@@@@..@.@..@@.@..@@@@@@.@..@ +@@..@@..@.@.@@@@.@@@@.@@@@@@@@@...@@@..@@@.@@@@.@.@@@@@...@@.@..@.@@@@@@@.@@@@@@@@..@.@.@@@@@.@..@@.@@@@@@@..@@@@@.@@@.@@.@@.@.@....@@.. +@.@@@..@@@@@.@@@@@@@.@@....@@@..@.@@.@.@@...@.@...@@.@@@@@@@@@@@@@.@@.@@@.@.@@...@@.@@@.@.@@@.@.@.@.@....@@@@.@@@@.@@@@@@@.@.@.@@@@@.@@@ +@..@@..@.@.@@@@@@@..@.@@.@@@@@.@.@.....@@@..@.@@..@@@..@@.@..@.@@@.@.@@@@..@......@.@@..@@@.@@..@@.@@@@..@@@@@.@@@.@@..@@@@@@@@.@@@@@@@@ +.@@..@...@@@@@@@.@@@@@@@..@...@@@..@@@.@@@@..@@@@@@@..@@.@.@@.@@@.@@@@......@......@.@@@@.@@@@@@...@.@@@...@.@.@@@@@@.@.@@@@@..@@@@.@@@@ +..@@.@..@@@.@.@.@@.@.@@@@@...@@@..@.@@.@@.@@@@@@@@@.@@@.@..@...@.@.@@@@@.....@@@@@@@@..@@@@.@@@.@@@@@....@.@@.@.@@@@@@@@..@@@@...@@...@. +@@.@.@.@@.@@.@@..@@@@@@.....@..@@@.@@.@@@@@@.@@@@.@@@@@@@@.@@@..@.@@@.@..@...@..@@@@@.@@@@.@..@@.@@....@..@.@@@@@@.@..@@@@@@..@.@@@...@. +@@.@@@@@@..@@.....@@.@@@@@@@@@..@@.@@.@@@@@@...@@@@@.@.@@@@..@@@@.@@@.@.@.@@@@.@.@@@@@@.@@@@@@@@.@@@@@@@@@...@@.@@@..@.@@@.@.@..@@..@... +@@@.@...@.@@@@@@@.@@.@@@@@@@@@.@@.@@@@@@@.@.....@@@..@.@@.@.@@....@@@.@@@@..@@@...@...@@@@@@....@@@@.@@..@.@@@@@.@..@.@@@@@@@.@....@..@. +..@@@@@..@@.@.@..@@@.@@.@@@@@@.@@@.@.@@@@@@@@@@.@@.@@@@@..@@@@.@@.@.@@@@.@@.@@@@@@@.@@.@@.@@.@@@.@@@@.@@@.@@@@@..@.@.@..@@..@@@@@...@.@@ +@@@@@@.@@@.@..@.@@@@@.@@...@..@.@@@@@..@@@..@@@.@.@@@..@@.@@@.@@..@@.@@.@@@@@.@@@@.@@.@.@@@........@@..@@.@@@.@@@..@@@@@@@.@@@@@@.@.@@.@ +...@@@@@@@.@.@@...@@@.@..@@.@..@@@@@@@@@@@.@.@.@@@@@@@@@@@.@@..@@.@@@@@@@@....@@.@..@.@@..@.@.@@@.@.@.@.@@.@@@...@...@@@@@@@@@@@@.@@.@@@ +@.@@@@..@@@@@@.@.@@..@@@@.@@@@@@@.@..@.@.@@.@@@.@@.@.....@@.@@@@@@@@.@@@@@@@@.@@.@@.@@@..@..@@@@.@@@..@@@@..@@..@@...@.@@@@@@@@.@...@.@@ +.@@@@@@@@...@.@@.@@@@@@@@.@@.@.@@.@.@@@@@@@@..@@@.@@@@@.@@@@.@.@..@...@.@@.@@@@@@@@@.@.@@@@.@.@@..@@@@.@.@@@.@.@@..@@..@@@@@.@@@@..@...@ +.@@@.@...@..@..@@.@@..@..@@@@.@.@@@@@@@@@@.@.@@.@..@.@@@@@@@@@..@@@@@..@@@@...@.@.@@@@.@.@.....@@..@@@@@@@.@@@@@.@.@@@.@@@@@@@@@@.@@@@@@ +@@.@..@@@@.@.@@@@@@.@.@..@@@.@@@@@.@@.@@.@@@@@...@..@.@@.@@..@...@@@.@@.@.@@@.@.@@@@@@@@@@@@@..@....@@..@.@@..@@.@.@.@.@@..@.@@@@@@@@@@@ +.@@.@@@@@.@.@@@.@@..@@@.@@@@@@.@@.@@@@@@@@.@@@@.@@...@.@.@@@@@....@@.....@.@.@.@@@@@.@@@@.@@@@@@@.@...@.@@.@.@.@.@@.@.@@@.@@...@@....@@@ +@..@@@..@@@@..@@@@@@.@@@..@@@@@@@@@@@..@@@@@@.@@@@..@@..@@@@@..@@@.@.@@@@..@.@@..@@.@@@@@@@@..@@@@@@@@@@@.@@..@.@@.@@@@.@.@@@.@....@@@.@ +.@@.@@...@.@@....@@.@.@@@@@.@@@@...@..@@@@@@@@@.@@@@@.@@.@@..@.@@...@.@@@@@.@@@@@...@....@@@@..@@@@@@@@@.@.@.@@@@@@..@...@..@@@@.@..@@@@ +@@@@@@@@..@@@@.@.@@..@@@@..@.@@...@@.@@@...@@@.@@.@...@..@@@@@.@@@..@.@@@@@@@@..@..@..@..@@.@@@.@@.@@....@@@@@@.@@@.@@@@@.@....@@@@@@@@@ +@.@@.@@@@@.@@@....@@@..@@..@.@@..@@@@@.@....@@@@@.@.@@.@@..@..@@..@@@@.@@@.@@@@@@@@@@.@@@@@.@.@.@@@.@.@@@.@@@@@..@@@@..@@...@..@@@@@@@@@ +@@@@@.@.@@@@@@...@@....@@@.@@...@@.@@@@@@@.@.@@.@@..@@@..@.@..@@@@.@@.@.@..@@@..@.@.@.@.@@@@.@@@...@@.@@@@@@@@@@..@@..@.@@@@@@@.@...@.@. +.@.@..@@@@@@..@@@..@@..@@@@@..@@@.@@@@@.@..@.@.@@@.@...@@@@@..@...@@.@.@.@.@@@@@@@@@.@.@@@@.@...@@.@@@.@.@@@..@.@@@@.@.@@@.@...@...@..@@ +.@@..@@@@@.@@@@@@@@@..@@@@@@.@@..@@@@@@@@@@@..@.@....@@.@@@.....@@.@@@@@@@@.@@@.@@@.@@@@@@@@@@@@@@@@...@@@@.@..@@...@.@@@@...@@.@.....@. +..@.@@@.@@@@@..@@@@@@@@...@@@.@.@@@.@@@@@.@@@.@.@@.@@@....@@...@@@.@@@@..@.@@@@.@@@@@@@@@@@..@@@.@@@@.@.@..@@@.@@@@.@.@..@@@@..@@@.@...@ +@@.@.@@@@.@.@@.@@@@.@.@@.@.@@@@@..@@@@...@.@@@@@@@...@.@@.@@@@.@@@.@..@@.@..@@@@@.@.@@.@@@..@.@@@@..@.@@@@@@..@@@.@.@@.@@@.@@.@@@@.@.@@@ +.@@.@.@@@@.@@..@@.@@.....@@@@@@@@@@..@@..@@@@...@@.@@..@.@@.@@@@@@..@@.@@@.@@@@@@...@@.@@@@@@..@@@@@.@@@@@..@@@@@.@..@@.@@@@@@@..@@@.@@@ +@@@@@.@@.@@@.@.@@...@....@...@@@@..@@@@.@@@@...@@..@@@@@...@@@@@...@.....@@..@@@..@@@@@@.@.@@@@.@@@@.@.@@.@@.@@@.@.@@.@...@@..@@@@.@@.@@ +..@@.@.@@@@@@.@@@@@.@@..@@.@@@...@.@@.@.@.@@.@@.@.@.@@@.@.@@@@@@@@@@.@.@.@.@@@@@....@@.@@@@@@@@@@@.@@@.@@@@@@.@@....@.@..@@...@..@@...@@ +@@@.@@.@@...@@..@@..@@@.@@.@.@.@@...@.@.@..@..@..@@.@@@..@@@@@.@.@.@@..@@@@....@@.@@@@.@@.@@..@@..@@@..@@...@@@@....@@@.@@@@@...@@.@@.@@ +.@.@.@@@.@@@@@@@@@.@@@@@@@@@@@...@@@@@@@@..@@@.@.@@.@@@@...@@@.@@.@.@@.@@@@@@@@@.@.@@..@@..@@@@@@..@@.@@@@@@.@@@@.@@@@@@@@@.@@@.@..@.@@@ +@@...@@.@.@@...@.@.@@@@@@.@..@@@@..@...@@..@@@@..@@@@...@@@@..@.@@.@@.....@@@@@@.@@@@@@@@@@..@.@.@@@@@@@@...@.@.@@@@@@@.@@.@@@..@.@@@.@. +@@..@@@@.@@@@@.@.@.@@@@@@@@@..@@@@@@@@@@.@@@@@.@@@.@@@.@@.@@@@@@@.@@@..@@@.@.@@@.@.@.@@@@@@@..@@.@@@.@@.@@@.@@@@.@@@@.@@@@@@@@.@@@@.@.@@ +@..@.@..@@@@@..@@..@.@@@.@@@.@.....@..@@..@.@..@@@@.@...@...@@@@..@@.@.@..@@@...@....@@.@@@..@..@@.@.@@@@@.@.@@@@@@@@@...@@@.@@.@.@..@@@ +@@.@@@.@@@@@..@.@@@.@@@...@.@@@@.@@@@@.@@.@@.@@..@@@..@.@@@@.@@@@@@@@@@@.@@@.....@@@@@@......@@.@...@@@.@@@@.@.@@@@@@@@@.@...@..@@.@@.@@ +.@..@.@@@.@@@@@@.@@@@.@@.@.@.@@@.@@@@@..@.@@@.@@@@@@@@@@.@.@@@@..@.....@.@@@.@...@@@@@@@@.@..@@.@..@.@@@...@@@@@..@@@.@.@@@.@@@.@...@@@. +.@.@..@@..@@....@.@@.@..@@.@.@....@@@...@.@@..@.@@.@@@...@@@.@.@@@.@@.@.@@@.@@@@...@@.@@@@@@..@@.@@.@@@@.@@@@@@@.@@@@@@.@@@@..@@@..@@@@@ +@@@.@@.@@@@@@@@@@..@@@.@@@@@@..@@@.@@@@@.@@@@@@.@.@.@.@@@@.@@..@@..@@@.@.@@.@..@...@@@..@@.@@@@.@.@.@@@@.@@.@@@.@...@@.....@@.@.@@@@..@@ +.@@...@@.@.@@@@.@@@@@@@@@@@...@@@@@.@@@.@@@@@@@@.@.@@@@@@@@@@@@@.@@...@@..@@@@@@.@@.@@@@@.@.@.@@@@@@@@...@..@@@@@@.@@@@@@..@.@..@@@.@.@@ +.@@..@.@@.@.@.@.@@.@@@.@@@@.@@@.@.@@@@@..@...@@@.@@@@@..@@@@..@.@@@@.@.@@@@.@@@@@@@@@..@.@@.@@.@.@@@@@@@@@@@@@@@@..@@..@@@.@..@@@@.@@@@. +.@@@@@@.@@@.@@@@@....@@@.@@@@@.@@@@.@..@@@@.@@@.@@....@@@@@@..@@@@..@.@@@@@@.@@@@@@@@@...@@...@@@..@@@@@@@@@.@.@@@@.@..@@@.@@@@@@@..@... +@@.@@.@@@@@@@@@@....@@@@@@.@..@..@.@.@@.@@.@...@.@@@@.@@.@.@@@.@@..@.@@@@@@..@...@@@.@@.@@@.@.......@@@@..@@@..@@.@@@@..@@@..@@@@.....@. +.@.@@@@..@.@@@.@@..@..@@@.@.@@@@@@@@@@@@@.@@@@@@@@@...@.@@@@..@@@@@@......@@@@@.@@@@@.@@@..@.@.....@@.@@.@@@@@@.@.@@@.@@@.@@@.@.@.@...@@ +.@@.@.@..@@@@@.@@@@@..@@@@@@@@@@@.....@.@@@@@..@@@.@@.@@..@..@@@@@@.....@@..@@@@@@..@@@.@.@...@@@..@@@@.@@@@@@.@.@..@@..@@..@.@@...@.@@. +@.@@@@@@....@...@@@.@@.@@@@..@@@@@@@@@.@@@..@@.@@@@@@@..@.@@@...@.@@@.@@@...@@@@@@@@@..@@@@@@@.@@@.@.@@..@.@@..@@@....@@@@....@@@@@..... +@@@@..@@.@.@@@@..@@@@@...@@@@.@@..@.@@@@@@..@@.@.@.@@@@@@.@.@..@@.@@.@@@@.@@..@......@@@@@.@@@@.@@@.@.@.@@@@@@@@@@@@@@@@.@@@@@@@@@.@@@@@ +...@..@@@@@@@..@@.@@@@..@.@@.@@@@@@.@@@@@....@@..@@.@@@.@.@@.@@@.@@@@.@@@.@.....@@@@@@@@@@@@@@..@.@@@@.@@@@.@@..@.@@@@.@@@@@.@.@.@@@@@@@ +@@@@.@@@@.@.@@@@@@@@@...@..@@@.@.@@@@.@@@.@..@@.@@@@..@@@@.@@@@@@@@.@.@@.@@@@.@@@.@@@@@..@@@.@.@.@..@.@.@.@@@@.@@@@@@@@..@@@@@..@..@.@@@ +.@.@@@.@@..@@@@@..@@.@@@.@@.@@.@@@@@.@..@@@@@.@@@@@.@.@.@@@@@.@@..@@@@.@.@..@@..@@@.@@.@..@..@@.@..@@@@.@.@.@.@@@@@@@@@.@@@@@.@@@@..@.@@ +@@@..@.@@.@@@.@.@@@...@.@@@.@@@..@@..@@@..@.@@@...@..@@@.@@.@...@@@.@@.@@@.@@.@@@.@@@@.@@@@@@@@.@...@.@.@.@@@.@@@.@@@@@@@..@@@.@@@@@.@@. +@@..@@@@@.@@@@@.@@@@@.@@@@..@@@@@.@@@.@@.@@@@@...@..@.@@@@@@@.@@.@@.@.@@@@..@@@@.@@.@@@.@.@...@@@..@.@.@@@.@@@.@@.@..@@@@@..@@@@.@.@@@@. +@@@..@.@@@@..@@.@@@.@.@@..@@@@@.@@@.@@@.@..@@@@@@@@.@@@@@@@.@@.@@@@.@@@.@@@@..@@@..@@@..@@@@...@@.@.@@@@@.@@.@@.@@@@@....@.@@.@@@.@@@.@@ +@@.@@@..@@@@@@.....@@@@.@....@@@@.@@.@@@@@@.@@@.@@.@@@.@@@.@@@@@@@@.@..@@@@@.@.@@@@@..@@@@@@@@@....@@.@@@@.@@@@@@@...@.@..@@@@@@.@@@@@.. +@@.@.@@.@@@@@@@.@@@@@@@@@@.@..@....@@@@..@.@@@@...@@.@.@@.@@.@@@@..@@@@.@..@@..@@@@@..@@@@.@.@.@..@@.@@@@.@...@@@@@@..@@.@.@@@..@@@@.@@@ +@@@@@.@@.@@@.@@.@.@@.@@@.@@.@@@.@@...@@.@@@@@..@@.@@@@.@..@@@.@@.@@@@@@@@@.@.@@@@.@@.@@@@.@@@@@@..@@.@.@..@@@@@@@.@@@..@.@@@@@..@....@.. +.@@@@@@..@@.@.@@.@@@@..@.@.@@@@@@@.@@.@..@@@@@@@.@@@@@....@.@..@.@@@@@.@@@.@.@..@@@..@@@..@@@@@@@@.@@@.@.@@@@..@.@...@@@@@@@.@@@.@@...@@ +@@@@..@.@..@@@@@@.@@..@@..@.@@@.@@@@@@@@@@.@@@@@@@@@@.@.@@@@@.@@@...@@.@@@@.@@.@@.@.@.@.@.@@@...@@@@@@.@.@@.@.@.@@.@@@.@@@@.@.@@....@.@. +@.@@@@@.@@@@.@@..@@@.@@@.@@@@@@..@.@@.@@@@@@@@.@@@@@@..@@@@@@...@@..@.@@@.@@..@@@@@.@@@.@.@.@.@.@@@.@.@.@..@@..@@@..@@...@.@@@@@@@.@@@@@ +@.@@.@..@@@@@.@.@@.@@.@@.@....@@@@..@@..@.@@.@..@@...@@@@@@.@@.@@@..@@@@@..@@..@@@.@@@....@@@@@@..@.@@@@.@@@....@@...@@@@...@@@@@@@..@.@ +@@@...@@@@@.@....@@@@@@@..@@@@..@@@@@.@@.@..@@@@@@@.@.@.@@.@.@@.@.@..@@@@@@@@@@@.@..@..@@@@@@@@@@@..@..@@.@@.@@@@.@@@@@@..@@@@.@@@..@@@@ +@@@.@@@@@@@@@@.@@.@@..@...@.@..@.@...@@.@..@@@@@..@.@@.@@@@@@@@...@@@@.@.@.@@@..@@.@...@@.@@@@.@@@@@@@@@..@..@.@.@.@.@@.@..@@...@.@.@... +.@@@@@@@..@.@..@@@.@@@@@..@@.@@.@@@.@@@@@@@.@@@@@@@@..@@@@.@@.@@.@.@@..@@@@.@@@@.@@@@@..@@@@@@@...@@@@.@@.@@@@.@@@..@@@@@@..@@@@..@..@@@ +.@..@@@@@@.@....@@.@@@@@..@@@@..@@.@.@@@@...@@@@@@.@@@.@.@..@@@@.@@@@@...@@@@@@.@..@.@@.@.@@.@...@..@@@@@.@@@@@@.@@..@..@@@@@@@@@..@.@.@ +@@@@@@@@@@@@.....@..@@@@@.@..@@.@.@.@.@@@.@.@@..@..@@.@@@@..@.@@@@@..@@@@@@..@.@@.@@.@@@@@@@@.@....@.@@@@@.@...@.@@@.@.@.@.@@@@@..@@@@@@ diff --git a/src/main.rs b/src/main.rs index ee8aab6..6c4c765 100644 --- a/src/main.rs +++ b/src/main.rs @@ -70,146 +70,35 @@ use std::{ use swizzle::array; pub use util::prelude::*; #[unsafe(no_mangle)] -pub unsafe fn max(data: &[u8; 99]) -> u8 { - let v0 = u8x64::from_slice(&data[0..64]); - let v1 = u8x32::from_slice(&data[64..96]).resize::<64>(0); - let mut mx = v0.simd_max(v1).reduce_max(); - for &b in &data[96..] { - if b > mx { - mx = b; - } - } - mx -} - -#[unsafe(no_mangle)] -pub unsafe fn max89(data: &[u8; 89]) -> u8 { - let v0 = u8x64::from_slice(&data[0..64]); - let v1 = u8x32::load_or_default(&data[64..]).resize::<64>(0); - v0.simd_max(v1).reduce_max() -} - -pub unsafe fn max2(data: &[u8]) -> u8 { - if data.len() == 1 { - return data[0]; - } - let start = u8x64::load_or_default(data); - if data.len() > 64 { - let extra = u8x64::load_or_default(&data[64..]); - start.simd_max(extra).reduce_max() - } else { - start.reduce_max() - } -} -#[unsafe(no_mangle)] -#[inline(always)] -// https://stackoverflow.com/a/77709227 -unsafe fn maxi32(v: u8x32) -> u8 { - let v: u16x16 = transmute(v); - //indexes - const even: u16x16 = u16x16::from_array([ - 0xff00, 0xff02, 0xff04, 0xff06, 0xff08, 0xff0a, 0xff0c, 0xff0e, 0xff10, 0xff12, 0xff14, - 0xff16, 0xff18, 0xff1a, 0xff1c, 0xff1e, - ]); - let odd = even + u16x16::splat(1); - let vu16 = (v & u16x16::splat(0xff00u16) ^ odd).simd_min(v << 8 ^ even); - _mm_cvtsi128_si32(_mm_minpos_epu16(transmute( - vu16.extract::<0, 8>().simd_min(vu16.extract::<8, 8>()), - ))) as u8 -} -#[unsafe(no_mangle)] -unsafe fn maxi(data: &[u8]) -> (u8, u8) { - if data.len() > 96 { - let f1 = maxi32(u8x32::from_slice(&data[..32])); - let f2 = 32 + maxi32(u8x32::from_slice(&data[32..64])); - let f3 = 64 + maxi32(u8x32::from_slice(&data[64..96])); - - let Left(a, b) = Left(data.get(98).copied().unwrap_or(0), 98) - .max(Left(data.get(97).copied().unwrap_or(0), 97)) - .max(Left(data.get(96).copied().unwrap_or(0), 96)) - .max(Left(*data.get_unchecked(f3 as usize), f3)) - .max(Left(*data.get_unchecked(f2 as usize), f2)) - .max(Left(*data.get_unchecked(f1 as usize), f1)); - (a, b) - } else if data.len() > 64 { - let start = u8x32::from_slice(&data[..32]); - let extra = u8x32::from_slice(&data[32..64]); - let f1 = maxi32(start); - let f2 = 32 + maxi32(extra); - let f3 = 64 + maxi32(u8x32::load_or_default(&data[64..])); - let Left(a, b) = Left(*data.get_unchecked(f3 as usize), f3) - .max(Left(*data.get_unchecked(f2 as usize), f2)) - .max(Left(*data.get_unchecked(f1 as usize), f1)); - (a, b) - } else if data.len() > 32 { - let start = u8x32::from_slice(&data[..32]); - let extra = u8x32::load_or_default(&data[32..]); - let f1 = maxi32(start); - let f2 = 32 + maxi32(extra); - let Left(a, b) = std::cmp::max( - Left(*data.get_unchecked(f2 as usize), f2), - Left(*data.get_unchecked(f1 as usize), f1), - ); - (a, b) - } else { - let start = u8x32::load_or_default(&data); - let x = maxi32(start); - (*data.get_unchecked(x as usize), x) - } -} -#[unsafe(no_mangle)] #[implicit_fn::implicit_fn] pub unsafe fn p1(x: &'static [u8; ISIZE]) -> impl Debug { - core::hint::assert_unchecked(x.len() == 200 * 101); - x.as_chunks_unchecked::<101>() - .into_iter() - .map(|l| { - let l = l.get_unchecked(..100); - let l_ = l.get_unchecked(..l.len() - 1); - let el = max(unsafe { &*(l_.as_ptr() as *const [u8; 99]) }); - let i = memchr::memchr(el, l_).unwrap_unchecked(); - - let n = (el - b'0') as u64; - let l_ = l.get_unchecked(i as usize + 1..); - let el = max2(l_); - (n * 10) + (el - b'0') as u64 - }) - .sum::<u64>() -} - -#[unsafe(no_mangle)] -pub unsafe fn p2(x: &'static [u8; ISIZE]) -> impl Debug { - core::hint::assert_unchecked(x.len() == 200 * 101); - x.as_chunks_unchecked::<101>() - .into_iter() - .map(|l| { - let mut l = l.get_unchecked(..100); - - let l_ = l.get_unchecked(..l.len() - 11); - let (el, i) = maxi(l_); - let mut n = (el - b'0') as u64; - l = l.get_unchecked(i as usize + 1..); - - for i in 1..11 { - let l_ = l.get_unchecked(..l.len() + i - 11); - let (el, i) = maxi(l_); - n *= 10; - n += (el - b'0') as u64; - l = l.get_unchecked(i as usize + 1..); + let mut grid = x.chunked::<{ 136 + 1 }>(); + let mut tot = 0; + loop { + let mut removed = 0; + for roll in grid.clone().find_iter(b'@') { + let nb = util::nb(roll) + .map(|(x, y)| grid.get(y).and_then(_.get(x)).is_some_and(*_ == b'@') as u8) + .sum(); + if nb < 4 { + grid[roll.1][roll.0] = b'.'; + removed += 1; } - - let el = max2(l); - n * 10 + (el - b'0') as u64 - }) - .sum::<u64>() + } + tot += removed; + if removed == 0 { + return tot; + } + } } + const ISIZE: usize = include_bytes!("inp.txt").len(); fn main() { - unsafe { println!("{:?}", p2(include_bytes!("inp.txt"))) }; + unsafe { println!("{:?}", p1(include_bytes!("inp.txt"))) }; } #[bench] fn benc(b: &mut test::Bencher) { let i = boxd(include_bytes!("inp.txt")); - b.iter(|| unsafe { p2(i) }); + b.iter(|| unsafe { p1(i) }); } diff --git a/src/util.rs b/src/util.rs index e781181..42b0686 100644 --- a/src/util.rs +++ b/src/util.rs @@ -6,6 +6,7 @@ use rustc_hash::FxHashMap as HashMap; use rustc_hash::FxHashSet as HashSet; use std::collections::VecDeque; use std::iter::Zip; +use std::iter::empty; use std::iter::successors; use std::ops::RangeFrom; use std::sync::LazyLock; @@ -1420,11 +1421,13 @@ pub mod reading { tenz!(u32); tenz!(u64); tenz!(u128); + tenz!(usize); tenz!(i8); tenz!(i16); tenz!(i32); tenz!(i64); tenz!(i128); + tenz!(isize); const DIG: [u8; 256] = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -2041,12 +2044,17 @@ impl BoolTools for bool { pub trait GridFind { fn find(self, c: u8) -> (usize, usize); + fn find_iter(&self, c: u8) -> impl Iterator<Item = (usize, usize)>; } impl<const N: usize, const M: usize> GridFind for [[u8; N]; M] { fn find(self, c: u8) -> (usize, usize) { let i = memchr::memchr(c, self.as_flattened()).ψ(); (i % N, i / N) } + + fn find_iter(&self, c: u8) -> impl Iterator<Item = (usize, usize)> { + memchr::memchr_iter(c, self.as_flattened()).map(|i| (i % N, i / N)) + } } impl GridFind for &[&[u8]] { fn find(self, c: u8) -> (usize, usize) { @@ -2055,6 +2063,10 @@ impl GridFind for &[&[u8]] { .find_map(|(x, y)| x.iter().position(|&x| x == c).map(|x| (x, y))) .unwrap() } + + fn find_iter(&self, c: u8) -> impl Iterator<Item = (usize, usize)> { + empty() + } } pub trait TwoWayMapCollect<K, V>: Iterator { |