This commit is contained in:
Karl Spickermann 2021-12-04 14:48:05 +01:00
parent 2d2a5e7bd6
commit 92a5065465
4 changed files with 791 additions and 3 deletions

157
src/day4/day4.go Normal file
View File

@ -0,0 +1,157 @@
package main
import (
"AOC2021/src/helper"
"fmt"
"os"
"strings"
)
type bingoField struct {
number int
checked bool
}
type bingoGame struct {
winState []int
currentRound int
numbers []int
boards [][][]bingoField
}
func main() {
args := os.Args[1:]
input, err := helper.GetInput(args[0])
if err != nil {
fmt.Println(err)
}
bingoNumbers, _ := helper.MapToNumber(strings.Split(input[0], ","))
bingoBoards := parseBoards(input)
part1(bingoNumbers, bingoBoards)
part2(bingoNumbers, bingoBoards)
}
func part1(bingoNumbers []int, bingoBoards [][][]bingoField) {
game := bingoGame{[]int{}, 0, bingoNumbers, bingoBoards}
for len(game.winState) == 0 {
game.playRound()
}
fmt.Println(getSumOfUncheckedField(game.boards[game.winState[0]]) * game.numbers[game.currentRound-1])
}
func part2(bingoNumbers []int, bingoBoards [][][]bingoField) {
game := bingoGame{[]int{}, 0, bingoNumbers, bingoBoards}
for len(game.winState) < len(game.boards) {
game.playRound()
}
fmt.Println(getSumOfUncheckedField(game.boards[game.winState[len(game.winState)-1]]) * game.numbers[game.currentRound-1])
}
func parseBoards(input []string) [][][]bingoField {
var bingoBoards [][][]bingoField
for i := 0; i*6 + 6 <= len(input); i++ {
begin := 2 + i*6
end := 7 + i*6
bingoBoards = append(bingoBoards,parseBoard(input[begin:end]) )
}
return bingoBoards
}
func parseBoard(input []string) [][]bingoField{
bingoBoard := make([][]bingoField, len(input))
for i, line := range input {
numberStrings := strings.Split(line, " ")
numberStrings = helper.Delete(numberStrings, "")
numbers, _ := helper.MapToNumber(numberStrings)
row := make([]bingoField, len(numbers))
for i, number := range numbers {
row[i] = bingoField{number, false}
}
bingoBoard[i] = row
}
return bingoBoard
}
func (game* bingoGame) playRound () {
drawnNumber := game.numbers[game.currentRound]
for _, board := range game.boards {
markFields(&board, drawnNumber)
}
for i, board := range game.boards {
if !helper.Contains(i, game.winState) && checkWinCondition(board){
game.winState = append(game.winState, i)
}
}
game.currentRound++
}
func markFields(board *[][]bingoField, drawnNumber int) {
for i,row := range *board {
for j,field := range row {
if field.number == drawnNumber {
(*board)[i][j] = bingoField{drawnNumber, true}
}
}
}
}
func checkWinCondition(board [][]bingoField) bool{
winConditionBoard := make([][]int, len(board))
for i,row := range board {
for _,field := range row {
if field.checked {
winConditionBoard[i] = append(winConditionBoard[i], 1)
} else {
winConditionBoard[i] = append(winConditionBoard[i], 0)
}
}
}
if checkWinConditionRows(winConditionBoard) || checkWinConditionRows(helper.Transpose(winConditionBoard)) {
return true
}
return false
}
func checkWinConditionRows(rows [][]int) bool{
for _, row := range rows {
if helper.AddNummbers(row...) == len(row) {
return true
}
}
return false
}
func checkWinConditionDiagonals(rows [][]int) bool{
return checkWinConditionDiagonal(rows) || checkWinConditionDiagonalInverse(rows)
}
func checkWinConditionDiagonal(rows [][]int,) bool {
for i := 0; i < len(rows); i++ {
if rows[i][i] == 0 {
return false
}
}
return true
}
func checkWinConditionDiagonalInverse(rows [][]int) bool {
for i := 0; i < len(rows); i++ {
if rows[4-i][i] == 0 {
return false
}
}
return true
}
func getSumOfUncheckedField(board [][]bingoField) int {
sum := 0
for _, row := range board {
for _, field := range row {
if !field.checked {
sum += field.number
}
}
}
return sum
}

601
src/day4/day4Input.txt Normal file
View File

