~xenrox/aoc2021

777f9de1c97225faed0b9aeedc7e3b3bdafcdd52 — Thorben Günther 8 months ago 57496cb master
Solve day 9 part 1
5 files changed, 193 insertions(+), 0 deletions(-)

A data/day09.dat
A data/day09_test.dat
A day09/day09_test.go
A day09/main.go
A day09/utils.go
A data/day09.dat => data/day09.dat +100 -0
@@ 0,0 1,100 @@
3567891987643457898879876567896543567999831045697654564567923989994345678987678789732349887675978921
2458910976432179987568965456789732679898753234598753213459205978989234899875467679549498765434569530
0199891987651099999699864346678901236799874447679832102398919867879345698685353568998999654323678991
9987689997543988942987954244599932345679975998799993219987998756567956796543212457896898765512356789
8876599898759867899876543123989893456893989899998789398996789645458967989954563568965989997434667990
6932465779998656789998756439876799578902398799987678987975696532367898979797678979654979876598798991
4321234569876549896569968998765698989653998698994569876564589643456799867689989989769865987679899989
5210156789965323597459879998874587898769896587989678995323578956567989754567891299879954598789998979
4321345899876434589567999987923456789899765445678999986414789967979876543488910198998767679899987867
6632397965987545678999999876212345693987654323567912398924567899899989764579329977899879795967986459
9543989894299866789987898754101656892198765214568903459435898979798999875789998756989999893456796598
8759878792101979897676987643212567894239899399979214567986789765687989989899889549878989901349987986
9898765689212591987565698654323459964349978987899935978999897654245678996947679698769979932598999995
9998654569423492989434599765434567895598867456987899899423987542134599875434568989654667894987987894
9789743458975989876325989976545678987697656349896798778912499651013987997645679876543458965976876792
8698652456896978965439879898876799398789543298775986567893599973129876798958893976402979976965345891
7597543467899767896998965679998895479997652109654323479994989984234984589767912993213567899879866920
6498794698998457989876534569999976569876543299865212569989876797545999679878929854323989924989977891
2379898789876345678921024678987898789987856987654323457976545987659898989999798769574567899798989999
4456999899765456889532125699896789898698997899765434567899432398798767897535699998765689987657492478
5578999921996567897656236989765678987569798999876645698957921239987656789649987659977799998743201367
7689689890989688998798759876524589765456659789987786789546890149876545699898999543989999876543212457
8994598799878999339899767998435678976342345678998987893435789349765434569976898932395699987654326568
9012987643456797123902979876549889887201956889769698942329895467976787678954967891234989999965437679
2179876732367896014594989988659997654319899998754569321018799578998998789123456789349879899896548989
4359865321298965123689892198768999766598678997653698932147678989859999896346569896498765789789679997
9498763210245954349799651099978989898976567896542987654234567898745899965487978976569654345678998986
8987654321239895498987543987989679999432459789693498765445679997656789876568999987698786467789987545
7899875434398789987898659876594568987991234678989999876656789998769897988979989998789987578999876434
6531989546497678976549898765423679876789545789767898987987898999878976599989879989999898999767997645
7432397659986568997932999976512398544897656899959987598998987999989765322398769879898769456989498867
6543498798775457889431098987624987632369767929898976439569976789999854310989654766789654349894329978
7654569987656345579943987698899764321248978909797895323457895678929875929876543245678921235789412399
8765679976542136467899876559987654320136799998676789214568954567919989899877610176899420126897543999
9876889987431012349913987432199766872345789987545795323459543456798998769754321398999321247897659897
2989999987542123567899877643019898953489899876436989435678954597897899659876432345678992348998798765
3599989997654344567998765432123989876578998765425678956999978989986899543989546797789989459359899954
4698979998865455878939998765234568987989987654314567997896989876775678932397656898899978978998999965
5997767899876666789323459654345689798995498765323456789985398765434567891239789999998768999887989876
9865456912987989895457998767858789649689349986465589899965269894323788910199898989987659998766578997
8754319899899198998667919898969891234589237697877679998764356983212669921989976878999846899542467898
9865456789765347899778929999989910346679104598999897659975569862101457899876795467897656987431298999
9976777895986456799899998999998434457895323679876998943498778954212345678965789346789879876540139898
8998998954987567897956987678976595978965455789765689899999899965323486789654567999897999987621998786
6659989543298998965344986567897989899876576897643476798789939876765797899865678987986567898749876545
5349867994039579999123975456789876789998697976532365698699421987978998949878989896575456899656987634
3298756889123459878939765345998765699998789765431234986578932398989459134989898765452345698768999523
2197545678939967967899874239877674578939899998420125987899543999797678999795698654321246789879998434
3986434567897899879997985645965432349649989987531349998935959898689789987654239765530124578999997645
4994323978976799989876976759878653468998767987642498989129898769456998998562123987641436789999898867
9875413899765689998765987868989965678987957899999987778998799954349887789421045699532647999789769978
9975326789984568949984398979099876789896548789878996567897659895459765678932156798743498987698754989
9875435689965989239876239989299987999765435699767423456998946789569874567893278897659999999549865998
5987749899899892049954345799989998998843323789654312599899834596978983479954399998998789899432977897
4597656998754679198765456789879789976532012698943201987689656975989994567895989879549697678953989945
3498767899843598939876567899765679865432124567895329876598967894699865678999876768998546568964590234
4569878978932467921987798999654578987543236689997435985467899943457988789998765449876323479987689345
7699999568901357890298899998843459899854457899876557897589965432356799899989854333985454567999789499
8789123479953456789349912997672699689765698912987668987699975431234898999976543212987565678999899978
9893234567894568997999439876531987578976899993498789098967896945949987678998765323498686789889999867
9965445679965678996788998987610398689987901989569892199656789899898796569999965434569797895678998756
8987896893496889985437987896321239789998999778999943987547898788789653467899879545679898934789349432
7898987942987999876545976895434549899999987656789994976432987656679732567893989698789999655891296551
6799898931998979998959875689545856999889976543499989984521298645578901246932198799898789867932987867
5689769649899758789879754678956767897679865431299878993210985432459913459951099912987678979999898978
4569998798799645678998763456968978987567987320987656789929976421567895598892989893976568999989769989
3498899899698934569898542347899999995439876459876545677898797533678999976789576789865459789878943294
2376789987566899689797655458987999986320998767966431256789698754789998764593445899879345698767892102
1235999987345678998659778969895498765421239978954310137996549965898889865692136901998976789456789264
2348969876459799997549889879789329876432357989876521245894321986987678976789029212987897891347894395
3467942987578899998634999989699567999943569795987432656789210197896546987899198933986789930456989989
4578931298689999899324799996588989987894698654599545867895423298965434699998987899865578921239879879
7679549499895398765435678965466898776895987542349657978999564569876986792397976798783467893398767956
8989698989943239986586889984345789654997899651298789989398979678998997891986545987632348965459854543
9998797678987458997697999875235799843689998910129891093297898999549049992398939876543567896598753652
6789986569896567989788987654356999754567897953256992129986767896432135689987824987654578987965432101
4579995445789879878999998976999898975678976894345789998765456798743546798776501298765989599876543213
3498986323589998968999989899878667896799875799556999899654345689656787987654312349989795467989754354
4987691012478987657898878789765456987899864678977898798765467899867899898766423756799654367899875565
5986543123567898946997654598654347998998743457898997679877568999998998769987534678978975256789988677
6987663248678999858987643569876767899597652368999876565989678989899987645697685989769976347999899898
7999854357789998767896542354989898976439763578998765424598789878678987656789876999659899869999789919
8998765469899949878989750123498969598929854689129873213659897654598998767895987898998789979898678901
9999879879999832999679971334597653469898765793234964302349953212387899878934699987987678997657567992
9987989989998721023457895499989432598789976789549875463598764301256789989123459876543589876545456789
8876899999987652134568999978678921997678998999799986654789975432345897993234567989542499987632345689
7654698989998543245979987856567939876567999102989899865678987543456976789345679898743459876721234678
8769987678987654346789996543459899987679789212976799976989398764689565678956789789954698765430123569
9998798582399765458898775432376789899889678929865689987993109865789454567899898697895899876521234567
3987654341349878579997654321235679765994569998654567898943212978894313456789976546896999989632376789
2498765210234989678998976492346789654323458999765679979764323989932102568999975435987898799843497997
4569886345695699899899989989959996543212356998986889768975434598754213479239894326798936598765567896
5699997556789789924689999877898799754901239897899997656899545679865674589998732107989323459877678965
6789898767899891013579888765789678969892398776798965345678959789996786679876545212378901266988789323
7998759978912942125698769434134567898789997654357893257789768999989899789987687354567892345699899212
9876532199909943286789654321023678987679876543234789357899879239878998990298798865679943466789978994
2987694367898765497898765432335789989467989862125678969987989498657897892989899976789955577895456789
3498986456789976567959876543566899865346995993013489878976597987545656789864945989898766698934349899
6569297678992988798943998678797897643219864987654899989497456986531248999943239899919897979210245678
9791098989321099899532109899899998856424965699766789994398577895432346898765356789323998964323345789

