advent-of-code-2021/4/part1.go

129 lines
2 KiB
Go
Raw Normal View History

2021-12-04 06:36:07 +00:00
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
const boardSize = 5
type Board [][]int
func (b Board) Mark(num int) {
for x := 0; x < boardSize; x++ {
for y := 0; y < boardSize; y++ {
if b[x][y] == num {
b[x][y] = -1
}
}
}
}
func (b Board) CheckWin() bool {
for x := 0; x < boardSize; x++ {
match := true
for y := 0; y < boardSize; y++ {
if b[x][y] != -1 {
match = false
}
}
if match {
return true
}
}
for y := 0; y < boardSize; y++ {
match := true
for x := 0; x < boardSize; x++ {
if b[x][y] != -1 {
match = false
}
}
if match {
return true
}
}
return false
}
func (b Board) Sum() int {
sum := 0
for x := 0; x < boardSize; x++ {
for y := 0; y < boardSize; y++ {
if b[x][y] != -1 {
sum += b[x][y]
}
}
}
return sum
}
func NewBoard(lines []string) Board {
var board Board
for _, line := range lines {
var numbers []int
for i := 0; i < boardSize; i++ {
val, _ := strconv.Atoi(strings.TrimSpace(line[(i*3):(i*3)+2]))
numbers = append(numbers, val)
}
board = append(board, numbers)
}
return board
}
func main() {
var numbers []int
var boards []Board
var boardLines []string
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
// first line should be the numbers
if numbers == nil {
for _, n := range strings.Split(s.Text(), ",") {
val, _ := strconv.Atoi(n)
numbers = append(numbers, val)
}
s.Scan()
continue
}
// if the line is empty, create new board
// else, collect more lines
if len(s.Bytes()) == 0 {
boards = append(boards, NewBoard(boardLines))
boardLines = []string{}
} else {
boardLines = append(boardLines, s.Text())
}
}
// if we have any lines left, convert them into board
if len(boardLines) > 0 {
boards = append(boards, NewBoard(boardLines))
}
for _, num := range numbers {
for _, board := range boards {
board.Mark(num)
if board.CheckWin() {
fmt.Println(board.Sum() * num)
os.Exit(0)
}
}
}
fmt.Println(":(")
}