@ -0,0 +1,601 @@
76,69,38,62,33,48,81,2,64,21,80,90,29,99,37,15,93,46,75,0,89,56,58,40,92,47,8,6,54,96,12,66,83,4,70,19,17,5,50,52,45,51,18,27,49,71,28,86,74,77,11,20,84,72,23,31,16,78,91,65,87,79,73,94,24,68,63,9,88,82,30,42,60,13,67,85,44,59,7,53,22,1,26,41,61,55,43,39,3,35,25,34,57,10,14,32,97,95,36,98
17 45 62 28 73
39 12 0 52 5
87 48 50 85 44
66 57 78 94 3
91 37 69 16 1
1 67 4 58 13
25 54 34 63 87
59 70 66 72 71
33 17 8 20 85
69 46 50 41 88
47 63 80 15 90
24 1 40 94 13
56 62 74 81 95
43 88 37 99 22
57 52 33 84 49
33 58 54 28 10
7 82 97 66 92
95 77 5 86 84
85 91 94 21 69
23 12 13 98 46
1 63 58 23 0
67 14 45 42 32
48 64 83 10 13
74 16 3 79 46
44 52 95 25 6
93 47 5 96 28
88 76 70 0 72
77 1 36 54 9
14 17 75 64 15
79 66 61 78 26
23 75 96 71 76
63 59 39 65 36
95 21 67 41 74
9 97 4 2 49
32 17 81 0 56
77 53 30 94 5
4 42 87 25 24
52 15 68 9 45
56 89 98 47 34
99 32 27 78 46
75 70 99 65 41
87 6 11 88 1
4 42 64 98 78
63 50 69 79 39
67 46 17 97 26
26 73 6 79 47
67 51 64 16 60
8 1 61 76 39
13 57 48 65 46
63 83 4 92 71
97 93 21 88 80
58 42 53 95 90
49 29 30 26 22
66 51 75 8 13
5 39 19 4 96
77 16 33 1 6
54 91 60 56 88
4 59 24 79 22
36 49 17 97 27
67 99 92 62 86
78 18 59 74 54
79 68 23 51 85
47 42 92 58 12
30 97 19 26 15
1 62 94 65 70
6 91 56 55 11
58 96 21 50 53
51 60 67 64 71
12 25 44 47 39
15 92 81 9 38
98 16 31 21 30
58 10 3 89 7
79 20 60 74 26
86 4 83 96 15
94 29 44 41 34
50 75 83 20 52
65 85 41 78 38
31 64 86 32 10
25 82 13 61 22
11 73 4 77 24
56 74 26 20 62
83 46 41 24 52
34 28 76 80 36
75 48 63 17 55
69 47 22 45 60
17 15 71 28 68
12 76 27 25 14
34 39 31 58 13
75 67 2 26 42
72 43 0 23 54
37 43 18 76 47
96 1 80 77 27
13 89 16 4 6
74 92 55 99 38
19 75 52 85 81
69 51 39 95 98
90 61 91 6 21
25 57 81 10 49
67 55 43 96 17
78 11 3 64 77
51 66 8 62 60
82 94 24 54 26
59 91 97 37 77
20 25 69 98 84
38 12 65 35 61
7 26 91 84 17
23 52 86 19 24
58 44 5 32 40
6 27 89 76 92
33 10 90 83 82
44 61 68 70 87
23 17 90 93 21
92 54 95 46 14
47 24 89 33 31
26 80 35 42 78
88 80 50 46 26
1 97 92 51 74
16 24 40 31 95
47 85 61 99 12
27 8 25 42 13
8 59 37 87 44
62 0 67 39 92
79 81 54 24 93
56 84 23 18 34
72 68 29 11 91
64 51 81 44 12
49 20 23 36 53
59 73 37 60 57
96 65 5 43 14
46 31 47 87 1
11 13 72 30 3
67 20 84 59 77
52 87 97 51 16
43 36 21 33 82
41 96 91 93 29
7 31 19 87 94
92 68 18 57 23
5 88 81 86 10
99 50 37 33 25
97 22 0 53 91
78 39 41 44 89
91 82 71 42 37
25 93 67 53 9
84 23 33 92 14
74 45 57 86 50
79 83 10 85 48
51 29 93 87 21
58 5 52 37 99
80 1 18 46 42
60 92 0 44 59
79 76 54 14 42
57 11 39 66 33
86 62 27 61 26
48 68 47 99 46
78 90 9 36 98
76 79 66 38 65
67 91 90 41 93
2 1 33 56 50
46 9 0 61 62
26 58 16 24 10
20 22 86 58 14
53 74 54 85 6
2 96 40 72 78
99 81 16 31 55
11 57 62 51 32
8 51 73 40 88
83 35 37 98 27
3 42 15 14 33
2 38 52 82 71
67 55 9 66 53
94 99 54 18 14
40 56 57 66 68
28 74 48 30 0
59 1 22 50 23
13 71 6 26 15
28 60 66 25 56
49 68 84 10 38
73 50 87 16 14
79 26 29 18 2
57 22 5 48 91
61 78 3 95 87
6 62 25 74 84
22 71 93 57 20
81 33 15 45 96
38 14 19 72 26
51 19 62 72 39
36 83 6 33 9
95 43 42 2 22
94 99 23 97 11
66 61 16 30 35
51 38 7 24 82
23 12 46 55 85
43 97 45 61 67
53 2 77 99 34
17 93 25 9 72
37 32 35 63 93
40 16 51 99 88
73 69 49 80 33
56 54 18 87 71
29 98 85 58 17
38 4 55 72 33
29 63 86 52 75
7 47 34 53 14
89 39 83 36 78
6 21 15 18 96
56 19 40 0 7
61 33 50 66 54
93 91 64 6 45
51 90 94 18 37
15 28 13 2 44
18 79 4 56 15
38 80 8 42 5
60 11 53 23 27
9 71 19 83 72
39 97 98 99 7
90 22 41 95 15
20 18 7 70 49
97 51 79 94 77
31 89 50 40 9
37 84 6 98 35
38 56 94 55 0
92 84 8 85 73
86 81 76 35 1
62 5 59 77 72
79 97 60 11 70
43 98 87 97 70
53 55 35 8 64
80 59 75 11 2
17 95 13 38 90
31 20 60 84 4
38 19 10 73 86
37 72 66 22 53
6 41 20 21 92
0 13 9 89 17
43 61 80 60 65
61 50 42 99 26
11 51 52 83 64
92 60 2 91 20
95 10 14 94 98
5 37 90 17 69
82 48 51 32 78
30 39 10 84 69
94 5 60 92 89
95 31 64 67 23
96 20 33 66 61
33 92 78 24 74
45 34 73 5 57
18 37 69 44 38
25 30 53 87 64
28 23 14 10 81
39 82 40 64 86
26 81 3 85 50
71 75 91 65 96
17 55 8 56 59
22 36 73 90 0
18 67 50 70 71
83 8 75 55 29
66 33 39 88 16
32 84 78 59 0
11 3 61 65 36
1 12 66 59 9
24 97 75 83 11
45 16 14 31 71
85 43 99 18 15
61 56 80 69 29
18 50 86 53 71
67 36 14 24 55
52 30 33 54 81
72 51 39 28 42
45 98 78 35 73
60 86 68 58 37
17 78 43 31 96
33 61 34 45 36
10 29 83 98 2
88 73 7 84 50
30 21 94 31 4
20 68 91 55 51
10 98 2 25 84
64 97 29 28 58
75 17 76 54 65
17 11 88 9 66
1 59 60 79 55
30 46 83 67 91
23 45 99 90 6
81 33 8 13 76
25 68 43 59 51
56 14 41 52 16
62 36 12 37 71
83 90 81 91 0
95 92 29 54 26
53 84 85 18 10
51 44 87 86 67
4 81 82 77 30
26 68 80 57 71
22 83 47 61 14
41 89 38 14 66
70 92 26 97 53
78 25 5 4 48
54 86 31 23 0
99 73 6 20 98
18 81 96 60 47
59 87 95 15 57
34 17 26 7 42
25 90 45 94 5
10 41 32 20 98
37 9 20 82 83
84 14 62 3 76
86 67 95 40 65
57 26 1 19 69
49 41 29 35 13
29 74 69 92 48
80 47 59 18 13
98 5 64 89 83
37 97 90 32 49
25 87 39 21 63
1 61 5 82 66
87 75 18 23 63
38 51 33 59 4
21 14 17 97 92
94 45 84 22 10
86 93 8 99 54
1 4 37 30 34
80 17 50 74 97
28 11 6 85 78
94 76 92 63 79
63 87 89 19 81
72 90 71 96 16
85 92 78 11 37
50 17 68 82 66
21 9 39 69 73
30 63 90 5 45
26 15 28 84 65
1 23 0 12 17
61 98 21 39 56
67 51 3 8 42
54 91 9 70 93
75 58 89 53 19
77 64 45 78 14
7 31 99 42 51
87 95 60 10 84
98 35 66 42 85
75 27 97 54 9
16 15 60 44 49
28 19 51 24 50
59 18 37 88 39
69 29 49 9 76
4 83 64 33 2
67 81 88 70 39
85 73 97 15 8
7 13 26 12 1
57 3 65 28 87
36 31 51 19 0
56 77 41 20 76
79 29 80 60 66
55 61 8 30 15
2 42 3 17 40
10 56 91 52 23
76 39 75 82 49
50 36 99 9 53
92 66 48 31 41
16 51 80 95 23
36 84 33 56 11
49 46 32 78 85
67 29 94 26 22
76 6 30 37 0
27 94 79 48 4
55 81 22 18 88
93 15 59 41 11
67 43 24 92 65
5 1 60 99 62
2 51 42 84 82
80 28 43 93 72
81 57 13 45 66
34 22 53 37 3
31 46 70 77 79
17 12 22 53 74
23 49 52 60 40
64 98 97 75 57
58 81 85 89 92
42 34 65 87 18
13 8 54 25 11
84 72 66 78 1
22 82 48 85 62
68 99 18 3 57
64 41 80 94 71
45 5 56 30 62
10 50 78 13 34
90 97 85 36 0
86 35 80 55 74
47 99 59 61 18
79 87 81 45 95
24 91 27 18 16
51 35 34 46 48
39 40 6 70 99
1 82 63 32 50
78 68 27 17 65
74 15 21 38 24
82 97 49 7 58
19 23 87 79 22
57 93 30 1 69
64 13 40 21 89
3 95 20 79 59
80 46 91 54 1
62 66 30 60 47
26 99 55 25 2
47 83 7 71 81
9 72 12 20 96
28 57 82 98 42
34 59 18 69 1
68 38 46 19 80
43 39 48 84 87
32 78 5 65 50
86 13 20 22 70
31 6 52 53 18
73 25 4 60 99
48 15 59 50 33
93 99 46 70 21
91 26 76 65 87
10 27 78 5 96
4 63 22 82 20
88 63 66 48 37
39 47 56 52 27
81 18 33 12 59
3 96 55 26 43
42 4 7 28 22
95 12 98 84 23
37 35 78 9 61
52 47 24 90 17
55 87 18 80 41
38 0 14 36 48
62 72 56 78 8
75 26 11 58 91
38 74 52 65 45
43 41 15 82 35
89 27 21 54 0
43 36 85 68 60
26 89 84 10 80
87 50 75 81 35
12 46 6 70 59
93 51 66 33 49
68 32 0 63 54
20 92 39 89 17
48 60 87 36 14
93 76 83 10 55
64 74 80 11 41
9 32 11 41 87
78 22 8 72 75
6 51 29 90 50
21 68 47 2 7
52 19 36 57 58
83 36 25 31 99
86 29 47 77 38
13 51 20 59 27
74 50 9 11 44
52 95 81 2 70
96 47 14 73 59
84 87 7 4 46
60 27 79 53 30
58 28 55 5 43
91 75 63 35 52
41 66 27 50 56
76 60 80 85 23
3 21 37 74 95
9 92 43 5 98
79 49 88 24 70
59 18 57 90 13
79 29 12 2 0
84 58 38 77 96
33 89 43 11 44
93 23 98 60 51
58 86 28 17 1
6 4 81 55 53
84 27 38 12 83
50 43 40 85 88
26 72 25 41 44
14 92 7 98 12
44 11 71 64 26
88 8 2 56 6
59 0 15 33 51
10 52 89 53 34
52 4 5 63 50
15 8 60 70 13
33 79 21 39 34
84 91 30 12 71
61 31 41 9 66
43 67 52 92 54
17 21 71 78 60
19 0 88 61 2
14 66 87 12 37
89 23 25 4 24
41 62 7 66 33
59 87 84 80 71
73 97 25 85 60
86 64 61 54 83
22 18 63 81 27
92 89 50 11 73
41 48 62 80 78
46 55 81 16 94
97 45 5 13 40
14 75 22 42 2

19
src/day4/day4Test.txt Normal file
View File

@ -0,0 +1,19 @@
7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
22 13 17 11 0
8 2 23 4 24
21 9 14 16 7
6 10 3 18 5
1 12 20 15 19
3 15 0 2 22
9 18 13 17 5
19 8 7 25 23
20 11 10 24 4
14 21 16 12 6
14 21 17 24 4
10 16 15 9 19
18 8 23 26 20
22 11 13 6 5
2 0 12 3 7

View File

@ -27,10 +27,11 @@ func GetFile(filename string) (string, error) {
return string(content), err
}
func MapToNumber(strings []string) ([]int, error) {
func MapToNumber(numberStrings []string) ([]int, error) {
var numbers []int
for _, line := range strings {
number, err := strconv.Atoi(line)
for _, numberString := range numberStrings {
trimmedNumberString := strings.TrimSpace(numberString)
number, err := strconv.Atoi(trimmedNumberString)
if err != nil {
return numbers, err
}
@ -119,3 +120,13 @@ func Transpose(in [][]int) [][]int {
}
return out
}
func Delete (stringArray []string, selector string) []string {
var returnString []string
for _, str := range stringArray {
if str != selector {
returnString = append(returnString, str)
}
}
return returnString
}