2023.03
parent
30936b6204
commit
55fa420ed3
|
@ -1,11 +1,200 @@
|
||||||
package day_03
|
package day_03
|
||||||
|
|
||||||
type Day struct{}
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.rpjosh.de/RPJosh/go-logger"
|
||||||
|
"rpjosh.de/adventOfCode/pkg/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Day struct {
|
||||||
|
engine []string
|
||||||
|
|
||||||
|
currentRow int
|
||||||
|
currentLine int
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Day) Part1(in string) string {
|
func (d *Day) Part1(in string) string {
|
||||||
return ""
|
|
||||||
|
// Initialize variables
|
||||||
|
sum := 0
|
||||||
|
d.currentLine = -1
|
||||||
|
d.engine = strings.Split(in, "\n")
|
||||||
|
|
||||||
|
for _, val := range d.engine {
|
||||||
|
if val == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
strVal := ""
|
||||||
|
isSymbolNear := false
|
||||||
|
d.currentRow = 0
|
||||||
|
d.currentLine++
|
||||||
|
|
||||||
|
// Loop through all characters and find ints
|
||||||
|
for _, str := range val {
|
||||||
|
if utils.IsInt(string(str)) {
|
||||||
|
strVal += string(str)
|
||||||
|
if !isSymbolNear {
|
||||||
|
// Check if a symbol is near
|
||||||
|
isSymbolNear = d.isSymbolNear()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// It's a '.' or a symbole
|
||||||
|
if strVal != "" && isSymbolNear {
|
||||||
|
logger.Debug("Found value %q", strVal)
|
||||||
|
sum += utils.ToInt(strVal)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset variables
|
||||||
|
strVal = ""
|
||||||
|
isSymbolNear = false
|
||||||
|
}
|
||||||
|
|
||||||
|
d.currentRow += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// End of line
|
||||||
|
if strVal != "" && isSymbolNear {
|
||||||
|
logger.Debug("Found value %q", strVal)
|
||||||
|
sum += utils.ToInt(strVal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%d", sum)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Day) isSymbolNear() bool {
|
||||||
|
|
||||||
|
// Left and right
|
||||||
|
if d.isSymbole(d.currentRow-1, d.currentLine, ' ') || d.isSymbole(d.currentRow+1, d.currentLine, ' ') {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Top and bottom
|
||||||
|
if d.isSymbole(d.currentRow, d.currentLine-1, ' ') || d.isSymbole(d.currentRow, d.currentLine+1, ' ') {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Diagonale
|
||||||
|
if d.isSymbole(d.currentRow-1, d.currentLine-1, ' ') || d.isSymbole(d.currentRow-1, d.currentLine+1, ' ') {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if d.isSymbole(d.currentRow+1, d.currentLine-1, ' ') || d.isSymbole(d.currentRow+1, d.currentLine+1, ' ') {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// isGearNear returns weather a * is near and the index of that gear
|
||||||
|
// (row,line)
|
||||||
|
func (d *Day) isGearNear() (bool, string) {
|
||||||
|
|
||||||
|
// Left and right
|
||||||
|
if d.isSymbole(d.currentRow-1, d.currentLine, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow-1, d.currentLine)
|
||||||
|
}
|
||||||
|
if d.isSymbole(d.currentRow+1, d.currentLine, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow+1, d.currentLine)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Top and bottom
|
||||||
|
if d.isSymbole(d.currentRow, d.currentLine-1, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow, d.currentLine-1)
|
||||||
|
}
|
||||||
|
if d.isSymbole(d.currentRow, d.currentLine+1, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow, d.currentLine+1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Diagonale
|
||||||
|
if d.isSymbole(d.currentRow-1, d.currentLine-1, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow-1, d.currentLine-1)
|
||||||
|
}
|
||||||
|
if d.isSymbole(d.currentRow-1, d.currentLine+1, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow-1, d.currentLine+1)
|
||||||
|
}
|
||||||
|
if d.isSymbole(d.currentRow+1, d.currentLine-1, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow+1, d.currentLine-1)
|
||||||
|
}
|
||||||
|
if d.isSymbole(d.currentRow+1, d.currentLine+1, '*') {
|
||||||
|
return true, fmt.Sprintf("%d,%d", d.currentRow+1, d.currentLine+1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// isSymbole checks if the characters at the given position is a rune.
|
||||||
|
// If an invalid line or row is provided, this function returns false
|
||||||
|
func (d *Day) isSymbole(row, line int, symbole rune) bool {
|
||||||
|
// Check out of bounds
|
||||||
|
if row < 0 || line < 0 || line >= len(d.engine) || row >= len(d.engine[line]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
val := d.engine[line][row]
|
||||||
|
return val != '.' && !utils.IsInt(string(val)) && (symbole == ' ' || symbole == rune(val))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Day) Part2(in string) string {
|
func (d *Day) Part2(in string) string {
|
||||||
return ""
|
// Initialize variables
|
||||||
|
d.currentLine = -1
|
||||||
|
d.engine = strings.Split(in, "\n")
|
||||||
|
gears := make(map[string][]int, 0)
|
||||||
|
|
||||||
|
for _, val := range d.engine {
|
||||||
|
if val == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize variables
|
||||||
|
strVal := ""
|
||||||
|
isGearNear := false
|
||||||
|
isGearNearPos := ""
|
||||||
|
d.currentRow = 0
|
||||||
|
d.currentLine++
|
||||||
|
|
||||||
|
// Loop through all characters and find ints
|
||||||
|
for _, str := range val {
|
||||||
|
if utils.IsInt(string(str)) {
|
||||||
|
strVal += string(str)
|
||||||
|
// Check if a symbol is near
|
||||||
|
if isNear, pos := d.isGearNear(); isNear {
|
||||||
|
isGearNear = true
|
||||||
|
isGearNearPos = pos
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// It's a '.' or a symbole
|
||||||
|
if strVal != "" && isGearNear {
|
||||||
|
logger.Debug("Found pos %q with value %q", isGearNearPos, strVal)
|
||||||
|
gears[isGearNearPos] = append(gears[isGearNearPos], utils.ToInt(strVal))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset variables
|
||||||
|
strVal = ""
|
||||||
|
isGearNear = false
|
||||||
|
isGearNearPos = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
d.currentRow += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
// End of line
|
||||||
|
// Check if a symbol is near
|
||||||
|
if isGearNear {
|
||||||
|
logger.Debug("Found pos %q with value %q", isGearNearPos, strVal)
|
||||||
|
gears[isGearNearPos] = append(gears[isGearNearPos], utils.ToInt(strVal))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := 0
|
||||||
|
for _, values := range gears {
|
||||||
|
if len(values) == 2 {
|
||||||
|
sum += values[0] * values[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%d", sum)
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,3 +94,8 @@ func ToInt(val string) int {
|
||||||
|
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsInt(val string) bool {
|
||||||
|
_, err := strconv.Atoi(val)
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue