diff --git a/08/input b/08/input new file mode 100644 index 0000000..59841ff --- /dev/null +++ b/08/input @@ -0,0 +1,99 @@ +222100000013112132123310430431410000421233203434334433324302430012114211021123030010201312000120201 +101021021033011112103044112003343322403423454241342342345211525113333240020143443122030210310022011 +220101001133100310002411002043420103515231215523212315435342111245041142130232312400222030320100112 +200122221230321133044100332034021325535145544344545253525534243453412331214043304401230010020110000 +000011200031133111412421443430224551211135242142233535513155431423245220314304114203010112113003022 +200110301031330240043404212112151455211214554251222423224121251245551231544200332324141021101302320 +211313310001120421114110031311134411225441423121215412315242313455445215433103243003331323232021210 +113023232323114232323200154111555445211221521564442455324451241134422414442353242422024301202303200 +033103132121042304342321133113123442114234244262244362254636514423544554241131340043413001103230111 +222130001131222313011514241155115431453566353362523635234523544443331545242212110302120041131331000 +122003333203421424243423241241145242362425662245243454434463245655424513432355342413342304140323132 +200132001433233414535423533545455356266563252323664634454642325452632535414233213444024120224001312 +103022000024242042232345311151252366645245625425252254664223635666456554424455255314414201023100202 +011123314401132331522443121124243332365536553533653266524244535435555642241321424311440431140002313 +112211332222044342251223514432453246552433654362667575535222222434424332333535551325510210012402111 +012034031201422433433544333435332354236525757766675753775672443526635625666411211315313431001211021 +222131010444144222113122265646535633254344346447355664747364675464264442356435454343134203131301320 +130204300400253551553414543245455464767455566634465767776436634753554635546252415422554253212302111 +003420010011545433455324656653655336363754663777466766534773337737564264622226622152541532444043422 +222443443245214511144624625533466765654637646677673764377774656447545424634555552322232123102200221 +131401122122541311136443466423774374674674644356633456444637564653463756534425365511222235542400434 +020304120343231311655625465655375336347635537637356474737537736475747664453654642435444421312003441 +330343204414214144663432532273356366677365344448485644668544447556754747333244226622353444432431203 +013032001213332124643646542366473765434545644448468456647846863656675334773653446336233442425343443 +032304344311244225545253365465763653568645444468586475857554557364567345453456433425434524425320340 +404422443241453445422422553656467636467787445444464844587867767885464476337762322652643443152400310 +423240415535414656342334546645767686856678584786777647846875755758745674346466423542354114134214444 +011030431533245543654555435345765747564477644667658776568874577764754567666746242522425334235523011 +304141431155466443263644746373647747866875877747665747457575464455646775674543326443642441231224201 +131114441112334443562775355733455774775467784987985795575544877666455543676676766355422441315441324 +430314423542533443234733353445778486466878667959585558576994644485858886644666446446534452214325144 +234043255111363462227473347477688468584489685978769565888875968868778767543673677363352531435143524 +332514411423345463663744673467787665769687998556765798696889899888747474874533436436252246354342354 +343351353455545565635555344675547864877967899959657795679897665768887566875734464464265463133152220 +304315235446623534567454757568755564666595669996877688899968576566787884766634473546655234425154332 +102434355126466525455775354887868447559596877755866959597666867668558485674655477534335455431433112 +122435322353564665545357554686754498985569558877879689779956877758645856774754544465455555411345432 +205343122436524456576336444487867565768865559989677777796577669975668468746773345355325355462321544 +244421231222553435356653847788488675876678988776997676698897689969586845444476467776346464255425235 +011141212323222656564355748565568698959878768999769698979687856698985667477447735736764436662535445 +341532114624343674454664747878669755789998777768669876776979978586767967487477444333746325646435514 +332225232253533547565768678777599889889986786676898889796886795899776746658866733634625566222131221 +452115152353553475665558585658666677868888996889998779787687898769796898574684366444335464566131241 +222451343363565554437346767558895565959796776666688967696988666679956757766466653747344422662412441 +352312532554653753433645874848668779969867679887889979966988777858759985688847467477436644343221314 +253453523324622576773348855746776868699997976897788898798988697688759757656674457764653663435535551 +255215136645533637445568746577666855796996998878787787989997666766965555455644774737474254653535431 +224553242555543337334785854657996797787699767987987877987767789767987655676757876444754463423354514 +123154243466644666546775557579585989696788969989777778898979998897985697866556637766477643365644322 +554211453455627676754574468848856965688687898898898987897889687869558659748577474654465642432212231 +121545355642566434543444766876559558799969877778988788897996978967956568566568437553533324624643533 +343533523352453757643688556467889769997789877997988888888997869785799657747877636573466342443313343 +514522335642537537375788876657768698786777789799788789989868878986986599667677637644366254666343342 +445132523635445577344646447787655657998679778899778887789986767685689896766667567376634235626522255 +531432262653342445554787675779556895668677679888998898998979898688885658645488775453563263324444521 +244354252355562565357375758886677896998668697778978777786868797957956585645446465464342453536315311 +331332542346565453565468588687898988998899678777778888987879896766957964458684767674732342255112134 +323222553252555764467548647586787989698798867966879898766777967895559878445748535555772564352323121 +222112256556444766665645575857868775966987669678797778989996976999597964558764436354464354454115511 +231521425424626436644777445867799777875677879667696879686889969989898845765485563646336643234131352 +355133253664246535564564876446795699978678666879799996766969886966786964656655463556453424246325411 +032153423465433637445644746455668795767666979897978979967667987866677885867645774566445534632451125 +023153145454343367456365744778545786785687966678788897768987767885867756448666544363445625242522531 +433143232524343347377744757586847855967999597666986986999686668885676754478777454637243455342311532 +041445134126223465774744566767745475776968756578667896988697555595776655546733433735653653432132233 +221512433144443536474554676654665445558779696796579879876998998776465745558346764543545453644144545 +331424235262424426737544466746485788568786659757689559959759667768655887786744476475525364623425533 +320451531315362426576743675876464666456576667575695897756879976656668566874643454335445262114444554 +433151555354653533355456563775468744778576966965557755996597568885868445653464345446225342143132550 +214125323355543252463774664575887864646475575755776587586666976564488546433557465425532665321234540 +200323512352523254535467534457646558758856986957578658768964788848786647657766457454556542424151320 +321332134211123223226667643735764455548668485865685588886847485767774746455657633463665254121412001 +012234315531464554245247467735667568768477464845687764665675656887448367475433732636565224541321012 +301234542341223435424426747367366544565566848548747578766588788767885775664437356522235353533143014 +334003331234445455322432564335463367457486487588666685866765755644646453645643652462624434432442422 +042143134435444325324432335637663775578547578854666475667787688784544634336532242223445252453531242 +310411334152432163553225536747773333656667455878457766657566745435666777454323262242612514451104020 +240402042351343515263253256753473577367758467858666457875545437655464455452535563554421221153321201 +140230434512144443255324466566375735664375475557548858557333643346544766626556653552352331343211204 +103332424311424141626635455553663773455334335637373374565743454773345777455425656462325511551200242 +300034243213121311233252524644436354656563557344777363377675636366463362642532235453325525444412244 +212242021025345333222565653434654746356455755667665757547556664465433533346662654353424311001014101 +131101234311553242452666635432665533633753765643655666636643433754534354353642634345311333033143214 +230232130130231122325124444645225546335344735745337356445573656773545235424533233332544531130001441 +203302312432313112332152223225462333636474337343366375747734333244655463653321433443325513101324303 +220234041400202455245214462454254525365333654447453545675644632235454662344232215321554320103020310 +200010034012032125113513354322342432455256556433373774556434252645545426455143411452141404444030212 +100330134044341121214144343523422253634565324653336633436226523634446353531514354335531412332131232 +130332044322000001512111255442345646456454345262564366666436346533225534443132355523003421120002002 +113132210324301312214421141434544636364655266265645646422544566424244551313122432513114113023320010 +112132020021120122422112434111115365555664632265464656245333363252541131215331552444402413142001121 +203112202340410440414115311114515245122424246432322362425453662652145112443553123122131302001031212 +230300331323432142203321123243444245342565365466665664464243251544455253512331101201042041220200212 +023003202312212103443344553251225314354244313342234634552312313531432211135354024130442013121321330 +202322100120313004402231123343531111133245451514414545333322414215353123341412440243322310212031021 +221023032132103304434414013211335214155422221314144114325152225215522555512120322411330301131003022 +201103233233322020210340012040333235122454154134514325421433512223435543144431413040233113023112011 +221021131310123213123044244400331522512444434344354343132442132331145324334003431424001200033011112 +102201030320220211144211104323434023533353133112145253453525542112011403201223032223120103003122001 diff --git a/08/solution.c b/08/solution.c new file mode 100644 index 0000000..fdce90c --- /dev/null +++ b/08/solution.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + if (argc < 2) return 1; + + struct stat s; + if (stat(argv[1], &s) == -1) return 1; + int fd = open(argv[1], O_RDONLY); + if (fd == -1) return 1; + + char *in = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (in == MAP_FAILED) return 1; + + size_t w = strchr(in, '\n') - in; + size_t stride = w + 1; + size_t h = s.st_size / (w+1); + size_t visible = w * 2 + (h - 2) * 2; + size_t maxscore = 0; + +#pragma omp parallel for reduction(+:visible) reduction(max:maxscore) schedule(runtime) + for (size_t y = 1; y < h - 1; y++) { + for (size_t x = 1; x < w - 1; x++) { + size_t i, score = 0; + char val = in[stride * y + x]; + int vis = 0; + + for (i = 1; i <= y; i++) + if (val <= in[stride * (y - i) + x]) + break; + vis += i == y + 1; + score = i - (i == y + 1); + + for (i = y + 1; i < h; i++) + if (val <= in[stride * i + x]) + break; + vis += i == h; + score *= i - y - (i == h); + + for (i = 1; i <= x; i++) + if (val <= in[stride * y + x - i]) + break; + vis += i == x + 1; + score *= i - (i == x + 1); + + for (i = x + 1; i < w; i++) + if (val <= in[stride * y + i]) + break; + score *= i - x - (i == w); + + if (score > maxscore) + maxscore = score; + + visible += vis || i == w; + } + } + + printf("Silver: %lu\nGold: %lu\n", visible, maxscore); +}