~pmikkelsen/aoc2022

9c3cf3282287aabed6a216a533c5428714e1b29c — Peter Mikkelsen 1 year, 7 months ago 0b5af32
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