feat: solve part one using grid transposition
This commit is contained in:
130
internal/2025/DaySix/code.go
Normal file
130
internal/2025/DaySix/code.go
Normal file
@@ -0,0 +1,130 @@
|
||||
package daysix
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"advent-of-code/internal/registry"
|
||||
)
|
||||
|
||||
func init() {
|
||||
registry.Register("2025D6", ParseInput, PartOne, PartTwo)
|
||||
}
|
||||
|
||||
func ParseInput(filepath string) []string {
|
||||
content, _ := os.ReadFile(filepath)
|
||||
lines := strings.Split(strings.TrimRight(string(content), "\n"), "\n")
|
||||
return lines
|
||||
}
|
||||
|
||||
func transpose(lines []string) []string {
|
||||
maxWidth := 0
|
||||
for _, line := range lines {
|
||||
if len(line) > maxWidth {
|
||||
maxWidth = len(line)
|
||||
}
|
||||
}
|
||||
|
||||
transposed := make([]string, maxWidth)
|
||||
for column := 0; column < maxWidth; column++ {
|
||||
var builder strings.Builder
|
||||
for _, line := range lines {
|
||||
if column < len(line) {
|
||||
builder.WriteByte(line[column])
|
||||
} else {
|
||||
builder.WriteByte(' ')
|
||||
}
|
||||
}
|
||||
transposed[column] = builder.String()
|
||||
}
|
||||
|
||||
return transposed
|
||||
}
|
||||
|
||||
func isSpaceColumn(column string) bool {
|
||||
return strings.TrimSpace(column) == ""
|
||||
}
|
||||
|
||||
func extractRowFromColumns(transposed []string, row, startColumn, endColumn int) string {
|
||||
var builder strings.Builder
|
||||
for column := startColumn; column <= endColumn && column < len(transposed); column++ {
|
||||
if row < len(transposed[column]) {
|
||||
builder.WriteByte(transposed[column][row])
|
||||
} else {
|
||||
builder.WriteByte(' ')
|
||||
}
|
||||
}
|
||||
return builder.String()
|
||||
}
|
||||
|
||||
func extractNumbers(transposed []string, startColumn, endColumn, operationRow int) []int {
|
||||
numbers := make([]int, 0)
|
||||
for row := range operationRow {
|
||||
rowStr := extractRowFromColumns(transposed, row, startColumn, endColumn)
|
||||
trimmed := strings.TrimSpace(rowStr)
|
||||
fields := strings.FieldsSeq(trimmed)
|
||||
for field := range fields {
|
||||
if number, err := strconv.Atoi(field); err == nil {
|
||||
numbers = append(numbers, number)
|
||||
}
|
||||
}
|
||||
}
|
||||
return numbers
|
||||
}
|
||||
|
||||
func extractOperation(segment string) byte {
|
||||
if idx := strings.IndexAny(segment, "+*"); idx != -1 {
|
||||
return segment[idx]
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func applyOperation(numbers []int, operation byte) int {
|
||||
result := numbers[0]
|
||||
if operation == '+' {
|
||||
for idx := 1; idx < len(numbers); idx++ {
|
||||
result += numbers[idx]
|
||||
}
|
||||
} else {
|
||||
for idx := 1; idx < len(numbers); idx++ {
|
||||
result *= numbers[idx]
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func PartOne(input []string) int {
|
||||
operationRow := len(input) - 1
|
||||
transposed := transpose(input)
|
||||
|
||||
total := 0
|
||||
column := 0
|
||||
for column < len(transposed) {
|
||||
if isSpaceColumn(transposed[column]) {
|
||||
column++
|
||||
continue
|
||||
}
|
||||
|
||||
startColumn := column
|
||||
for column < len(transposed) && !isSpaceColumn(transposed[column]) {
|
||||
column++
|
||||
}
|
||||
endColumn := column - 1
|
||||
|
||||
numbers := extractNumbers(transposed, startColumn, endColumn, operationRow)
|
||||
operationRowStr := extractRowFromColumns(transposed, operationRow, startColumn, endColumn)
|
||||
operation := extractOperation(operationRowStr)
|
||||
|
||||
if len(numbers) > 0 && operation != 0 {
|
||||
result := applyOperation(numbers, operation)
|
||||
total += result
|
||||
}
|
||||
}
|
||||
|
||||
return total
|
||||
}
|
||||
|
||||
func PartTwo(input []string) int {
|
||||
return 0
|
||||
}
|
||||
Reference in New Issue
Block a user