Files
advent-of-code-2025/cmd/03/bank/bank.go
T

62 lines
1.1 KiB
Go
Raw Normal View History

2025-12-05 07:05:28 -06:00
// Package bank represents a bank of batteries
package bank
import (
"strconv"
2025-12-06 07:34:42 -06:00
"strings"
2025-12-05 07:05:28 -06:00
)
type Bank interface {
2025-12-06 07:34:42 -06:00
Joltage(numOfCellsToTurnOn int) int64
2025-12-05 07:05:28 -06:00
Cells() []int
}
type bank struct {
cells []int
}
func From(line string) Bank {
cells := []int{}
for _, char := range line {
num, _ := strconv.Atoi(string(char))
cells = append(cells, num)
}
return bank{
cells: cells,
}
}
2025-12-06 07:34:42 -06:00
func (b bank) Joltage(numOfCellsToTurnOn int) int64 {
bankLength := len(b.cells)
cellsOn := []int{}
removalBudget := bankLength - numOfCellsToTurnOn
2025-12-05 07:05:28 -06:00
2025-12-06 07:34:42 -06:00
for _, cell := range b.cells {
for len(cellsOn) > 0 && removalBudget > 0 && cell > cellsOn[len(cellsOn)-1] {
cellToRemoveIndex := len(cellsOn) - 1
cellsOn = cellsOn[:cellToRemoveIndex]
removalBudget--
2025-12-05 07:05:28 -06:00
}
2025-12-06 07:34:42 -06:00
cellsOn = append(cellsOn, cell)
2025-12-05 07:05:28 -06:00
}
2025-12-06 07:34:42 -06:00
var sb strings.Builder
for _, n := range cellsOn[:numOfCellsToTurnOn] {
sb.WriteString(strconv.Itoa(n))
2025-12-05 07:05:28 -06:00
}
2025-12-06 07:34:42 -06:00
finalString := sb.String()
2025-12-05 07:05:28 -06:00
2025-12-06 07:34:42 -06:00
finalJoltage, _ := strconv.ParseInt(finalString, 10, 64)
2025-12-05 07:05:28 -06:00
2025-12-06 07:34:42 -06:00
return finalJoltage
2025-12-05 07:05:28 -06:00
}
func (b bank) Cells() []int {
return b.cells
}