From 28dd0d4cf582f81aeca05d066d75afd474e860ba Mon Sep 17 00:00:00 2001 From: Andrew Lalis Date: Thu, 8 Dec 2022 06:54:52 +0100 Subject: [PATCH] Added day 8. --- input/8.txt | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/s8a.d | 57 ++++++++++++++++++++++++++++++ src/s8b.d | 40 ++++++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 input/8.txt create mode 100644 src/s8a.d create mode 100644 src/s8b.d diff --git a/input/8.txt b/input/8.txt new file mode 100644 index 0000000..15fbc4e --- /dev/null +++ b/input/8.txt @@ -0,0 +1,99 @@ +200200221023111313131033314121142013103432145142351212334232423210101340410243413011333312111010010 +021002023301222221234134021422342024344555521535143232341414552024224120114233210330203002020100112 +120000123021210023111321143114331115334535223455511513445233523154411102203411040133312002213001021 +110211312303200204232110124204135453554533435152342542252215415141133330323032234114310011301232202 +112002122201001100330432244432552555524445123151222142521452233321152332132412434434431321322021220 +000131233030332102140440124221314455255431113413445553414144524134315351524134030112312012102102122 +011002120310213142402320144522121125454423123245535451115134412543215113433312403430132101003202030 +001221312201314442411333454131552331253553254425236334643151355314514413411344034432330410221101023 +133033302114012204213054544541124453214232545523665466356466451514332142121512400041213432211332332 +122103100320433433403313515121232352332442555253656542336644235234542522322522414400320014312110331 +220032121143103434234531224315451255225362634256634623342624242245654341134514413144333113211200033 +320112113344013332224131114231235263526556625325625352254643224563365551253353323542200003301120011 +130332114433413215333445212514445445656665256554333534422554442522234433415533124353022320300112030 +122220320003402342433443415465352622564252264442264334335624365224645544545412124352220434440211220 +012123032311134245212342233263346563632453535355553473445564362634252543555515242444423232000444220 +210332422344222154315435122245243633424643346345734336333746422324336263624544151122442021330341202 +122113144440445232235222443563362625543565533465377647363543377645634552632254214531354231413432430 +312340402310532324322313244522226622547366756445444754767335355365264622465662241215332253310001232 +203342203201331433144542522354633356376457563745333765735577477354743263423666625212251354244021004 +023132211325442531332565334564256663665357767653737436565453774766335532544656254552332354313323032 +104344140125552254523443534436547653753334746356364664565677777637444474643245425325454224440231203 +030303323422144551254256535247737377634445575474654433333453643564664344462332353234553115322142242 +043342223454513255464263333566337576377476354884845654658465735544446646436232534263314313142020101 +340311214411551345423466343646644336367654787858788857666654635337366537645634644263323112331404131 +040141315333331565455545334767475747755574585547567756844746644445646736447635456236413253453410130 +211021153443415666656253646443465373878486485664464485545486846643475567536535465634262415153200040 +434443334231526223353563373464374574547886487867474546748668788886554566336675234542522151345414431 +342100553111533623655466757467553555676668887764575574556755884875687334634675256256443425223423211 +421145141552463255552236436455476686566587654558577848647854485587448337355756554555544211113112433 +401034232152434624233754647737667758845867866675595798957488447876578774367337742646625521543244120 +201414142512656264345465456536564477766677986565767776589758477664747866666435364642236343442335143 +422042442525465325256445643735574646548578959977866889666586787677748745536646677524242544332243420 +101531424154626224664754337344565457557999965875599965977796778866568855445766577565632633451545144 +111515354125252635577747557658555488765757696767797558565755699985844788764347763523465333315513212 +222334234142233522754645544788567846579566995878775676667979868685866578655574543564453254615121150 +121552233464445256557546467767485865866888757989977669966767877786686475874646454752632664243132511 +412242332564644335747746348878865677677797755798669796798699855757865564547645373677564252625352445 +104135225262634344357677645645458796767865979969889676688676788669777674757634454746666526341145313 +021542323626266573437334685574765967759968767697666876767887775889896866845887736736426556541522241 +321245255565266675757675486554868969567677786789686889669988776968557656488476534636744443443445532 +424153123565322534465577464547665888797687899787966868666667897595997786576655333657432563645515114 +151513345354454444763668544475487669995769769878776696968966788666679588686556634737544644543232332 +315411214333624753546345646876778875556666766899787967667988799866697798768788653774352466325322155 +411515135354235576553778556478657685968679689776697889878966888788686556488744645555636235464132151 +521535123365535747465567756884789758877668899777979788877786896957896655744848765333672323354342345 +511122245466262643344764588545559786677866787999989789989769786875585659588677463454335226643415231 +234355522634365636744684556586586576767676868898988888987788888877768767654646777776645642226512141 +113123464223654555566666486667798785887896678897787899778677766996769787745467865757755656543512345 +513251343243554753654655574645569758987667887877878998789898989677659987488676836733553556554225344 +514313564242345475335768454478576556889868687997999987778988866675979779845785867656464634654245123 +114315542426623675675378664848688856798777688977789877988898769769667968885864643357435456442515251 +342223563236537773664686558445968779787887987788777777899877867865678669767686535536743642245412355 +125543254543547353647388564555887588899766978788778797797796898997787999888766547554567344424443422 +235522554554262346774664445787579599869688998989778778978989968998575857577865454747575353226552114 +222421136654623646474466478475666768686777899887878779887688896658596779765485853765563356364225314 +521231534444644737467764858748655998796879877877788879799986898965697856444748453437553352232525543 +451421316463534654736364878868555996777987969978898798976796968858967778666788533743354325346223354 +353521254635223475773456867765596786879787787769889887896999898885688596454456655466765442452131244 +112452332645434776643548885574558878789797669769989989886877966757566586444578445673434665652431423 +125112515242255354574555588568695879785886989867778677698879979576678878668587547744623644323213555 +222335123454333544773645644774469985799577787667779799699876685666756857858446357667422332624342332 +342124352633564466565447655564575889567797869876686996679999868665879886844677564455723264641334552 +211531121363532576364535865484865759689798698998996686966767965765789787447464533667726322444223531 +003112555432534436636776465475555776887557956877687879969697585659596546865447775565562326263355343 +433244413454525566563634447454784577659787856568996976596789778896764874668454673456462646455545115 +315114535444536635475346535567864558579958679557799758766667597987857466754537555645552424625323424 +041544243435426366744535764674465545875655656695956899997569789788477547755346553676234364525135211 +110125213453624243247556736654454474595787967599557857997699578855767558775435554762633446551353134 +230513132216566245267463366654684755868756978975659588575959655686655788733345435522656542222543322 +042134352115436525535436657767864645756586865777685969969787676584458468744346376522324323225232212 +113011555414226244554676353335845564485568555689599656977797776777868787473376444245355443123441231 +141222553351554636564756467565656675455484874698998587887767666457458846465776554544333612224555323 +410201213345143434422573347343756574748746464486554485756685477655667634334766422236535313341542224 +400013155121116452255553534765374544884448574876457458645878446585657476536357256436654223345343132 +142320132432156443246333547553474375466866456765867768748787675644755677446563663223424341524352200 +130310433221343524424456477364543647448885475465487864674454548867635637545422424333245424354220221 +104443025533452125362252625375463664447488646447874885476567646456653665465543643663511122334514003 +302020415314212533664642446555554345445458887778858887685645576353536647674424342553325334543032421 +241431045353353251642363462546445336355737566757557674865573447644353353564422462552323432524142311 +123213233322144323666345645436644754537635574357377674465747755476333656624223243445125521412332331 +012331042212144212425325652566536457633744775665435737646677453634637335562564643341411132411032042 +312330023343231454516256365325363757435647543374644573757667446466553456424326532235455225410011222 +330440423204155515131264636336326536353437335474474464535536754457526344465446535213522513202431334 +111010303340451214252454445262262654354536464545434674354557674362552463364322545323344220103312142 +011012340310414525221212256242445654336566374374366636534765356655652454533664444453134140113204011 +230024312112245355233251252646423364546365646735756334573543653656365434363633141223321213032042131 +031001023032240425233144214253446244556226622634747362226456645266342264223215113131540112130410110 +322123043034044225552242443355356433432465646225242242422346453346634325254325435535313321413201023 +022331002231110112224233354325624225342363424426633436565344545533465463152555421312331102120410200 +013020314334233240543141441351342432435423252532545655664253435662546145412112135314414140233322202 +023101011114024240134343343214355543453244325544366633232356362353335431215322232434231302030012200 +121203223241323132430512521115213312263253263242264335335446352453314333354413113210133333212120303 +102030123234100043232214342352345452215246465634534464364425653323345231332311444434220444330131120 +000331303323044244144032522114521112125142214553424464423124453113211413324230342333130021200000221 +121203123313224230334312325441234431451535345453515132125413445443323514321330302200100022013232311 +000221331111234212331404233225332533323225131525322111443344452254442544201223424140243032213101301 +010202021330012103042021024434411545123253214353525251521434235541535344240243403200122322133122101 +121102231211003113342040440404003344542241345133131133414435235243325441120032344431223311313111221 +011210032333020312123124101444102341443212553521355222414135533333310320012002223342012031112321112 diff --git a/src/s8a.d b/src/s8a.d new file mode 100644 index 0000000..b303e35 --- /dev/null +++ b/src/s8a.d @@ -0,0 +1,57 @@ +module s8a; +import util; + +void main() { + ubyte[][] heightmap = readText("input/8.txt").strip.splitter("\n") + .map!(s => s.map!(c => cast(ubyte)(c.to!int - '0')).array) + .array; + int width = heightmap[0].length.to!int; + int height = heightmap.length.to!int; + ulong visibleCount = 2 * height + 2 * (width - 2); + for (int y = 1; y < height - 1; y++) { + for (int x = 1; x < width - 1; x++) { + ubyte tree = heightmap[y][x]; + if (isVisible(tree, x, y, heightmap)) visibleCount++; + } + } + writeln(visibleCount); +} + +bool isVisible(ubyte tree, int tx, int ty, ubyte[][] heightmap) { + // Check top: + bool visible = true; + for (int y = 0; y < ty; y++) { + if (heightmap[y][tx] >= tree) { + visible = false; + break; + } + } + if (visible) return true; + visible = true; + // bottom: + for (int y = ty + 1; y < heightmap.length; y++) { + if (heightmap[y][tx] >= tree) { + visible = false; + break; + } + } + if (visible) return true; + visible = true; + // left: + for (int x = 0; x < tx; x++) { + if (heightmap[ty][x] >= tree) { + visible = false; + break; + } + } + // right: + if (visible) return true; + visible = true; + for (int x = tx + 1; x < heightmap[0].length; x++) { + if (heightmap[ty][x] >= tree) { + visible = false; + break; + } + } + return visible; +} \ No newline at end of file diff --git a/src/s8b.d b/src/s8b.d new file mode 100644 index 0000000..b384a0b --- /dev/null +++ b/src/s8b.d @@ -0,0 +1,40 @@ +module s8b; +import util; + +void main() { + ubyte[][] heightmap = readText("input/8.txt").strip.splitter("\n") + .map!(s => s.map!(c => cast(ubyte)(c.to!int - '0')).array) + .array; + int width = heightmap[0].length.to!int; + int height = heightmap.length.to!int; + ulong maxScore = 0; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + ulong score = computeScore(x, y, heightmap); + if (score > maxScore) maxScore = score; + } + } + writeln(maxScore); +} + +ulong computeScore(int tx, int ty, ubyte[][] heightmap) { + ubyte tree = heightmap[ty][tx]; + ulong up, down, left, right; + for (int y = ty - 1; y >= 0; y--) { + up++; + if (heightmap[y][tx] >= tree) break; + } + for (int y = ty + 1; y < heightmap.length; y++) { + down++; + if (heightmap[y][tx] >= tree) break; + } + for (int x = tx - 1; x >= 0; x--) { + left++; + if (heightmap[ty][x] >= tree) break; + } + for (int x = tx + 1; x < heightmap[0].length; x++) { + right++; + if (heightmap[ty][x] >= tree) break; + } + return up * down * left * right; +}