diff --git a/days/13.go b/days/13.go new file mode 100644 index 0000000..e3c2f15 --- /dev/null +++ b/days/13.go @@ -0,0 +1,147 @@ +package days + +import ( + "fmt" + + u "parnic.com/aoc2019/utilities" +) + +const ( + tileEmpty = 0 + tileWall = 1 + tileBlock = 2 + tileHPaddle = 3 + tileBall = 4 +) + +type tile struct { + pos u.Vec2[int] + id int +} + +type Day13 struct { + program u.IntcodeProgram + tiles []tile + gameBoard [24][45]int +} + +func (d *Day13) Parse() { + d.program = u.LoadIntcodeProgram("13p") + d.tiles = make([]tile, 0, 1080) +} + +func (d Day13) Num() int { + return 13 +} + +func (d Day13) getNumBlocks() int { + blockTiles := 0 + for _, tile := range d.tiles { + if tile.id == tileBlock { + blockTiles++ + } + } + + return blockTiles +} + +// func (d Day13) drawGameBoard() { +// s := strings.Builder{} +// for x := range d.gameBoard { +// for y := range d.gameBoard[x] { +// block := d.gameBoard[x][y] +// if block == tileBlock { +// s.WriteString(u.ColorBlue) +// s.WriteRune('█') +// s.WriteString(u.TextReset) +// } else if block == tileBall { +// s.WriteString(u.ColorGreen) +// s.WriteRune('█') +// s.WriteString(u.TextReset) +// } else if block == tileWall { +// s.WriteString(u.ColorWhite) +// s.WriteRune('█') +// s.WriteString(u.TextReset) +// } else if block == tileHPaddle { +// s.WriteString(u.ColorRed) +// s.WriteRune('█') +// s.WriteString(u.TextReset) +// } else if block == tileEmpty { +// s.WriteRune(' ') +// } +// } +// s.WriteRune('\n') +// } + +// fmt.Print(s.String()) +// } + +func (d *Day13) Part1() string { + outputStep := 0 + var newTilePos u.Vec2[int] + d.program.RunIn(func(inputStep int) int64 { + return 0 + }, func(val int64, state u.IntcodeProgramState) { + if outputStep == 0 { + newTilePos.X = int(val) + outputStep++ + } else if outputStep == 1 { + newTilePos.Y = int(val) + outputStep++ + } else { + d.tiles = append(d.tiles, tile{ + pos: newTilePos, + id: int(val), + }) + outputStep = 0 + } + }) + + return fmt.Sprintf("# block tiles: %s%d%s (%d total tiles)", u.TextBold, d.getNumBlocks(), u.TextReset, len(d.tiles)) +} + +func (d *Day13) Part2() string { + d.program.Reset() + d.program.SetMemory(0, 2) + + outputStep := 0 + newTilePos := u.Vec2[int]{} + var ball u.Vec2[int] + var paddle u.Vec2[int] + var score int64 + d.program.RunIn(func(inputStep int) int64 { + if ball.X < paddle.X { + return -1 + } else if ball.X > paddle.X { + return 1 + } + + return 0 + }, func(val int64, state u.IntcodeProgramState) { + if outputStep == 0 { + newTilePos.X = int(val) + outputStep++ + } else if outputStep == 1 { + newTilePos.Y = int(val) + outputStep++ + } else { + if newTilePos.Equals(u.Vec2[int]{X: -1, Y: 0}) { + score = val + } else { + d.gameBoard[newTilePos.Y][newTilePos.X] = int(val) + + if val == tileBall { + ball = newTilePos + } else if val == tileHPaddle { + paddle = newTilePos + // d.drawGameBoard() + // time.Sleep(time.Millisecond * 33) + } + } + + outputStep = 0 + } + }) + + return fmt.Sprintf("Game over! Score: %s%d%s", u.TextBold, score, u.TextReset) +} diff --git a/inputs/13p.txt b/inputs/13p.txt new file mode 100644 index 0000000..4c0051c --- /dev/null +++ b/inputs/13p.txt @@ -0,0 +1 @@ +1,380,379,385,1008,2799,419438,381,1005,381,12,99,109,2800,1102,0,1,383,1101,0,0,382,20102,1,382,1,21001,383,0,2,21101,0,37,0,1106,0,578,4,382,4,383,204,1,1001,382,1,382,1007,382,45,381,1005,381,22,1001,383,1,383,1007,383,24,381,1005,381,18,1006,385,69,99,104,-1,104,0,4,386,3,384,1007,384,0,381,1005,381,94,107,0,384,381,1005,381,108,1105,1,161,107,1,392,381,1006,381,161,1102,-1,1,384,1106,0,119,1007,392,43,381,1006,381,161,1102,1,1,384,20101,0,392,1,21101,22,0,2,21102,1,0,3,21101,0,138,0,1106,0,549,1,392,384,392,21001,392,0,1,21102,1,22,2,21102,3,1,3,21102,1,161,0,1105,1,549,1101,0,0,384,20001,388,390,1,20102,1,389,2,21102,1,180,0,1105,1,578,1206,1,213,1208,1,2,381,1006,381,205,20001,388,390,1,20102,1,389,2,21102,1,205,0,1106,0,393,1002,390,-1,390,1102,1,1,384,21002,388,1,1,20001,389,391,2,21101,0,228,0,1106,0,578,1206,1,261,1208,1,2,381,1006,381,253,21001,388,0,1,20001,389,391,2,21101,0,253,0,1105,1,393,1002,391,-1,391,1102,1,1,384,1005,384,161,20001,388,390,1,20001,389,391,2,21102,1,279,0,1106,0,578,1206,1,316,1208,1,2,381,1006,381,304,20001,388,390,1,20001,389,391,2,21101,0,304,0,1105,1,393,1002,390,-1,390,1002,391,-1,391,1101,0,1,384,1005,384,161,20101,0,388,1,20101,0,389,2,21101,0,0,3,21102,338,1,0,1106,0,549,1,388,390,388,1,389,391,389,21002,388,1,1,20101,0,389,2,21102,4,1,3,21101,365,0,0,1106,0,549,1007,389,23,381,1005,381,75,104,-1,104,0,104,0,99,0,1,0,0,0,0,0,0,296,20,19,1,1,22,109,3,22101,0,-2,1,21202,-1,1,2,21102,1,0,3,21102,414,1,0,1105,1,549,21201,-2,0,1,21202,-1,1,2,21102,429,1,0,1106,0,601,2101,0,1,435,1,386,0,386,104,-1,104,0,4,386,1001,387,-1,387,1005,387,451,99,109,-3,2106,0,0,109,8,22202,-7,-6,-3,22201,-3,-5,-3,21202,-4,64,-2,2207,-3,-2,381,1005,381,492,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,481,21202,-4,8,-2,2207,-3,-2,381,1005,381,518,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,507,2207,-3,-4,381,1005,381,540,21202,-4,-1,-1,22201,-3,-1,-3,2207,-3,-4,381,1006,381,529,21201,-3,0,-7,109,-8,2106,0,0,109,4,1202,-2,45,566,201,-3,566,566,101,639,566,566,1202,-1,1,0,204,-3,204,-2,204,-1,109,-4,2106,0,0,109,3,1202,-1,45,594,201,-2,594,594,101,639,594,594,20102,1,0,-2,109,-3,2106,0,0,109,3,22102,24,-2,1,22201,1,-1,1,21102,1,547,2,21102,850,1,3,21102,1,1080,4,21102,630,1,0,1106,0,456,21201,1,1719,-2,109,-3,2105,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,0,2,0,0,2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,0,0,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,0,0,2,0,1,1,0,0,2,2,0,0,2,2,0,0,0,2,2,0,2,0,2,0,0,0,0,0,2,0,0,2,2,2,0,2,0,2,0,2,0,2,0,0,0,0,0,2,0,1,1,0,0,2,0,2,0,0,0,0,2,2,0,0,2,2,2,0,2,2,0,0,0,2,2,2,2,2,2,0,0,2,0,2,0,2,2,2,2,2,0,0,0,0,1,1,0,2,2,0,0,0,2,0,2,0,0,2,2,2,2,0,2,0,2,2,0,0,0,0,2,0,0,0,2,2,0,0,0,2,0,2,0,0,0,0,2,0,0,1,1,0,2,2,2,0,0,2,2,0,0,2,0,0,0,2,2,0,0,0,0,0,0,0,2,0,0,0,2,2,0,2,0,2,0,0,0,2,2,2,0,2,2,0,1,1,0,0,0,2,2,2,2,0,0,0,2,0,0,2,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,2,0,2,2,0,0,1,1,0,0,0,0,0,0,2,2,2,2,0,0,0,0,2,2,2,0,0,2,0,2,0,0,2,0,2,0,2,0,2,0,0,0,0,0,2,0,0,2,2,2,0,1,1,0,2,2,2,0,2,0,0,0,2,0,2,2,2,2,2,0,2,2,0,2,0,0,2,0,2,0,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,0,1,1,0,0,2,0,2,2,2,2,0,0,2,0,0,2,0,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0,0,2,0,1,1,0,0,0,0,2,0,2,2,0,0,2,2,0,2,0,0,0,0,2,0,2,2,0,2,0,2,2,2,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,1,1,0,2,0,2,0,2,2,2,0,2,2,2,2,0,2,0,0,2,0,2,0,0,2,2,2,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,1,1,0,2,2,2,2,2,2,2,0,2,2,0,2,0,0,2,0,0,2,0,0,0,0,0,0,2,0,2,2,2,2,0,0,0,0,0,2,2,2,0,2,2,0,1,1,0,0,2,0,0,2,0,0,2,0,2,0,0,0,0,2,0,2,2,2,0,0,0,2,0,0,2,0,2,0,2,2,0,0,2,2,0,2,0,0,2,2,0,1,1,0,0,0,2,2,0,2,2,2,0,2,0,2,0,0,0,0,2,2,2,2,2,2,0,2,0,2,0,0,2,0,2,2,0,0,0,2,0,0,0,2,2,0,1,1,0,2,0,0,2,0,0,2,2,0,2,2,2,2,0,0,2,0,0,2,0,0,2,2,0,0,2,0,0,0,0,2,0,0,0,2,2,2,2,2,0,2,0,1,1,0,2,0,0,0,0,0,0,2,2,0,0,2,2,0,0,2,0,0,2,2,0,0,0,2,0,2,2,0,0,2,0,2,0,2,2,2,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,39,45,82,25,27,92,1,12,84,89,45,7,17,8,90,61,27,2,9,32,79,47,45,7,90,22,83,77,1,47,86,47,94,50,27,63,37,1,77,68,68,15,33,11,96,37,66,65,17,75,51,90,52,14,54,36,46,2,56,3,74,76,43,3,43,38,42,27,85,72,57,24,90,94,2,26,9,23,60,46,51,10,78,60,46,15,2,86,29,97,97,29,95,10,7,74,16,85,33,31,91,52,49,98,61,9,56,70,25,36,35,38,73,19,36,8,53,5,46,18,10,33,19,44,31,68,98,74,55,37,97,49,80,23,61,49,71,95,29,5,70,16,71,11,71,55,75,41,35,9,35,37,90,81,68,8,27,75,87,6,46,89,77,77,82,11,89,81,43,46,90,24,2,76,20,87,54,91,18,13,21,81,90,16,66,95,26,95,26,23,17,83,28,70,7,54,75,56,49,31,79,13,98,38,88,47,59,13,79,95,59,64,67,68,20,44,55,23,23,26,91,86,59,56,49,57,13,31,36,30,46,45,65,12,38,68,68,38,71,15,44,87,34,75,12,96,20,48,8,68,58,63,37,15,53,96,47,55,70,46,61,66,11,54,60,70,73,65,57,96,13,32,55,44,76,57,50,19,56,57,41,37,51,58,70,48,85,91,89,28,33,22,47,22,77,17,78,11,77,83,95,19,26,73,72,4,48,62,58,32,33,94,34,71,55,92,22,60,12,92,9,49,8,22,62,37,40,73,37,70,26,10,52,38,35,40,1,5,33,74,59,35,10,53,75,43,98,86,11,95,73,28,31,20,46,84,88,1,96,77,14,45,62,98,38,44,83,7,73,39,17,80,12,97,87,83,95,24,13,13,67,12,42,86,75,43,50,63,72,28,48,44,14,31,45,19,98,55,30,27,81,23,17,78,94,1,75,4,13,7,25,86,3,36,80,71,6,8,52,26,10,4,70,95,12,52,71,9,98,23,14,56,11,45,82,50,52,48,2,34,4,32,50,64,94,13,70,24,98,48,48,80,43,27,95,89,14,36,89,9,83,34,96,13,27,86,82,45,78,82,36,58,86,88,47,33,92,27,16,87,62,14,30,35,44,56,20,39,48,83,30,43,33,68,70,58,83,45,60,16,17,57,9,56,21,36,55,36,93,95,84,50,54,29,42,72,67,59,4,61,79,3,67,60,9,41,12,85,4,69,31,70,78,7,86,33,54,39,38,47,88,4,31,97,35,41,22,88,67,76,80,52,33,11,42,67,26,84,96,31,88,58,38,35,94,78,47,83,72,85,18,33,57,46,9,14,81,71,79,12,1,47,16,8,25,78,21,94,61,33,73,57,21,28,32,5,11,40,92,56,11,18,83,84,12,53,66,65,24,61,90,77,76,25,48,83,65,82,45,74,96,23,2,66,91,66,95,48,8,21,60,21,60,59,80,44,40,71,69,25,50,55,22,36,82,86,8,37,2,67,54,66,64,17,5,25,23,9,52,41,38,28,23,97,44,26,39,68,19,82,20,43,85,40,63,82,56,18,60,15,64,92,72,48,46,87,7,94,98,21,63,85,24,21,16,66,60,17,49,83,49,69,36,34,39,66,43,85,3,33,47,26,29,27,7,5,76,12,5,21,53,25,52,83,69,97,38,53,50,15,80,27,92,13,15,66,2,20,71,90,52,51,14,86,85,69,51,15,81,69,31,67,91,95,32,62,46,42,98,86,74,1,24,47,65,90,16,65,94,27,73,45,80,22,18,95,75,35,31,41,84,57,35,35,86,21,47,46,73,48,48,32,65,98,44,81,79,10,43,76,64,77,74,27,91,25,68,40,77,68,22,64,63,15,57,50,33,42,80,15,62,24,16,34,92,37,95,55,80,34,29,75,83,27,47,57,55,98,45,42,32,28,15,45,79,73,98,62,58,8,3,96,13,72,64,49,77,32,86,92,5,2,26,7,6,73,23,73,79,46,4,46,9,76,1,86,60,90,40,32,40,83,29,78,1,72,66,12,13,72,31,11,31,84,41,5,63,6,75,75,57,30,8,90,69,10,79,98,21,90,65,23,52,11,27,48,62,13,80,85,53,77,45,69,90,88,27,87,95,58,69,23,57,73,54,35,12,39,96,86,68,64,30,82,21,60,20,10,54,31,66,96,17,16,85,4,35,21,98,31,55,11,12,2,5,47,19,1,76,27,60,29,46,36,90,21,62,47,64,9,65,63,70,11,64,38,57,37,96,59,40,23,77,87,89,98,37,24,31,52,38,76,54,29,85,4,31,76,9,74,50,48,4,32,76,24,19,44,51,63,34,53,80,42,27,46,33,58,27,64,84,60,90,98,46,72,25,77,59,59,6,33,29,50,7,1,71,48,31,3,47,34,54,20,55,22,20,14,70,77,47,49,66,40,25,87,36,51,3,59,80,66,89,98,61,26,22,23,22,96,419438 \ No newline at end of file diff --git a/main.go b/main.go index aa3ebf9..a74f480 100644 --- a/main.go +++ b/main.go @@ -43,6 +43,7 @@ var dayMap = []day{ &days.Day10{}, &days.Day11{}, &days.Day12{}, + &days.Day13{}, } func main() { diff --git a/utilities/vector.go b/utilities/vector.go index 34ea4d0..ad2bb0f 100644 --- a/utilities/vector.go +++ b/utilities/vector.go @@ -37,6 +37,11 @@ func (v Vec2[T]) AngleBetween(other Vec2[T]) float64 { return rad * 180 / math.Pi } +func (v Vec2[T]) Equals(other Vec2[T]) bool { + return v.X == other.X && + v.Y == other.Y +} + func VecBetween[T Number](a, b Vec2[T]) Vec2[T] { return Vec2[T]{ X: a.X - b.X,