Browse Source

Add day 9

master
mid-kid 3 years ago
parent
commit
c483d0c6bf
  1. 2
      Makefile
  2. 115
      d09.cc
  3. 100
      d09_input.txt
  4. 2
      d09_output.txt
  5. 28
      template.c

2
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: %

115
d09.cc

@ -0,0 +1,115 @@
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_set>
using namespace std;
#define getmap2d(a) ((char(*)[a.width])a.arr.data())
struct map2d {
vector<char> 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<unsigned> & 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<unsigned> 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;
}

100
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

2
d09_output.txt

@ -0,0 +1,2 @@
468
1280496

28
template.c

@ -0,0 +1,28 @@
#include <iostream>
#include <fstream>
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;
}
Loading…
Cancel
Save