Commit 41a6625
Changed files (9)
2023/go/03/main.go
@@ -0,0 +1,145 @@
+package main
+
+import (
+ "advent2023/internal/aoc"
+ "strconv"
+ "strings"
+ "unicode"
+
+ "github.com/google/uuid"
+)
+
+type cord struct {
+ x int
+ y int
+}
+
+type board struct {
+ grid map[cord]uuid.UUID
+ parts map[uuid.UUID]part
+ included map[uuid.UUID]part
+ symbols []symbol
+ gears []gear
+}
+
+type part struct {
+ id uuid.UUID
+ number int
+}
+
+type symbol struct {
+ repr string
+ cord cord
+}
+
+type gear struct {
+ symbol
+ ratio int
+}
+
+
+func parseBoard(input []string) (b board) {
+ b = board{
+ grid: map[cord]uuid.UUID{},
+ parts: map[uuid.UUID]part{},
+ included: map[uuid.UUID]part{},
+ symbols: []symbol{},
+ gears: []gear{},
+ }
+
+ for y, row := range input {
+ var partSB strings.Builder
+ partID := uuid.New()
+ for x, col := range row {
+
+ if unicode.IsDigit(col) {
+ partSB.WriteRune(col)
+ b.grid[cord{x, y}] = partID
+ // only continue if not at end of row
+ if x < len(row)-1 {
+ continue
+ }
+ }
+
+ // non-digit or end or row after digits parsed
+ // part number completed, store it
+ if partSB.Len() > 0 {
+ partNumber, _ := strconv.Atoi(partSB.String())
+ b.parts[partID] = part{id: partID, number: partNumber}
+ partID = uuid.New()
+ partSB.Reset()
+ if x == len(row)-1 {
+ continue
+ }
+ }
+
+ if col == '.' {
+ continue
+ }
+
+ // symbol remaning, store it
+ b.symbols = append(b.symbols, symbol{repr: string(col), cord: cord{x, y}})
+ }
+ }
+ for _, s := range b.symbols {
+
+ neighbors := map[uuid.UUID]part{}
+ for _, c := range s.cord.neighbors() {
+ if id, ok := b.grid[c]; ok {
+ b.included[id] = b.parts[id]
+ neighbors[id] = b.parts[id]
+ }
+ }
+ if s.repr == "*" && len(neighbors) == 2 {
+ ratio := 1
+ for _, p := range neighbors {
+ ratio = ratio * p.number
+ }
+ b.gears = append(b.gears, gear{
+ symbol: s,
+ ratio: ratio,
+ })
+ }
+ }
+ return b
+}
+
+func (c cord) neighbors() (cords []cord) {
+ cords = []cord{
+ {c.x - 1, c.y - 1},
+ {c.x - 1, c.y},
+ {c.x - 1, c.y + 1},
+ {c.x, c.y - 1},
+ {c.x, c.y + 1},
+ {c.x + 1, c.y - 1},
+ {c.x + 1, c.y},
+ {c.x + 1, c.y + 1},
+ }
+ return cords
+}
+
+func solvePart1(input []string) (solution int) {
+ b := parseBoard(input)
+ solution = 0
+ for _, p := range b.included {
+ solution += p.number
+ }
+ return solution
+}
+
+func solvePart2(input []string) (solution int) {
+ b := parseBoard(input)
+ solution = 0
+ for _, s := range b.gears {
+ solution += s.ratio
+ }
+ return solution
+}
+
+func main() {
+ day := aoc.Day3
+ aoc.SolveExample(day, aoc.Part1, solvePart1, 4361)
+ aoc.SolvePuzzle(day, aoc.Part1, solvePart1, 533784)
+ aoc.SolveExample(day, aoc.Part2, solvePart2, 467835)
+ aoc.SolvePuzzle(day, aoc.Part2, solvePart2, 78826761)
+}
2023/go/internal/aoc/aoc.go
@@ -77,14 +77,14 @@ func (i Input) Calculate() (err error) {
solution := i.Solve(input)
if i.Expected == UnknownExpected {
- fmt.Printf("%-6d\n", solution)
+ fmt.Printf("%8d\n", solution)
return nil
}
if solution != i.Expected {
- fmt.Printf("%-6d ❌\n", solution)
+ fmt.Printf("%8d ❌\n", solution)
return nil
}
- fmt.Printf("%-6d ✅\n", solution)
+ fmt.Printf("%8d ✅\n", solution)
return nil
}
2023/go/go.mod
@@ -1,3 +1,5 @@
module advent2023
go 1.19
+
+require github.com/google/uuid v1.4.0 // indirect
2023/go/go.sum
@@ -0,0 +1,2 @@
+github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
+github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
2023/go/Justfile
@@ -7,10 +7,12 @@ clean:
build-all:
just build 01
just build 02
+ just build 03
run-all: clean build-all
bin/01
bin/02
+ bin/03
build day:
go build -o bin/{{day}} {{day}}/main.go
2023/input/03-e1.txt
@@ -0,0 +1,10 @@
+467..114..
+...*......
+..35..633.
+......#...
+617*......
+.....+.58.
+..592.....
+......755.
+...$.*....
+.664.598..
2023/input/03-e2.txt
@@ -0,0 +1,1 @@
+03-e1.txt
\ No newline at end of file
2023/input/03-p1.txt
@@ -0,0 +1,140 @@
+.......................153..988....502..842.........588.....441.468......481..........314...715.57............................163..992..512.
+............805............*......#.............%...............*........=......%......................#......*.............-....#....*.....
+........914.........#...617..201.........271.....671......52..898................847..........*230..215......393..%751....537...............
+..........#......361..........*...........*............-4.............165..609........922..133...........706..................*....552*127..
+490*..........................350...*...664........806................../..*...514.31...=........../25....%.................83..............
+....245...............805...........467.......449...+..............313*....115....*.......611.343............$...237..229...................
+........................*.....150.............*..............8.........511...................*........#.....837.*......*....*...............
+435.................688.8..............$......330.................474.......9.......736...........*...787........336...245...446.....916....
+...*.*....920........%................666..90.....786$..221.......*.....173.%.......*........@..25.98.....186#.......................*......
+.718.120..@.............$.931................*...........*....15...10....*.........649....&.542.....................-.......@.......106.....
+.............-.......794...................486.........209....*..2........252..........517...................250.519......274...............
+...636.....500........................878.......106.........487..*....819........353.........678.........../..-...............539...........
+.............................43......*...........$.......44.....881....*...662*...%................407#...612.......452@.286................
+..................................195..543.../.......75..............887.......43...396..................................=.............813..
+........$.735......590.998.............=...862............228......................*................+...%...........979.....500=......*.....
+......597..........=...+.........61..................878../....596......*........542../815....567.834..672.=378.....*...&.........#..981....
+...................................*618..998.........*...............716..........................................495.682..62..945..........
+.......915..............156.................$.......298........479........170............985............+90..../.............@.....&7.......
+...800*.............246*.........370..............................-.........*....639....*.....362.368.......818................687..........
+.........$.173............383=......*........389......................273....785.....514....=...*....*...........@..............*....446*833
+.433...227...*...-.-...............770.988.................738.523...*....................397....599..499...&..385.........*199.35..........
+...%........40.437..300../....740.........*...................*...........................................192......&....272............*....
+........#.................305.......318.608..609....*..............448......@...959*604....16*...../..............131............=..325.215.
+.980...85....*48......883.............@..............663.................128..................944.420...203.....................381.........
+..........887............*....434........725................958......367......178..........................@.779.........................986
+.......................591...*......964.*....713.140..........*..698....*......................772.......................914........223.....
+...........960.....*....................80.....#..%....456..824....*...138...939.........362*......488...572........663..&..........*.......
+.......+.....*...645.............%12.....................*.........692...............922.....902..@.................*........27..542........
+...792..242.702.........256..668..............613*479...329...................134#....*...................*545...375........................
+.......................&......*.............&..........................298.........696.................844.....=....................184.....
+......886=..................129....187.......850..*.....&................*...............358...130............500................@.....*....
+.............*54..112.............*..............791..215...787.........437..889..............*........584........../226......366...483.....
+.......47..........*....826.500..48......665..................*.................*.377....#...49.......$.....................................
+.196...*..........815......*..............*.....*...........571........297*...153.*....416...............+.....73...126.............111.....
+.......164............547#................69.503.743............108...............22......../70....36.....470................516....*.......
+....................................634................&.357......*...................275.........+................592......%....52.204.....
+....#943....843............544.......-.....96*139...640........694................@.........558......................*...........*.......104
+..............*....731.......*...382...................................../...%557..857......*....-................716..638./165...338.......
+......926....342../..........861............/......................#...768...................569..192...................*...................
+..272....................500.......*.........784......558..38.....786..........238.932%................/...827....841............76.........
+.....*25....=..780.74...........457....%..%.......806........*........&........*...........+..........53..*..........%.............*........
+..99.....697...$....+................601.757.600...........751........801......795..998....362...........431......&............797.860......
+....*...................50.579...............&...-.878.....................586.....*............587..216.......321...783....................
+...859.................@.....+.317/............34../...499.....904.991.......$....938......337@...*..#.................*.............130*312
+............707.266.....................156..9............*.......*..............................880.......787.........102..................
+.........*.....*................938*743...*.*..............195.........425..........869*.....448..........*.....73.689.....48..469..........
+......568.164....938........................964.......899......641.....*........930.............*...891....104........*...&.......*719......
+....................*..................#...........+..-...381......36.749...744..*......659...935......+..............694.....370...........
+........174........460............+..435........893........%................+.....500......$.............#......397.............*...549.677.
+....981.*.....&355.....960.......963..................543#.........................................971...483....%............428.....=......
+354..*................*.....752..................69........676..54.......531*......78....877..-950....%............346...........699........
+......265.....#......959.................846.......*...93............263.....974....=.......*............&........................*.........
+............857...........527............../.......29....@.846.......*.....................768..134&...571..........302...........512.......
+....$254.........397......*............./....................%....128.........*984.....693..................991...+...*.@....@...........228
+............335...*.....751......626.699............$118..............991..............$....................*...327.93..508.301......348....
+....387........@.266..............*.......................-...........*.......%...................260....756................................
+....*.....817..................726...391.....112..........273..997...197....667......./......932*....$........290...............711......560
+...488.....&....961.....170.........*..........*................*.........*........883..825......71..............&...215...........*.766....
+...............+.........#....$.....600.&.......674.42.................730.998.........*..................139.........*.........461....=....
+...#97...........817........86..........155..............759.....200.............827...163..........................499.....................
+.....................#.........................793*722...........................$..............&....725&......................442..........
+.............812....613.....892..........................464......430..%.....462.....%.......599.............555..204....219......*637......
+...544........./............&...............................*.......*.840.......*...994.797........52.........*....*..........739...........
+....=..................................713.304...161........186.................824.......-....=....*.......118.844..113......*.....872.....
+......................75.963......244.....*.....*.......466..........590....................208....363...............*.....872..............
+.............391.....*...............*.......843......#..........184..-.................................441......448.597....................
+979......416......114................306.%.........719.....792......$...........................#..........*..............603.989.914*......
+.........-..................975..670.....890...621...........*..........145..659...369=.@978....935........938...............*........107...
+................259..%632....=...................*......173...871........*...................4..........*..........&108.........*281........
+...............*................326.....732...528.../....#.............698.............316..*........188.888.................918............
+..512........507...............*...........*........440.........................938......./.254..313...............................422......
+....*............300.........430..354$.....884.701.......%....368............../....@480...........*..142.............305...145.61......106.
+.363..939.639..................................$...../....704.....835@...-776....................655.........645......*......*....*892......
+.........*..........*338................../........741........................113..895...............%..403.....*..40..992..2...............
+.................986...........927..%449.17............................182....*.....=......870......899........665.#.................949.189
+...841.........................*.......................................*...849...........=....*295.........420..............441.882.........
+......$..+.............124...993..........*...........*................365..........79.364................*.............414*.....-.....360..
+........159...........*...........457$....199......960.967...&...................................+......181.....+.......................*...
+.....................859...................................962.............912....#......330.....168...........904.....958*....213*583..49..
+........%.........*..........421..340*196..892.........409.................*....488.645...*..........#......................................
+.....802........116...........*...........................*...227........791.........$....203.....963..418................599+..........744.
+..............#.....-966.23.94...58..283...........476....722.......730...........................................@..700.......%788.........
+240%..........844..................*.-.........486............307............#49...288........&.329.............61..*.....................95
+.........#............148..446...........402/..........256.......................&..........573..*...................319.......763..........
+......936..............*...%.................................-....709...371...955..352............553.629....445..................*.........
+.121......445.347...455.......=....#....92..................367..*......*............@........881........*..*....267/.....-89......843.*782.
+......519.=.....*.........401.996.452...-.......-387.886.........982...149..910%..........81..-.........653..407......819.......@...........
+.....*.......950...448#....*...............&691......$......................................*....538..............681*.........560..........
+.....25....................60............*......................304*863...../.............103......*.........811..........923.......426.....
+.800..................../................974..............255..............958....738..............465.........*......181...+........./.....
+....*.....-......824....782........90...........+505.......*....903...................544.712.826...........800..........*..................
+...408..123...-.........................................557.......*....................@.....*....561.743............310..642...97*475......
+...............900.#494.....915.624............../..............508.....431.*500.........986...../......=....187........*...................
+...........................*......*....#741.@957.979.*................/..%................%.............................218.805......505*...
+...........................59.....595.................948...+........885.....*808...554.........70......827=.............................690
+...95........+......455.....................................776...........795......=..............&...$........349...............621*80.....
+...*....../.793..$...#.....................842..........898.........729...................698.......273...704...*.......451..%..............
+.......340......911......865.....876..........-...........*...%......*....676*498..424...-.......=.........*........241..#...967.......323..
+........................-...........*271..578...........734..8..692..435....................698.548.................@...................*...
+.....=......*..................131...........=..=..............*.............523.659...221...+........................468..263..395.408..757
+.....236....661...565*...........#...............228............287...448.......*......&......................=.........#.+........*........
+......................982.................$..........403*317.............*103.................454...#...311....588...................105....
+...72...............................246..991...../...........12................%.........271...=....668.................................*...
+.......348...259......$..../384.221...............873.......*.....560....&...686............*..................241............763........884
+........*...+..........848.................=........................*.....76......*....889..417.404...............&...538.663..=......61....
+.......446....948..805.....615.....303+.372..........893.......945...849.........861....*........*...187.980...&....../...........838.+.....
+...453...............*....*.....................357...../.........+....................506....129..@.......*..633.822............*..........
+......*188........495....732............635*.....$............219........65....475................811...231..........*..332%...212..........
+.................................*..........575.....-....591...*...420.........*...............................897.317.............165...762
+.............764..410.............438....*..........588....*.245..%......*.....468..........32..-714...456.........................*....*...
+..............*.......................516.552...366......416........166...552.................*.............../..126.........396.386....921.
+.......&.............67&........468................*.............................403.221.......433.....411..299..........457*...............
+.....539.......*287.............*............657/.457..............614........34*......*.....$......12*.........693.........................
+............908......@602..176..358..778...............72...-..............$..........161.579..................*................571*602.....
+...........................*............*799...........*.....118........788....689................$....../702..493.......117............%...
+.................337..496..504.......................519............#..........=....744........782...................625.*.......499.....576
+.......459..%..............................................28.....398...............*..............*19....#935.........$..845......#........
+.............707.....................992........289...481+...*..................3..234....822$.......................................#......
+..513.914*.........161......664.....*..........@..............922......$.........*......................330..............@...........798....
+..........378.................*..258...............219+.313.........836.....=226.566.....748....&...147*......872.......786..538.446........
+.....*827...........907....844.............684..........@..................................*..263............../....8..............=...*....
+835........$...88......*.........308.........*.....161.....621*327..-184....333.........@.473.....205..................................872..
+...*....340.............744........-.........961....../........................*449...740........*................867.427..251..............
+..988........@...................................................765..........................743......228...............*........942.......
+.............125..#...........406.........%.....837.................*.....609*.........%..........644...=..465*643....880..509...*.......453
+....544..........480.............=.........274.....*..148..583...821..........880.....492....535...@.......................*............*...
+.....$.......306................................287....#..*...........647.....................$........-......166.714....942..675.....657...
+................*....................673...780...........620..........*.........&..........=......997.465..........$.............*..........
+.456........920..855.913..............*.../.....325*316.......6.......208....486........715.....=...%.............................67........
+......*178..+.............686.59....871.................$......*.............................149..............238........634................
+....56.........385...648*...............*968..&.......732.....921.467........*.........479.........695*284.../..........*...................
+............56.....$.....675..746#.............384.................*......451.709................................%..939..265.........290*891
+................501.......................620.............900.......825.................258...387......21*40...273...*......................
+.......532..................................*....*....956....=....................711.........&.....................415.307....411......9...
+..............................314../......692.214.718.............762*461.....844*.....&.............973.675...80.................*143......
+...........365.......460.329.@......476....................................*..........926.....799...*.............-.........................
+..............*.297...*...*.........................753........700......473.765..............*....967........111.629.932....125.............
+.......+...261...&.......786.283....695.....486.....*......565.+................536...../....380....../124..%........*.........%............
+......339..............*..............*....*.......996.......-.....+..............*......752......................@...............-.........
+.......................716...........551.631........................279..555.....373...................691......114.215............515......
2023/input/03-p2.txt
@@ -0,0 +1,1 @@
+03-p1.txt
\ No newline at end of file