✨ Finish part 1 of day 10
This commit is contained in:
parent
1594ddd9ab
commit
0dadb796bc
28
day10/input.txt
Normal file
28
day10/input.txt
Normal file
@ -0,0 +1,28 @@
|
||||
###..#.##.####.##..###.#.#..
|
||||
#..#..###..#.......####.....
|
||||
#.###.#.##..###.##..#.###.#.
|
||||
..#.##..##...#.#.###.##.####
|
||||
.#.##..####...####.###.##...
|
||||
##...###.#.##.##..###..#..#.
|
||||
.##..###...#....###.....##.#
|
||||
#..##...#..#.##..####.....#.
|
||||
.#..#.######.#..#..####....#
|
||||
#.##.##......#..#..####.##..
|
||||
##...#....#.#.##.#..#...##.#
|
||||
##.####.###...#.##........##
|
||||
......##.....#.###.##.#.#..#
|
||||
.###..#####.#..#...#...#.###
|
||||
..##.###..##.#.##.#.##......
|
||||
......##.#.#....#..##.#.####
|
||||
...##..#.#.#.....##.###...##
|
||||
.#.#..#.#....##..##.#..#.#..
|
||||
...#..###..##.####.#...#..##
|
||||
#.#......#.#..##..#...#.#..#
|
||||
..#.##.#......#.##...#..#.##
|
||||
#.##..#....#...#.##..#..#..#
|
||||
#..#.#.#.##..#..#.#.#...##..
|
||||
.#...#.........#..#....#.#.#
|
||||
..####.#..#..##.####.#.##.##
|
||||
.#.######......##..#.#.##.#.
|
||||
.#....####....###.#.#.#.####
|
||||
....####...##.#.#...#..#.##.
|
152
day10/main.go
Normal file
152
day10/main.go
Normal file
@ -0,0 +1,152 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
)
|
||||
|
||||
type Position struct {
|
||||
X int
|
||||
Y int
|
||||
}
|
||||
|
||||
func main() {
|
||||
file, err := os.Open("input.txt")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
t2 := make([]string, 0)
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
t2 = append(t2, scanner.Text())
|
||||
}
|
||||
|
||||
field, asteroids := ParseStringSliceToField(t2)
|
||||
|
||||
SolvePzl1(field, asteroids)
|
||||
}
|
||||
|
||||
func SolvePzl1(field [][]int, asteroids []Position) {
|
||||
highestFoundAstros := math.MinInt32
|
||||
pos := Position{}
|
||||
|
||||
for _, astro := range asteroids {
|
||||
sum := CountAsteroidsFromPosition(field, astro.X, astro.Y)
|
||||
if highestFoundAstros < sum {
|
||||
highestFoundAstros = sum
|
||||
pos = astro
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("Part1: Found %d Astros at Position(%d,%d) from %d Astros", highestFoundAstros, pos.X, pos.Y, len(asteroids))
|
||||
}
|
||||
|
||||
func ParseStringSliceToField(view []string) (field [][]int, asteroids []Position) {
|
||||
field = make([][]int, 0)
|
||||
asteroids = make([]Position, 0)
|
||||
|
||||
x, y := 0, 0
|
||||
|
||||
for i, line := range view {
|
||||
x = 0
|
||||
field = append(field, make([]int, 0))
|
||||
for j := 0; j < len(line); j++ {
|
||||
if "#" == string(line[j]) {
|
||||
field[i] = append(field[i], 0)
|
||||
asteroids = append(asteroids, Position{X: x, Y: y})
|
||||
} else {
|
||||
field[i] = append(field[i], -1)
|
||||
}
|
||||
x++
|
||||
}
|
||||
y++
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func CountAsteroidsFromPosition(field [][]int, posX, posY int) (sum int) {
|
||||
duplicate := Copy2DSlice(field)
|
||||
steps := make(map[int]int, 0)
|
||||
|
||||
for y := 0; y < len(duplicate); y++ {
|
||||
for x := 0; x < len(duplicate[y]); x++ {
|
||||
if x == posX && y == posY {
|
||||
continue
|
||||
}
|
||||
|
||||
stepX := x - posX
|
||||
stepY := y - posY
|
||||
|
||||
gcd := GCD(stepY, stepX)
|
||||
|
||||
if gcd == 0 {
|
||||
if stepX > 0 {
|
||||
stepX = 1
|
||||
} else if stepX < 0 {
|
||||
stepX = -1
|
||||
} else if stepY > 0 {
|
||||
stepY = 1
|
||||
} else if stepY < 0 {
|
||||
stepY = -1
|
||||
}
|
||||
} else {
|
||||
stepX, stepY = stepX/gcd, stepY/gcd
|
||||
}
|
||||
|
||||
if v, ok := steps[stepX]; ok && v == stepY {
|
||||
continue
|
||||
}
|
||||
steps[stepX] = stepY
|
||||
|
||||
curX, curY := posX, posY
|
||||
found := false
|
||||
for true {
|
||||
curX += stepX
|
||||
curY += stepY
|
||||
|
||||
if curY < 0 || curX < 0 || curY >= len(duplicate) || curX >= len(duplicate[curY]) {
|
||||
break
|
||||
}
|
||||
|
||||
if duplicate[curY][curX] >= 0 {
|
||||
//log.Printf("(%d,%d) from (%d,%d)", curX, curY, stepX, stepY)
|
||||
if !found {
|
||||
found = true
|
||||
sum++
|
||||
}
|
||||
duplicate[curY][curX] = -2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func Copy2DSlice(matrix [][]int) (duplicate [][]int) {
|
||||
duplicate = make([][]int, len(matrix))
|
||||
for i := range matrix {
|
||||
duplicate[i] = make([]int, len(matrix[i]))
|
||||
copy(duplicate[i], matrix[i])
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// greatest common divisor (GCD) via Euclidean algorithm
|
||||
func GCD(a, b int) int {
|
||||
for b != 0 {
|
||||
t := b
|
||||
b = a % b
|
||||
a = t
|
||||
}
|
||||
|
||||
if a < 0 {
|
||||
a = a * -1
|
||||
}
|
||||
|
||||
return a
|
||||
}
|
Loading…
Reference in New Issue
Block a user