A data/day09_test.dat => data/day09_test.dat +5 -0
@@ 0,0 1,5 @@
2199943210
3987894921
9856789892
8767896789
9899965678

A day09/day09_test.go => day09/day09_test.go +14 -0
@@ 0,0 1,14 @@
package day09

import "testing"

func Test1(t *testing.T) {
	res, err := calc1("../data/day09_test.dat")
	if err != nil {
		t.Errorf("error calculating: %v", err)
	}

	if res != 15 {
		t.Errorf("wrong result, expected %d, got %d", 15, res)
	}
}

A day09/main.go => day09/main.go +40 -0
@@ 0,0 1,40 @@
package day09

import (
	"fmt"
	"log"
)

func Run() {
	res, err := calc1("data/day09.dat")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("Part 1: %d\n", res)
}

func calc1(path string) (int, error) {
	heightMap, err := readFile(path)
	if err != nil {
		return 0, err
	}
	var risk int

	// assume rectangle map form
	lenRow := len(heightMap[0])
	lenColumn := len(heightMap)

	for i, row := range heightMap {
		for j, point := range row {
			if ((i-1 >= 0 && point < heightMap[i-1][j]) || i == 0) &&
				((i+1 < lenColumn && point < heightMap[i+1][j]) || i == lenColumn-1) &&
				((j-1 >= 0 && point < heightMap[i][j-1]) || j == 0) &&
				((j+1 < lenRow && point < heightMap[i][j+1]) || j == lenRow-1) {
				risk += point + 1
			}
		}
	}

	return risk, nil
}

A day09/utils.go => day09/utils.go +34 -0
@@ 0,0 1,34 @@
package day09

import (
	"bufio"
	"os"
	"strconv"
	"strings"
)

func readFile(path string) ([][]int, error) {
	var heightMap [][]int

	f, err := os.Open(path)
	if err != nil {
		return heightMap, err
	}
	defer f.Close()

	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
		rowString := strings.Split(scanner.Text(), "")
		row := make([]int, len(rowString))
		for i, v := range rowString {
			row[i], err = strconv.Atoi(v)
			if err != nil {
				return heightMap, err
			}
		}

		heightMap = append(heightMap, row)
	}

	return heightMap, nil
}