From 10a897d1e1726eee32af3399cc7b74fc36733179 Mon Sep 17 00:00:00 2001 From: sgf Date: Fri, 24 Dec 2021 23:38:00 +0300 Subject: [PATCH] new(go/day4-2): Solve day4 second puzzle. --- day4/main.go | 73 ++++++++++++++++++++++++++++++++++++++++------------ main.go | 2 +- 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/day4/main.go b/day4/main.go index 7749d34..c7d0282 100644 --- a/day4/main.go +++ b/day4/main.go @@ -52,6 +52,7 @@ type Board struct { board [5][5]int markedCol [5]int markedLine [5]int + won bool } func readBoard(s *bufio.Scanner) (b Board, err error) { @@ -63,10 +64,10 @@ func readBoard(s *bufio.Scanner) (b Board, err error) { i := 0 for ; i < 5 && notEOF; i++ { c := s.Text() - fmt.Printf("Read %v\n", c) + //fmt.Printf("Read %v\n", c) b.board[i], err = readBoardLine(c) if err != nil { return } - fmt.Printf("Read board row %v\n", b.board[i]) + //fmt.Printf("Read board row %v\n", b.board[i]) notEOF = s.Scan() } if i < 5 { @@ -88,7 +89,7 @@ func readInput(r io.Reader) (drawn []int, boards []Board, err error) { drawn, err = readDrawn(s) if err != nil { return } - fmt.Printf("Read drawn %v\n", drawn) + //fmt.Printf("Read drawn %v\n", drawn) boards = make([]Board, 0) notEOF := true @@ -96,7 +97,7 @@ func readInput(r io.Reader) (drawn []int, boards []Board, err error) { var board Board board, err = readBoard(s) if err != nil { return } - fmt.Printf("Read board %v\n", board) + //fmt.Printf("Read board %v\n", board) boards = append(boards, board) if len(s.Text()) == 0 { notEOF = s.Scan() } @@ -106,22 +107,23 @@ func readInput(r io.Reader) (drawn []int, boards []Board, err error) { var marked int = -1 -func (b *Board) markNumber(drawn int) bool { - fmt.Printf("Marking %d in board %v (%v %v)\n", drawn, b.board, b.markedLine, b.markedCol) +func (b *Board) markNumber(drawn int) { + //fmt.Printf("Marking %d in board %v (%v %v)\n", drawn, b.board, b.markedLine, b.markedCol) for i := 0; i < 5; i++ { for j := 0; j < 5; j++ { if b.board[i][j] == drawn { - fmt.Printf("Found at line %d, col %d\n", i, j) + //fmt.Printf("Found at line %d, col %d\n", i, j) b.board[i][j] = marked b.markedCol[j]++ b.markedLine[i]++ if b.markedCol[j] == 5 || b.markedLine[i] == 5 { - return true + b.won = true + return } } } } - return false + return } func (b Board) sumBoard() (s int) { @@ -137,18 +139,43 @@ func (b Board) sumBoard() (s int) { func f1 (drawn []int, bs []Board) int { for _, k := range drawn { - fmt.Printf("Draw %d\n", k) + //fmt.Printf("Draw %d\n", k) for t := 0; t < len(bs); t++ { - isWinner := bs[t].markNumber(k) - fmt.Printf("Resulting board %d: %v\n", t, bs[t]) - if isWinner { + bs[t].markNumber(k) + //fmt.Printf("Resulting board %d: %v\n", t, bs[t]) + if bs[t].won { s := bs[t].sumBoard() - fmt.Printf("Winner board %d: %v with sum %d\n", t, bs[t], s) + //fmt.Printf("Winner board %d: %v with sum %d\n", t, bs[t], s) return k * s } } } - return 0 + return marked +} + +func f2 (drawn []int, bs []Board) int { + remainingBoards := len(bs) + for _, k := range drawn { + //fmt.Printf("Draw %d\n", k) + last := marked + winners := 0 + for t := 0; t < len(bs); t++ { + if bs[t].won { continue } + bs[t].markNumber(k) + //fmt.Printf("Resulting board %d: %v\n", t, bs[t]) + if bs[t].won { + s := bs[t].sumBoard() + //fmt.Printf("Winner board %d: %v with sum %d\n", t, bs[t], s) + last = k * s + winners++ + } + } + remainingBoards -= winners + if remainingBoards == 0 { + return last + } + } + return marked } func RunF1(input string) { @@ -162,8 +189,20 @@ func RunF1(input string) { if err != nil { panic(err) } - fmt.Println(boards) + //fmt.Println(boards) x := f1(nums, boards) - fmt.Printf("Answer1: %d\n", x) } + +func RunF2(input string) { + h0, err := os.Open(input) + if err != nil { return } + defer h0.Close() + + nums, boards, err := readInput(h0) + if err != nil { + panic(err) + } + y := f2(nums, boards) + fmt.Printf("Answer2: %d\n", y) +} diff --git a/main.go b/main.go index 804e883..4993ed3 100644 --- a/main.go +++ b/main.go @@ -13,5 +13,5 @@ func main() { //day3.RunF2("day3/input.txt") //day3.RunF2("day2/input.txt") day4.RunF1("day4/input.txt") - //day4.RunF1("day4/in.txt") + day4.RunF2("day4/input.txt") } -- 2.20.1