diff --git a/2023/go/.vscode/launch.json b/2023/go/.vscode/launch.json new file mode 100644 index 0000000..800ee93 --- /dev/null +++ b/2023/go/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "args": ["16"], + "program": "${fileDirname}" + } + ] +} \ No newline at end of file diff --git a/2023/go/day14/day14.go b/2023/go/day14/day14.go new file mode 100644 index 0000000..7c543c0 --- /dev/null +++ b/2023/go/day14/day14.go @@ -0,0 +1,95 @@ +package day14 + +import ( + _ "adventofcode2023/utils" + "adventofcode2023/utils/grid2d" + "adventofcode2023/utils/inputs" + "fmt" + _ "strings" +) + +func Part1(input string) int { + grid := inputs.ToGrid2D[rune](input, "\n", "", ' ', func(c string) rune { return rune(c[0])}) +// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)})) + slide(grid) +// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)})) + return score(grid) +} + +func Part2(input string) int { + grid := inputs.ToGrid2D[rune](input, "\n", "", ' ', func(c string) rune { return rune(c[0])}) +// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)})) + x:= 0 + for j:=0;j<125;j++ { + for i:=0;i<4;i++ { + slide(grid) + grid = rotate(grid) + } + if score(grid) == 101375 { + fmt.Println(j, j - x) + x = j + } + } + fmt.Println(score(grid)) + for j:=999999840+125;j<1000000000;j++ { + for i:=0;i<4;i++ { + slide(grid) + grid = rotate(grid) + } + if score(grid) == 101375 { + fmt.Println(j, j - x) + x = j + } + } +// fmt.Println(grid.StringWithFormatter(func(c rune, x int, y int) string { return string(c)})) + return score(grid) +} + + +func slide(grid *grid2d.Grid[rune]) { + G := grid.Matrix() + R := len(G) + C := len(G[0]) + for c:=0;c0 && G[dr-1][c]=='.' { + G[dr][c]='.' + G[dr-1][c] = 'O' + } + } + } + } + +} + +func rotate(grid *grid2d.Grid[rune]) *grid2d.Grid[rune] { + G := grid.Matrix() + R := len(G) + C := len(G[0]) + New := grid2d.NewGrid[rune](R, C, '?') + NG := New.Matrix() + for r:=0;r b { + return a + } + return b +} + +func score(grid *grid2d.Grid[Tile], beams []Beam) int { + fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { return string(t.object)})) + G := grid.Matrix() + R := len(G) + C := len(G[0]) + fmt.Println("r:", R, "c:", C, "tiles:", R*C ) + for i:=0;i<1000;i++ { + beams = rmBeams(beams) + fmt.Println(i, ":", len(beams), ":", energy(G)) + for i, _ := range beams { + r := beams[i].r + c := beams[i].c + if r >= 0 && r < R && c >= 0 && c < C { + G[r][c].energized++ + switch beams[i].dir { + case 'n': + tile := &G[r][c] + switch tile.object { + case '.': + beams[i].r-- + case '|': + beams[i].r-- + case '-': + beams[i].dir = 'e' + beams[i].c++ + beams = addBeam(beams, Beam{'w', beams[i].r, beams[i].c-1, false}) + case '\\': + beams[i].dir = 'w' + beams[i].c-- + case '/': + beams[i].dir = 'e' + beams[i].c++ + } + case 'e': + tile := &G[r][c] + switch tile.object { + case '.': + beams[i].c++ + case '-': + beams[i].c++ + case '|': + beams[i].dir = 'n' + beams[i].r-- + beams = addBeam(beams, Beam{'s', beams[i].r+1, beams[i].c, false}) + case '\\': + beams[i].dir = 's' + beams[i].r++ + case '/': + beams[i].dir = 'n' + beams[i].r-- + } + case 's': + tile := &G[r][c] + switch tile.object { + case '.': + beams[i].r++ + case '|': + beams[i].r++ + case '-': + beams[i].dir = 'e' + beams[i].c++ + beams = addBeam(beams, Beam{'w', beams[i].r, beams[i].c-1, false}) + case '\\': + beams[i].dir = 'e' + beams[i].c++ + case '/': + beams[i].dir = 'w' + beams[i].c-- + } + case 'w': + tile := &G[r][c] + switch tile.object { + case '.': + beams[i].c-- + case '-': + beams[i].c-- + case '|': + beams[i].dir = 'n' + beams[i].r-- + beams = addBeam(beams, Beam{'s', beams[i].r+1, beams[i].c, false}) + case '\\': + beams[i].dir = 'n' + beams[i].r-- + case '/': + beams[i].dir = 's' + beams[i].r++ + } + } + } else { + beams[i].rm = true + } + } + fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { if t.energized > 0 {return "#"}; return "."})) + } + fmt.Println(grid.StringWithFormatter(func(t Tile, x int, y int) string { if t.energized > 0 {return "#"}; return "."})) + return energy(G) +} + +func rmBeams(slice []Beam) []Beam { + var result []Beam + + for _, value := range slice { + if ! value.rm { + result = append(result, value) + } + } + return result +} + +func addBeam(beams []Beam, beam Beam) []Beam { + for _, value := range startBeams { + if value == beam { return beams } + } + startBeams = append(startBeams, beam) + for _, value := range beams { + if value == beam { return beams } + } + return append(beams, beam) +} + +func energy(G [][]Tile) int { + ans := 0 + R := len(G) + C := len(G[0]) + for r:=0;r 0 { + ans++ + } + } + } + return ans +} \ No newline at end of file diff --git a/2023/go/day16/day16.py b/2023/go/day16/day16.py new file mode 100644 index 0000000..1f28535 --- /dev/null +++ b/2023/go/day16/day16.py @@ -0,0 +1,68 @@ +#!/usr/bin/python3 +import sys +import re +from copy import deepcopy +from math import gcd +from collections import defaultdict, Counter, deque +D = open(sys.argv[1]).read().strip() +L = D.split('\n') +G = [[c for c in row] for row in L] + +R = len(G) +C = len(G[0]) + +DR = [-1, 0, 1, 0] +DC = [ 0, 1, 0,-1] + +def step(r,c,d): + return (r+DR[d], c+DC[d], d) + +def score(sr,sc,sd): + POS = [(sr,sc,sd)] + SEEN = set() + SEEN2 = set() + while True: + NP = [] + if not POS: + break + for (r,c,d) in POS: + #print(r,c,d) + if 0<=r