This commit is contained in:
zuckerberg 2022-12-11 11:03:36 -07:00
parent 260263b472
commit 43e24c6db9
4 changed files with 237 additions and 0 deletions

99
days/8/input Normal file
View File

@ -0,0 +1,99 @@
121212011303121030310342042402330124244111344151215543452341031241241020400101112013333020112100012
021211021113201200034023433130134132413414155334115143443355322133444324121312404302011201132211211
112100131112221303204244242431121003451531135255455445141455432541312201002214304203010313110102221
020110213013113103013204332232423553543445433222155153431441144442133012114241240204113022033210212
220211123123023221431120203212535513244235435131233452411353515142141342420233430124211033211103201
201022331320201202140104411413522115413213345254535252552153334555534422544330002102424023033322310
002011111302111311312434241323154521232411313453434133354341132333115133343011222312043111232231222
013200323000441302142430153512351514554144243134335236231323244242514241141543000044010321332222320
030100102011023442422335322343425254455155645352466333266624622411411531253414114432034034311131222
322030202043440231214443243242233422366246622362565344565233563555324325333511154331042320111021203
213003300414441314312513553152343433222235343463444622556454453564615122442121152433110144401122122
021322211313341320225244345212526464422556233255442242524636654565546141313334241514223301121200020
200002004321134302434442521521345336526234552642236565226243663554552342241443523255344432431132112
112123334441323144345534151556562252635233363355224653254253523344642442351332145221300143332241010
022320131410010151254142156636463345252452625423376754343432433653322245664252425413321040141302232
213010110022111155333545424663525462442454635436533755536636426266424643655512213435531304111222000
130321001200011144555214565543554643256537345337535434444635673532262633225653144544344432301332432
022001420212325411453144445434236254466446337636634543774555355374353662522435224132353244034031000
002330010431341554551434253422254276654743665367455334457473364473622344254456352551331135411240234
312302212143534422423465564263334474566667447435655556674563544344656444223542363235332253222404014
212121032141343134355434224534464675674454653637667644577377433543363445523354433252255211144312024
032232100153554252235624563224356655547365457745734763767533657435437475664325434442351433444413432
110200301524124453246544643533747547556475446575748877586377673774564455425343566541443431232401214
401423221442241424632554334447574565754568668848564545648588775376576657452244522662354432522131430
104434155511311263462424433673653733578444556668584487456756485643337355375433336556353432343531212
232312213322425552554325453754633766755865457774587845874856686753435335647736522565231415412413211
431001313425254645265623577666433748788645854658656747656847848685876376476452325453225544433534043
313010515252544635324244436374454465476587445778467648477556767674587735374763224263634154351324340
144012455355126524425677566774755774557844864767878874787745686455847654436466543454462444251355032
000424311444526324323553475355554746544864774656675767558855668566488767334344352635356531552442234
013342542545525235236366465754548568775676857795999885788785445466456855736374463562353442551411143
311242111152354425663445553378875855775477957697697578856798848566484877333477545525362635425135332
341433232336543522273555566685786646768568869658667859787755556468565557473633366352553433511511241
200113144455442526465477677487545446885795579597859665775997897975488858867346567332543224253422254
321322215536436463377577768487764477789778877885995868965678966676487767568444576663626645634432310
443312521324223555545636634855747678676887796567769797975557659998448677554734374642453342212431515
411525331432266364737736458775755877785596969568668977556998758996667657677735543737262252641333145
442522353464222643737346685584745598686858597889698887876897967879654657446543634637433266563152432
454243531252525455465534878756559675878866666799676687797788596788597656655885633463554433643143535
254423532244235655655733654475546977569587699768887776679688866766759778548883343347646235554115351
314314544653622563457635588785666699859596886897989897689788798876985987846687577376763532335135532
412142442632445563355677548756466696866899796677677889898887669778596858564457554576762226623533152
332242122354466554535565547487598955988896787986776867776877888955599984888475443433742663453323444
144151346544425765674636457564767658869896996679899997667979896767868998474585737643642635544533421
314415255322554774543648464765966788579669799899779987788989898667968687447844667337662354653241144
531151535525325346676758455659698557997896686798987988779868698785888786564857433665336664523341524
433523552663344344473467546666588759889896677787898898779776878975758958484784434645376646243431411
515135226664626774436754686667956875999777879798898978998697788977889685548778857447736246224344422
145435565465625543633666766675858858766886989979799999899997668785989599567745864566755645326525215
451353163534546735577664785687859598879898988887899889888777867978579599658876447575744455463535421
224133454534644344357668774586679766688667987978788777787978767996768679587486553753676234444243145
212224343354636435353376785568986575788667679879987787799996968667996977844764744747546562653555311
533215146234664535345776886669575768966898869977999998888778799896585966878485433376437563225631352
511524423463344353364385568455757877769888788888799787979869867976859678654676857776376644445445215
351234256625356736743655474675867598588879869899999799789878697766889955677655765744675453466515352
334415234234535577366766846485775897899678799797988789798686779975797678558486666454465242325255315
141341534526526535446644587564577966676787678799988989799997999875957694554787466435645653653555414
313324416232534373476357468674589657599899799798689797986786698995665798657574376535655252364222345
311221544446655446757777886865788857567967696689867999769799886898598995658847463557355652223224412
455533545356434343353337767878785976765769968899769879969687867689997585485648456367636362352431235
344444353536223353357778884687469798765676998669777968698779855796996985778555675367324552333255445
051125313425464566733636456767476978655987889896897676668688798768558878654457367667555264222423551
353542241453466263566466444568785959568996966999897988769675557699898764775776773566735422341532411
022324211323442654554445655776687576866866899996988868898585669578658688644533765553546656434125445
114453323344233423677473675646888489555668785777968786767598875656578848476447533734652563225415414
114422544242345362734473678567647667869987569695895789896698699557445648854544743436662644341252531
121342551166453322745565437644747478898555998668897895775999796995587786474657764352544656531442143
303141113253266635447343344867888466769679588758558756866968688847688674876656737744543462242255453
211553143135554522563734546548487876869685667557688879976567575866584774455433565742656362424324221
124145331431636546255374743445654474455696878969759677857655988487587487353655433225556322453333301
212244412131664532653366547437778778757756559965879758976787487565565586665457556563646654415332511
011305211242465446332773543655556877674464555978676866698775787766666456756644432225665434112311020
004241221433546245432264563633447545674557677448454476555877787756767637433767625564453222213212214
310343115521416426645326746575333484685764464876676658588877654688747777476753344453622354123212043
140122345414213664253233365647757664866655755465564678758484884488574665556644653435636451242442431
244102135324345326634353374375547456884585456867666677454868468687435553747753654545544441144303342
432104041214342544334655425474547463448788757857558655488554466655536543533544446366314241124214112
323340324334354443354245236535677365643457874448486874757456574363667673472262365365211122323243114
430330302152115233222436253333446747553365334585488745577537474744744537762432632263215224143034311
311442302225213454546466432534566554436677736533674654344734776664563675555452243452512224320440414
012223322322424155255455565223573376357653457774454463735446656766537352553544256234512225223230043
301040234123443123232563623663643633535443553744547733637676336764634633454454353153253554114310123
133230222202333125332643444534665265775555366656333664577746375536432522432632352414133321233403141
130131122340253113451232453334526422447633735643377464757575366556545326434445112532143151333444233
123141143123235144241534634442646462453347557645744747744444465243533265534335312135141342344141402
003321424141234554211325444625623263425263674757674335463664556352656232255214521252351130300034201
112312001424231145115555432333342644223335545625473535264242623526263634466325543223334324011234121
000221124024240324421331531356324362422542263363234455442425223655564222213351113145440100221140111
033311243403013332514242224522366666224344244563634356355445532225333344231213331535121420140433130
303323104303402340514525522211134233445565565244563523544534354246644545425131313341424434300003032
011323012002420122421144112234234535335555456426433464426356545662531135434153435334430024313303120
031202221220044224202355531555315433255252442366562265422542236431311515541243440113402324302332130
201100001202303212021041315334534534143533633663456666642564224231354441333414120340321342200233132
221201212012302142404132243444141351134325452546423522255432534112215145442242342110400232302021322
220223222003322321422133444521333545342441534125321334411524122521525135453342042001304403200303321
222220302103313411301404030054314141423224422211413131115533525334423132133412232211310121021132101
122003101321113124242202433422213424522545354542323525531511234344125550023302132204220012211210020
000112201313122024204100421340022524132134142432553221315323551243135131212431102431311323201221002
020202200133011113024021012122001204231413324533351552454535514252231001424310042133312311233022121

