From c483d0c6bff58d43a0167809c79305956ee8b7e1 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Thu, 9 Dec 2021 19:54:31 +0100 Subject: [PATCH] Add day 9 --- Makefile | 2 +- d09.cc | 115 +++++++++++++++++++++++++++++++++++++++++++++++++ d09_input.txt | 100 ++++++++++++++++++++++++++++++++++++++++++ d09_output.txt | 2 + template.c | 28 ++++++++++++ 5 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 d09.cc create mode 100644 d09_input.txt create mode 100644 d09_output.txt create mode 100644 template.c diff --git a/Makefile b/Makefile index ff463eb..c46bc61 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ test: $(addprefix test-,$(progs)) .PHONY: test-% test-%: %_test.txt - @test -f $*_output.txt && (diff -u $*_output.txt $<; rm -f $<) + @test -f $*_output.txt && (diff -u $*_output.txt $<; rm -f $<) || true @test -f $*_output.txt || cat $< $(progs:=_test.txt): %_test.txt: % diff --git a/d09.cc b/d09.cc new file mode 100644 index 0000000..2269d6b --- /dev/null +++ b/d09.cc @@ -0,0 +1,115 @@ +#include +#include +#include +#include +using namespace std; + +#define getmap2d(a) ((char(*)[a.width])a.arr.data()) + +struct map2d { + vector arr; + unsigned width; + unsigned height; +}; + +auto parse_input(char *file) +{ + ifstream input(file); + if (!input.is_open()) exit(1); + + struct map2d map; + + unsigned width = 0; + for (string line; getline(input, line);) { + if (!width) width = line.size(); + if (width != line.size()) exit(1); + for (char c : line) { + map.arr.push_back(c - '0'); + } + } + map.width = width; + map.height = map.arr.size() / width; + + return map; +} + +char getpoint2d(struct map2d input, int y, int x) +{ + auto map = getmap2d(input); + if (y < 0 || x < 0) return 9; + if ((unsigned)y >= input.height || (unsigned)x >= input.width) return 9; + return map[y][x]; +} + +int surr[][2] = { + {-1, 0}, + { 0, -1}, { 0, 1}, + { 1, 0}, +}; + +bool is_lowest(struct map2d input, int y, int x) +{ + char base = getpoint2d(input, y, x); + for (int i = 0; i < 4; i++) { + char cmp = getpoint2d(input, y + surr[i][0], x + surr[i][1]); + if (cmp <= base) return false; + } + return true; +} + +unsigned part1(auto input) +{ + unsigned lowpoints = 0; + + for (unsigned y = 0; y < input.height; y++) { + for (unsigned x = 0; x < input.width; x++) { + if (is_lowest(input, y, x)) { + char height = getpoint2d(input, y, x); + lowpoints += height + 1; + } + } + } + + return lowpoints; +} + +unsigned recurse_basin(struct map2d input, unordered_set & basin, int y, int x) +{ + if (basin.contains(y * input.width + x)) return 0; + basin.insert(y * input.width + x); + + unsigned size = 1; + char base = getpoint2d(input, y, x); + for (int i = 0; i < 4; i++) { + int new_y = y + surr[i][0]; + int new_x = x + surr[i][1]; + char cmp = getpoint2d(input, new_y, new_x); + if (cmp >= 9) continue; + if (cmp > base) size += recurse_basin(input, basin, new_y, new_x); + } + return size; +} + +unsigned part2(auto input) +{ + unsigned biggest[4] = {0}; + + for (unsigned y = 0; y < input.height; y++) { + for (unsigned x = 0; x < input.width; x++) { + unordered_set basin; + biggest[0] = recurse_basin(input, basin, y, x); + sort(biggest, biggest + 4); + } + } + + return biggest[1] * biggest[2] * biggest[3]; +} + +int main(int argc, char *argv[]) +{ + if (argc <= 1) return 1; + auto input = parse_input(argv[1]); + + cout << part1(input) << endl; + cout << part2(input) << endl; +} diff --git a/d09_input.txt b/d09_input.txt new file mode 100644 index 0000000..c75e923 --- /dev/null +++ b/d09_input.txt @@ -0,0 +1,100 @@ +9821016789345689876545245989999932987654349769898765104567898765634567899765432123788999891045698701 +7632145894234599987432134567898799999979498956789854323458999854323456789898321094567988789234987612 +6543234789345987654321015778987678987898987545678987634569899843212349899987432989679875678949896543 +7654345678956798765692126789854567896587898621567898545698789765103478999876549878998754599998789654 +8765496789987899976989238898763459965456999533478999768789678973212567899989698767898765989987678967 +9876787898798989899879345997652378954345987644567899878893467895323878989998987658999879878876567998 +6987898987689876789768959876543789993234599785698999989912457895456989878987898767899998767765456899 +5798999996579765878957892987984578989356679876789998692101567896569999765496789878989789856312345788 +4569899987498654567898901499876789678967889987896987543213456998778998954345678989775698543201234567 +3659789986329943458999212345987894569898995498945998764394967899989987893236789998664987656312345678 +2545678965439892347895425457998913456789654329434898765989898901298546789959899899543498765453456789 +1234568896798789456789434569879324599998993210125679899876789312987634567892998798992379879567867899 +0123456797987689967897545698765434987876789321234567989865695459896523498921987657989467988789878978 +1294968999996579898998656789876549976745898934545679876974489598765434789439876545878989499999989767 +2989899998765458789998767897997698865434567896898789995432378999876555678998765434567894345678997656 +9878789987654323678999898956798987654323456987899893496321267899989666789019896325679921234899876545 +7654678998765412567899999543459876543212369898934912985432456789999879894323998437789210345799985632 +6543568999654323456999897632498765432101458799329899876543569899985997995439896558994351456989994321 +9854567898798654567896789321239878543212345679498798997854679999874356789998797667895942349878989990 +8767698999899766878925459210123987654323457789989657998965989398765234567895689978999893598769878789 +9878989896999987989412368991234598765454769898878945899876793219876347698924567899998789699754965679 +7989876765788998994323456789947699876767899987653434678987894101987456999213345978987678987643434678 +6799995454567899987434569896899789989878978998762123789098999919598567895101234569876549876542123689 +5678989323456799876565678935678993497989767895421012392129998798439878963214395678987634984321034599 +4895678910167976987676789124569012976593656789532323679245987656522989954323689989876545695432234569 +3434799321279875498787891013689929876432545678993434568956798743210197895434567899987656987954345778 +2223789534569989329898999124567898954321434567989546979767898654321356789545679989998967899876456989 +1012578945678998910949678935678987895910125789879999899898998765432459997676989878999878956987867891 +2123459656989987921234568945989876789891234598767889789999649899543567898787894567898989347898978932 +3436578987899976899499689656798765676799345987655678678998767988999878939898923456957893236799989893 +4547678998999894988988998767998654545678957898743244569759889876789989923969212367898994345689998789 +5789789349987673976567899879876543234569768997542123458945998765678998799654323459999987658789989656 +6998993299876542987678943989995432123456979876543764567896987654589987678976434598989998767898978942 +9887894986987431099789992199986543434567895998654876678929876543498943569996565987878999878987867891 +8656789875698549129897889249897696545678934569765987989210987654567892456789699876569689989876545990 +7645878954987678998965678956798987858789124579876898999391998765678921239999987943489597898787434689 +5434567893298899987654667897899298767891035899989929998989899877889210198789876542123456789632123599 +2123678942109959876543456989999019888989186789891012987678789988994323987678998753244897896521012678 +1034589543212345987632345678978999999679997898752129876567679999995439876567899894556789965432123789 +2137897654323459876321234789567989656567898999643498765434567999987656985498956965678890986563234599 +3246789765434598765430125897679878643456789998756569876323456789598767976989999876899921987784346789 +4557999876545679898641236998789966532345899899867891987212345895459899899876989987999932398765659897 +5768954987786789989752347939899854321236998789878990195323467932378998789765678998989893459876789956 +6879543098899899879765458949998767432347897678989989996934589549999987678954367899876789598987892345 +7889632129978999769878569998769876543456976456799879889895697698789996589895256989865679987798931234 +8996543234567898754989678999654987656567965345898767679789899789678985456789345679654598765679892349 +9987656745678987643298789998743298777678954234987654545699967998799876789895458989765987654566789598 +9898787898789999732109898999856899988989432129876543236789656899893997897987667899879996532345699987 +8789898989898998743412967899987967799996573236987664127894346789965698976498788921989987621234789876 +7678949678987987658583456999998956667899794345698543234993237899876989899329899990199998710123898765 +7543234567896798867678967898999345556798989456987656786789379912999876788934998789239879823939999654 +7654949698965679878789989987893212445987678998998767897895467902987665677945987698998765439898998743 +8969898989754567989896899876789901239879567899999878998996598929876554566899876567899876598767897632 +9997767879543456798945698765899892398768456789898989879987679939875432345789985458912998987656789541 +9986556568912345987656987654356789987654345698767694767998789898954321234679876345793989876545997679 +8765432457893959898979876543245678998743256789654543459899899767899434348789965457989878976434569898 +7654321348999898769899985432123899987654569896543232498789987856798995679892396769876767994323498987 +9874210156789787656789876543012790198767698989692101987679876543456789989921987898765456789434987876 +1984321347896576545699987654125691239988987678989919976567985532345999897899598999876345699949876545 +2995432348954321034989998876234789545699876563479898765459874321248789766998439998765236789899975434 +9876543456796542129878969984345897676798987432365679876398765210123678955987645989854101896789964323 +6987678567897656298767456798767898987987654321234795988987654321234569543499659876543212345899873210 +5498987678998967987658345679878999898999865672347894399598765432345678932398767997654345456998754321 +6399798789899879876543238899989998789999876989456789212459976576556789543459898998785456767898765452 +7987659896789989998630127678999989679899987896567893101969897677679897659569989129886578898969876599 +9876545965678999987621234569999876567789998999879964239898798988989998998998678998997889949658987987 +9987631274798999876542355679987654345678939989998999398787689899196569896987589897698995432347899876 +9999820123457899876543498789898543234599649878987678987654578789023498785876456797549876545756998765 +8987634799598910987656569898765455125989998769876587898743434679234987654212356789432987659867987654 +7898545678919999998767898999874321039878898654322456987652123678949799765101347894321098792998996543 +6999657889209878999898987598765432398767789863210345698543234589998652976432456985432129891239987432 +5878968994398767892999763459876543987654598754321239789654345678999430987543479876549298910129876521 +4659878965943658991987642398989656798543459865434678998766556789987521987674569989998987621234987632 +3234989879892345789986543987898767929432123998765989659877677894987432398989678999887996545345698783 +2123699998789496892397959876789878912949234899876796546989788943596543459998789898656989656957989894 +1014568987678989989998999765678989109898946798987895432399899912987896578959895697645678969898979965 +2123456798545678979899987854569993298767958897699976541034987893498997989543934985434567899789569876 +3654567899434989656789876543458954987658969989549865432123456794579989895432129876323458987693456987 +4765878998745699967895998652367969876549878978934976543234569896989877789541034965434569876532345698 +5878999987658999878944349763456893989689989569019987894345698999998765678952199876545679986321236789 +7989398798867989989431239854567892199789893459198898765467987898987654567893988998756798765445789899 +9895497659978978998532345967678943239897654598976789876879886767897653678999877899767899876556895978 +8789989431299567897644459878789765456998765987865678987998765458975542768998756789898954987667954567 +7655978990123456789765567989899876769999979896754569899019876769654321658789546678969993298778943458 +6544567789236767899899698998910987878989998765443475698998989989643210145678934589654989109899432346 +5432345678945988912998999987891298989878987654321254567897694498754321234789123498799878912954321234 +4321234989856789923987899876789349998969899863210123458976543239865632355678934599988767899765432345 +5430129899767899899876798765478956997658789654431734567899854129876548766789545989877656778998545458 +4321239788978998798995459854357899876545678966545675678998765934987656878999769878965437567987657867 +5432998657899987656789345965456798765434567899656789789219999896798787989659898767894323456898768978 +9659876545699986547893239879767989854323456998767890998909878789899898997545999656789214356789899989 +8769985434589997656792123989979876543412397899878921457898767679989949876434398769898901234589998991 +9898767124567998767891012995989989872101289998989762345987654568975439877321239898987892345678987890 +9949656012369899889952129894398799965432378987899843569898743678954321965452345987676789657989996789 +9239743223456789996543298765219679878554567896987654698769832367895932987565459976585778967898965678 +8949854337567894987964987674101567987669878965498765987654321456789793498976798765434567898987874567 +7698765445878943299899876543212346798778989874349876799776532368995689569987998654323456999876553656 +8549977656989654998754987894334587899899498763256997899897543479434568978999876543213797898765432347 +7632988767899879879543498985455679945954349854367898965999654567925678989456988654435678999897321055 +6543499878921998765432459876576789656891298768478999654298776778936899994345699766576789998765432123 diff --git a/d09_output.txt b/d09_output.txt new file mode 100644 index 0000000..3ac44bd --- /dev/null +++ b/d09_output.txt @@ -0,0 +1,2 @@ +468 +1280496 diff --git a/template.c b/template.c new file mode 100644 index 0000000..080340b --- /dev/null +++ b/template.c @@ -0,0 +1,28 @@ +#include +#include +using namespace std; + +auto parse_input(char *file) +{ + ifstream input(file); + if (!input.is_open()) exit(1); +} + +unsigned part1(auto input) +{ + +} + +unsigned part2(auto input) +{ + +} + +int main(int argc, char *argv[]) +{ + if (argc <= 1) return 1; + auto input = parse_input(argv[1]); + + cout << part1(input) << endl; + cout << part2(input) << endl; +}