## ~pmikkelsen/aoc2022

9c3cf3282287aabed6a216a533c5428714e1b29c — Peter Mikkelsen 1 year, 7 months ago
```day8
```
```2 files changed, 157 insertions(+), 1 deletions(-)

M aoc.pl
A input8.txt
```
`M aoc.pl => aoc.pl +58 -1`
```@@ 27,6 27,7 @@ solve(4, Part, R) --> parse_day4(Part, R).
solve(5, Part, R) --> parse_day5(Part, R).
solve(6, Part, R) --> parse_day6(Part, R).
solve(7, Part, R) --> parse_day7(Part, R).
+solve(8, Part, R) --> parse_day8(Part, R).

% Time the stuff and test that I got the correct answer
% It will print the time for each solution, then a 0 for the first fail,

@@ 46,7 47,9 @@ test(results) :-
solution(6, 1, 1707),
solution(6, 2, 3697),
solution(7, 1, 1447046),
-	solution(7, 2, 578710).
+	solution(7, 2, 578710),
+	solution(8, 1, 1736),
+	solution(8, 2, 268800).

%% Parsers for each day

@@ 201,7 204,61 @@ day7_command(Path, [Dir|Path], Fs, Fs) --> "\$ cd ", line(Dir).
day7_command(Path, Path, Fs, Fs) --> "\$ ls", nl.
day7_command(Path, Path, Fs, [dir([Dir|Path])|Fs]) --> "dir ", line(Dir).
day7_command(Path, Path, Fs, [file([Name|Path], Size)|Fs]) --> integer(Size), " ", line(Name).
+
% day8
+parse_day8(P, R) --> day8_grid(_, G), {day8_hehe(P, G, R)}.
+day8_grid(Width, [G|Gs]) -->
+	line(G0),
+	{ length(G0, Width), maplist(number_char, G, G0), !},
+	day8_grid(Width, Gs).
+day8_grid(_, []) --> "".
+
+number_char(N, C) :- number_chars(N, [C]).
+day8_hehe(Part, G, R) :-
+	length(G, Height),
+	G = [First|_],
+	length(First, Width),
+	findall(V, (between(1,Width,X), between(1,Height,Y), day8_visible(Part, G, loc(X,Y), V)), Vs),
+	( Part = 1
+	-> length(Vs, R)
+	;  list_max(Vs, R)
+	).
+
+day8_visible(Part, G, loc(X,Y), R) :-
+	nth1(Y, G, Row),
+	findall(C, (member(R, G), nth1(X, R, C)), Col),
+	% Get the paths
+	A #= Y - 1,
+	B #= X - 1,
+	length(P1, A),
+	length(P3, B),
+	append(P1, [V|P2], Col),
+	append(P3, [V|P4], Row),
+	reverse(P1, P1r),
+	reverse(P3, P3r),
+	Paths = [P1r, P2, P3r, P4],
+	( Part = 1
+	-> member(P, Paths),
+	   maplist(>(V), P)
+	;  maplist(day8_view_distance(V), Paths, Dists),
+	   product_list(Dists, R)
+	),
+	!.
+
+day8_view_distance(V, P, D) :-
+	day8_view_distance(V, P, 1, D).
+day8_view_distance(_, [_], D, D).
+day8_view_distance(V, [X|_], D, D) :- V =< X.
+day8_view_distance(V, [X|P], D0, D) :-
+	V > X,
+	D1 is D0 + 1,
+	day8_view_distance(V, P, D1, D).
+
+product_list(Xs, R) :- product_list(Xs, 1, R).
+product_list([], R, R).
+product_list([X|Xs], R0, R) :-
+	R1 is R0 * X,
+	product_list(Xs, R1, R).
% day9
% day10
% day11

```
`A input8.txt => input8.txt +99 -0`
```@@ 0,0 1,99 @@
+220311003030020403303010231542401043011111536600504555130543502251500155511123400111142111343321103
+112300011121001442140224403450400301003445152052111053406435260452010444113124523432423300221011201
+030210134102431134241312344101144221020600111540536441502615542526153154322105541510214043131203100
+030101204414334205055102335112246411105640305204415413550445035636165511302522134021011341010042300
+231333121332014225332001232453144631040416204620146621036153421503540461150044430323330010312004330
+313004122100223501210053543222333364566250521251132261434210544505630145430310211300234000331011113
+012412044210025224134545004132405043251661531641253433253260055031356132633542211515154121433313333
+223403114014255555503000342035532635342046556443773774444450206405043632662330550032142542032211310
+100242031223054535004460205122361434151616645373551326734736364332154140655340554322211502021301422
+431401423325414423503035443254641056037467637176755423251235366605645121661130561335005033241143132
+303223123304431041420426563622516421776753123353756124574661615471604435005422154332445143042340424
+320243144004444013251031465604646513135642442262575441115642435263165223031065313000204222125412104
+122002131150055031454645120263773775533157351513157276612761513114315414102323430550452520223024322
+442400504041420321512465200531646152466567424527451215215141725631467534743125652340253015312012211
+304232133233542213221531357775467547373337162134833471236477571463472456124542445620504144015151422
+312145240500031634266120023623337132742563423256554635742447513652312413114404640563132134245504334
+102241141135325653546102133652773114325462366462547647422525733353647767521436321451530122543005443
+144343141455144014314467421341365346542347332643357578865825554673752135624114640556506602451350232
+441243044020543461441135565544322184758342838378753352744524773578231564762432525625353423431225210
+304443143022414225106232772261446675445426335438555646846447573843847251274211636600312256555303142
+303004450304246266227631711622523887473687878273335526667757385748853425345333774363212605153132341
+231541553335163641412412276128558625882683583258732273355654747663247263774611741645413153462012134
+512540106462151644671623764557535533877366255767846535753758275354368484766426475560164140560220332
+200325003256216624167373756725753386556464596984476493863565874285358286562141147544135646330340152
+521423426045110455366477454336662744636375686369848368855656338766535868252365342245652406663635444
+325143246625651366452465566472785577755464486833753685334599777574426367357427766647745534646000541
+142035142614357527172664626867286864497656647539574736765863985878668537672332143435672354342402200
+402115663021231111473735247274463488788389969399794455838777463866665252277554546567456140205305335
+414425135566351623353185335555739586888579945549558363373688586773657582484573717756461526021030021
+153405106165521616675638523724787758457498763486869486593486777373353973322655234123422714165323213
+002454525531472631474628833245565848566559859575785679756548368396867676276727237652414610661211503
+302304255114244361477257533433435655836968776565755564555784764387349895587874476525477240213363411
+000553414531611151674483872897383653598648797654779776549854495335546648627287687525577125431314005
+204232400564226421567584754598534645844885494584598457845957476555468784847282275342654247302314615
+045115061065473766727826528379367838467987998655957448955985448979477345343826276272532415200621434
+550120546646177774768543785974894546878959965974654898945999699595899795644635465425136225335645046
+556302536577536445475544794655563486856474558879957857474886955958533847988473852683676313440303640
+100626413557777634338424498589945894456646866588958979857649598485767686537762876484212352433166343
+242525032474643788477744736865977694759486568659756698755867877857994399566938462833351471633304353
+332244425455234733677627699765738456769446855877656577675969585695578538879868362272556755663030020
+046343213215513556668558775536566645456859558759858557585895694767986879363445872877411424542656650
+515331306274442182557527878856554588685785787696597767559877799855448956494486733433633675325030100
+342114227666721672883353894985987947695867576665575699796996867698487579875567433487831322744642364
+540065045713275583625867884979954845798686769595688655769979798559495959557938387255665736254225032
+106205316767657824665283537587768649899978685567877997998657967876867864959943625835831345425516321
+110141463114412578736753573994676759986999796769898976765559575889778477944885863665286231467300203
+644032125671346284562455445368556987856977988668777677796898765568994566565589365633833145272453334
+460545273256573436862249486376479568675877557889666967997785859858746988837693345878347636472512302
+342136331345115866465777476676554569688888678887879976969695978894988799695783654776835454112416212
+434225025543222743684868583694765776998689789867696786677896555888665675748388754436555342746720235
+636263555721237243768239677534647848856975986889687766699966676679495588667869627586668724667334426
+633103343364326663552898385566948669767567777777999689999758789694789754646685445856262555511451232
+152145115364274535448634885836688875775568656777977988887669866875889585488434323387357647235164321
+606561462261137874756796373755847876579796979986676786689789579968644748868566647685775135531406152
+410250253465337574644637536938599968796887596787787967977585565898468798949444464466542361454714064
+030544155175617533452288758984968478476689989798699966779765685659747585749847462537423313543216612
+611401537472217227872537567338475586486768666798867797877569576955557776366336886758327422461410414
+415330416246627536224487793957998488548995797977587956859855675947744645474575444827645213327445433
+463326543611137332345267589896759656899676956979677665577987898996486683785757677647531261533654450
+551354362237277258784359489837398969895865988995889897577896657978979937354834372675456336454226041
+211262361766132756683339396694359447645468869756878976758868954645658869839363758464364262147012651
+301064110125426286655552939776685894477488897677856895895975986758997464544986666756833565662202556
+422031301621157472683222989636778884967989975889756595697987999874964343866593357583726217334026440
+142162412763327353674277446679689849644977997798579559589469468868677755456373377468464732726265153
+526160541173717212627575863388387774875486479777676797468597655477966799599657444765465675456652011
+251165660644352242558682573366746386656597499567586485569867549988967847556528856227561237366411636
+244163004465433222484736846657978585756446659594884487687847788788366864385335623365445517314254620
+434110322132544652235686444994547888848564645978698549679559986658353774636353287547513235651412653
+212416233634562415626658545256839386835478785947498686995967444949889456536728324373112557601534261
+435434454616326145423432683478946353936357589848746499574966735497735646648468758347532775410534343
+024550535014447554553372238424959848484777465879954794488985494338565352746235455264773556034542015
+313351426410311176275387482682544444446955766744958787746868936569764356824257673616131462100422002
+312201400320061134162664385482788738548983499889989775337437639475985783638433415171251751440654113
+154531401000612474551545724587863386473895446934738887837768466589654784428788774456346346103620323
+541513516605546126517714738734486588386863574753885799977634778859444263746451367234673456125542350
+324542015440362755526154738573554235444678994388498686678788494494784867244816715767735422644331340
+521510135354356155436547615523735566855649894646878476694473459843274232545441522235602025363620520
+532345411630014517561247224352264584734787368663753568537436638536834367641132615221036214614105230
+130500010532446521724141343744446577753367224554979338988268627277568778757764223635125423346352240
+005211030240423160452722537744523766476268564266686267267868488672377778241537344633406316523222053
+401031212322536165661332777724644222584548667585266553282236873353822564255646212515321264655335000
+132050350131063034245353542636634248567866466782822733368854442875738634517754337605264326323310552
+242055145053551300641665774617717158484378377847863722225235683876346726415335576520434133423315140
+420212431450462115612104535173257643832557837826233786667255842463474555124456032603252542441550451
+101143034532526023313401212777267175116483624466566678638424736755742575654354414153232603110043024
+004112000553532226456602061357464774411621253576768283372377472122417645272222265456426540303044330
+000214140151415353051123241641452172357611716354273226363355267157417641644250131530261244033002212
+314433040204132402111422555355165354124166712274546472647636332665351566642543566162041224054110430
+120030403353224333631161514616621361515441672717213326172637617441126174245110550454053211154510143
+044113301243535050630534325651052732333667672334663256444256677252744553434143625412515552022242411
+212301204302220222103310242332364247143553146724275737653536435375450216300335034255232215432400044
+100214223250210102122355012452525521151534667317437271422273165610411234111153420355224541411214011
+102220004040333521144201535252045402043667711456465135367727200341240201205445503433001025222412401
+301132133014323404415304656535542542535034524663742746216234614446555616434144505534244502220323201
+001313232330211424313343111141503353422354166003563125012466532322024064101325131033325024441212011
+333243322424341532020111415135040623435040550552365600044314634602153465313205551350413104214430410
+200313334322431220433010514521302362614466565330411136330544661330564424123435134010442411101434301
+213232010014424311402320410540520055056234623535443416222222052412461442122102342224042420233001132
+211331340224211003504115003251531130611161462410255033600306643200341042155441434302113114300301010

```