74
days/8/puzzle.txt Normal file
View File

@ -0,0 +1,74 @@
--- Day 8: Treetop Tree House ---
The expedition comes across a peculiar patch of tall trees all planted carefully in a grid. The Elves explain that a previous expedition planted these trees as a reforestation effort. Now, they're curious if this would be a good location for a tree house.
First, determine whether there is enough tree cover here to keep a tree house hidden. To do this, you need to count the number of trees that are visible from outside the grid when looking directly along a row or column.
The Elves have already launched a quadcopter to generate a map with the height of each tree (your puzzle input). For example:
30373
25512
65332
33549
35390
Each tree is represented as a single digit whose value is its height, where 0 is the shortest and 9 is the tallest.
A tree is visible if all of the other trees between it and an edge of the grid are shorter than it. Only consider trees in the same row or column; that is, only look up, down, left, or right from any given tree.
All of the trees around the edge of the grid are visible - since they are already on the edge, there are no trees to block the view. In this example, that only leaves the interior nine trees to consider:
The top-left 5 is visible from the left and top. (It isn't visible from the right or bottom since other trees of height 5 are in the way.)
The top-middle 5 is visible from the top and right.
The top-right 1 is not visible from any direction; for it to be visible, there would need to only be trees of height 0 between it and an edge.
The left-middle 5 is visible, but only from the right.
The center 3 is not visible from any direction; for it to be visible, there would need to be only trees of at most height 2 between it and an edge.
The right-middle 3 is visible from the right.
In the bottom row, the middle 5 is visible, but the 3 and 4 are not.
With 16 trees visible on the edge and another 5 visible in the interior, a total of 21 trees are visible in this arrangement.
Consider your map; how many trees are visible from outside the grid?
Your puzzle answer was 1801.
--- Part Two ---
Content with the amount of tree cover available, the Elves just need to know the best spot to build their tree house: they would like to be able to see a lot of trees.
To measure the viewing distance from a given tree, look up, down, left, and right from that tree; stop if you reach an edge or at the first tree that is the same height or taller than the tree under consideration. (If a tree is right on the edge, at least one of its viewing distances will be zero.)
The Elves don't care about distant trees taller than those found by the rules above; the proposed tree house has large eaves to keep it dry, so they wouldn't be able to see higher than the tree house anyway.
In the example above, consider the middle 5 in the second row:
30373
25512
65332
33549
35390
Looking up, its view is not blocked; it can see 1 tree (of height 3).
Looking left, its view is blocked immediately; it can see only 1 tree (of height 5, right next to it).
Looking right, its view is not blocked; it can see 2 trees.
Looking down, its view is blocked eventually; it can see 2 trees (one of height 3, then the tree of height 5 that blocks its view).
A tree's scenic score is found by multiplying together its viewing distance in each of the four directions. For this tree, this is 4 (found by multiplying 1 * 1 * 2 * 2).
However, you can do even better: consider the tree of height 5 in the middle of the fourth row:
30373
25512
65332
33549
35390
Looking up, its view is blocked at 2 trees (by another tree with a height of 5).
Looking left, its view is not blocked; it can see 2 trees.
Looking down, its view is also not blocked; it can see 1 tree.
Looking right, its view is blocked at 2 trees (by a massive tree of height 9).
This tree's scenic score is 8 (2 * 2 * 1 * 2); this is the ideal spot for the tree house.
Consider each tree on your map. What is the highest scenic score possible for any tree?
Your puzzle answer was 209880.

55
days/8/solution.nix Normal file
View File

@ -0,0 +1,55 @@
with import ../../util.nix;
let
input = map (line: map toInt (stringToCharacters line)) (splitString "\n" (readFile ./input));
input' = transpose input;
visibleTrees =
let
# counts the number of trees visible from a starting
hiddenTreesLineDir = l:
(foldl
(acc: x:
if x > acc.highest then { highest = x; out = acc.out ++ [true]; } # visible
else { inherit (acc) highest; out = acc.out ++ [false]; }) # hidden
{ highest = -1; out = []; } l).out;
hiddenTreesLine = l:
mergeLists or (hiddenTreesLineDir l) (reverseList (hiddenTreesLineDir (reverseList l)));
hiddenTreesGrid = map hiddenTreesLine;
hiddenTreesRows = hiddenTreesGrid input;
hiddenTreesCols = hiddenTreesGrid input';
mergeGrid = f:
let
w = length hiddenTreesCols;
h = length hiddenTreesRows;
in genList (i: genList (j: f (elemAt (elemAt hiddenTreesCols i) j) (elemAt (elemAt hiddenTreesRows j) i) ) h) w;
in mergeGrid or;
countVisibleRow = l: sum (map boolToInt l);
countVisible = sum (map countVisibleRow visibleTrees);
# number of trees visible from each point as a score
visibleScore =
let
getCol = x: map (l: elemAt l x) input;
getRow = y: elemAt input y;
left = x: l: reverseList (take x l);
right = x: l: drop (x+1) l;
visibleCountDir = treeHeight: l:
(foldl (acc: x:
if acc.stop == false then
if x >= treeHeight then { cnt = acc.cnt +1; stop = true; }
else { cnt = acc.cnt +1; stop = false; }
else acc) { cnt = 0; stop = false; } l).cnt;
treeScore = x: y: v:
(visibleCountDir v (left x (getRow y)))
* (visibleCountDir v (right x (getRow y)))
* (visibleCountDir v (left y (getCol x)))
* (visibleCountDir v (right y (getCol x)));
in map2D treeScore input;
maxVisibleScore = foldr (x: max (maxList x)) 0 visibleScore;
in rec {
part1 = countVisible;
part2 = maxVisibleScore;
}

View File

@ -41,6 +41,15 @@ let
if isAttrs v then [(f n v)] ++ recurisveVisitAttrs f v
else [(f n v)];
in concatLists (map (name: visitor name set.${name}) (attrNames set));
# merges two lists of the same size (similar to map but both lists are inputs per iteration)
mergeLists = f: a: imap0 (i: f (elemAt a i));
map2D = f: ll:
let
outerSize = length ll;
innerSize = length (elemAt ll 0);
getElem = x: y: elemAt (elemAt ll y) x;
in
genList (y: genList (x: f x y (getElem x y)) innerSize) outerSize;
};
in
lib // lib.strings // builtins // utils