Advent of Code 2021-12-04 submission
Advent of Code 2021 - Day 4 "Giant Squid"
go run bingo.go <input file>
go test -v *.go
Advent of Code 2021-12-04 submission
Advent of Code 2021 - Day 4 "Giant Squid"
go run bingo.go <input file>
go test -v *.go
package main | |
import ( | |
"fmt" | |
"io/ioutil" | |
"os" | |
"strconv" | |
"strings" | |
) | |
type Cell struct { | |
Marked bool | |
Value int | |
} | |
type Bingo struct { | |
Cells [5][5]*Cell | |
} | |
func NewBingoFromString(bingoStr string) *Bingo { | |
newBingo := Bingo{} | |
rows := strings.Split(bingoStr, "\n") | |
nonEmptyRows := []string{} | |
for _, row := range rows { | |
if len(row) > 0 { | |
nonEmptyRows = append(nonEmptyRows, row) | |
} | |
} | |
for rowIndex, row := range nonEmptyRows { | |
cellsStr := strings.Fields(row) | |
for columnIndex, cell := range cellsStr { | |
num, err := strconv.Atoi(cell) | |
if err != nil { | |
panic("Something went wrong with the number conversion") | |
} | |
newCell := &Cell{ | |
Marked: false, | |
Value: num, | |
} | |
newBingo.Cells[rowIndex][columnIndex] = newCell | |
} | |
} | |
return &newBingo | |
} | |
func (bingo *Bingo) MarkNumber(num int) bool { | |
foundNumInBingo := false | |
for _, row := range bingo.Cells { | |
for _, cell := range row { | |
if cell.Value == num { | |
foundNumInBingo = true | |
cell.Marked = true | |
} | |
} | |
} | |
return foundNumInBingo | |
} | |
func (bingo *Bingo) ContainsBingo() bool { | |
for _, row := range bingo.Cells { | |
rowBingo := false | |
for i, cell := range row { | |
if i == 0 { | |
rowBingo = cell.Marked | |
continue | |
} | |
rowBingo = rowBingo && cell.Marked | |
} | |
if rowBingo { | |
return true | |
} | |
} | |
for columnIndex, _ := range bingo.Cells[0] { | |
columnBingo := false | |
for i, _ := range bingo.Cells { | |
currentCell := bingo.Cells[i][columnIndex] | |
if i == 0 { | |
columnBingo = currentCell.Marked | |
continue | |
} | |
columnBingo = columnBingo && currentCell.Marked | |
} | |
if columnBingo { | |
return true | |
} | |
} | |
return false | |
} | |
func (bingo *Bingo) MarkNumberAndScore(num int) (bool, int) { | |
foundNum := bingo.MarkNumber(num) | |
score := 0 | |
for _, row := range bingo.Cells { | |
for _, cell := range row { | |
if !cell.Marked { | |
score += cell.Value | |
} | |
} | |
} | |
score *= num | |
return foundNum, score | |
} | |
func (bingo *Bingo) ToString() string { | |
str := "" | |
for _, row := range bingo.Cells { | |
for _, cell := range row { | |
if cell.Marked { | |
str += fmt.Sprintf("(%02d) ", cell.Value) | |
} else { | |
str += fmt.Sprintf(" %02d ", cell.Value) | |
} | |
} | |
str += "\n" | |
} | |
return str | |
} | |
type Bingos []*Bingo | |
func (bingos *Bingos) RemainingBingoCount() int { | |
bingoCount := 0 | |
for _, bingo := range *bingos { | |
if bingo.ContainsBingo() { | |
bingoCount += 1 | |
} | |
} | |
return len(*bingos) - bingoCount | |
} | |
func main() { | |
if len(os.Args) == 1 { | |
fmt.Println("Please specify which gamefile to load:\ne.g.: go run bingo.go game.txt") | |
os.Exit(0) | |
} | |
gameFile := os.Args[1] | |
fmt.Printf("Loading game file: %s...\n", gameFile) | |
pcMode := false | |
if len(os.Args) > 2 && os.Args[2] == "PC_MODE" { | |
pcMode = true | |
} | |
if pcMode { | |
fmt.Printf("\n\n~~ EVERYBODY'S A WINNER ~~\n\n") | |
} else { | |
fmt.Println("Regular mode...") | |
} | |
fmt.Printf("Loading game file: %s...\n", gameFile) | |
gameFileRaw, err := ioutil.ReadFile(gameFile) | |
if err != nil { | |
fmt.Print(err) | |
} | |
gameFileStr := string(gameFileRaw) | |
contents := strings.Split(gameFileStr, "\n\n") | |
moveStrs := contents[0] | |
bingoStrs := contents[1:] | |
moves := []int{} | |
for _, moveStr := range strings.Split(moveStrs, ",") { | |
move, err := strconv.Atoi(moveStr) | |
if err != nil { | |
panic("Something went wrong with the number conversion") | |
} | |
moves = append(moves, move) | |
} | |
bingos := Bingos{} | |
for _, bingoStr := range bingoStrs { | |
newBingo := NewBingoFromString(bingoStr) | |
bingos = append(bingos, newBingo) | |
} | |
fmt.Printf("Loaded %d moves, and %d bingo boards\n", len(moves), len(bingos)) | |
fmt.Printf("\n\nLet's play bingo!\n\n") | |
for _, move := range moves { | |
fmt.Printf("Does anyone have a %d?\n", move) | |
for _, bingo := range bingos { | |
bingoStatusBefore := bingo.ContainsBingo() | |
found, score := bingo.MarkNumberAndScore(move) | |
bingoStatusAfter := bingo.ContainsBingo() | |
bingoStatusChanged := !bingoStatusBefore && bingoStatusAfter | |
if pcMode && bingoStatusChanged { | |
fmt.Printf("\n\n~BINGO!~ (Score: %d) (%d bingos remaining)\n\n", score, bingos.RemainingBingoCount()) | |
} | |
if (!pcMode && bingo.ContainsBingo()) || (pcMode && bingoStatusChanged && bingos.RemainingBingoCount() == 0) { | |
fmt.Printf(` | |
\ | | | | | | / | |
-- B I N G O !! -- | |
/ | | | | | | \ | |
%s | |
~~ Score: %d ~~`, bingo.ToString(), score) | |
fmt.Print("\n") | |
os.Exit(0) | |
} | |
if found { | |
fmt.Print("|") | |
} else { | |
fmt.Print(".") | |
} | |
} | |
fmt.Print("\n\n") | |
} | |
} |
package main | |
import "testing" | |
func TestNewBingoFromInput(t *testing.T) { | |
bingoStr := ` | |
84 94 24 52 44 | |
96 33 74 35 13 | |
60 51 41 19 95 | |
50 93 27 40 1 | |
67 23 37 88 85 | |
` | |
bingo := NewBingoFromString(bingoStr) | |
middleCell := bingo.Cells[2][2].Value | |
if middleCell != 41 { | |
t.Errorf("Middle cell in bingo expected to be 41, instead: %d", middleCell) | |
} | |
middleCellMarked := bingo.Cells[2][2].Marked | |
if middleCellMarked != false { | |
t.Errorf("Middle cell in bingo expected to be unmarked, instead: %t", middleCellMarked) | |
} | |
} | |
func TestMarkNumber(t *testing.T) { | |
bingoStr := ` | |
84 94 24 52 44 | |
96 33 74 35 13 | |
60 51 41 19 95 | |
50 93 27 40 1 | |
67 23 37 88 85 | |
` | |
bingo := NewBingoFromString(bingoStr) | |
found123 := bingo.MarkNumber(123) | |
if found123 { | |
t.Error("Found 123, even though it's not part of the bingo") | |
} | |
found41 := bingo.MarkNumber(41) | |
if !found41 { | |
t.Error("Did not find 41, even though it's in the bingo") | |
} | |
middleCellMarked := bingo.Cells[2][2].Marked | |
if !middleCellMarked { | |
t.Error("Middle cell not marked, even though it should be (it's the number 41)") | |
} | |
} | |
func TestContainsBingo(t *testing.T) { | |
bingoStr := ` | |
84 94 24 52 44 | |
96 33 74 35 13 | |
60 51 41 19 95 | |
50 93 27 40 1 | |
67 23 37 88 85 | |
` | |
containsRowBingo := NewBingoFromString(bingoStr) | |
containsRowBingo.MarkNumber(60) | |
containsRowBingo.MarkNumber(51) | |
containsRowBingo.MarkNumber(41) | |
containsRowBingo.MarkNumber(19) | |
if containsRowBingo.ContainsBingo() { | |
t.Error("Row Bingo should not yet contain a bingo") | |
} | |
containsRowBingo.MarkNumber(95) | |
if !containsRowBingo.ContainsBingo() { | |
t.Error("Row Bingo should have a bingo") | |
} | |
containsColumnBingo := NewBingoFromString(bingoStr) | |
containsColumnBingo.MarkNumber(24) | |
containsColumnBingo.MarkNumber(74) | |
containsColumnBingo.MarkNumber(41) | |
containsColumnBingo.MarkNumber(27) | |
if containsColumnBingo.ContainsBingo() { | |
t.Error("Column Bingo should not yet contain a bingo") | |
} | |
containsColumnBingo.MarkNumber(37) | |
if !containsColumnBingo.ContainsBingo() { | |
t.Error("Column Bingo should have a bingo") | |
} | |
} | |
func TestMarkNumberAndScore(t *testing.T) { | |
bingoStr := ` | |
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 | |
` | |
bingo := NewBingoFromString(bingoStr) | |
bingo.MarkNumber(7) | |
bingo.MarkNumber(4) | |
bingo.MarkNumber(9) | |
bingo.MarkNumber(5) | |
bingo.MarkNumber(11) | |
bingo.MarkNumber(17) | |
bingo.MarkNumber(23) | |
bingo.MarkNumber(2) | |
bingo.MarkNumber(0) | |
bingo.MarkNumber(14) | |
bingo.MarkNumber(21) | |
found, score := bingo.MarkNumberAndScore(24) | |
if !found { | |
t.Error("Expected 4 to be found") | |
} | |
if score != 4512 { | |
t.Errorf("Expected score to be 4512, instead go %d\n", score) | |
} | |
} | |
func TestRemainingBingoCount(t *testing.T) { | |
bingoStr := ` | |
84 94 24 52 44 | |
96 33 74 35 13 | |
60 51 41 19 95 | |
50 93 27 40 1 | |
67 23 37 88 85 | |
` | |
bingo := NewBingoFromString(bingoStr) | |
bingos := Bingos{bingo} | |
bingo.MarkNumber(60) | |
bingo.MarkNumber(51) | |
bingo.MarkNumber(41) | |
bingo.MarkNumber(19) | |
if bingos.RemainingBingoCount() != 1 { | |
t.Errorf("Remainig bingo count should be 1, instead go %d", bingos.RemainingBingoCount()) | |
} | |
bingo.MarkNumber(95) | |
if bingos.RemainingBingoCount() != 0 { | |
t.Errorf("Remainig bingo count should be 0, instead go %d", bingos.RemainingBingoCount()) | |
} | |
} |
46,79,77,45,57,34,44,13,32,88,86,82,91,97,89,1,48,31,18,10,55,74,24,11,80,78,28,37,47,17,21,61,26,85,99,96,23,70,3,54,5,41,50,63,14,64,42,36,95,52,76,68,29,9,98,35,84,83,71,49,73,58,56,66,92,30,51,20,81,69,65,15,6,16,39,43,67,7,59,40,60,4,90,72,22,0,93,94,38,53,87,27,12,2,25,19,8,62,33,75 | |
84 94 24 52 44 | |
96 33 74 35 13 | |
60 51 41 19 95 | |
50 93 27 40 1 | |
67 23 37 88 85 | |
12 85 6 97 77 | |
79 28 24 70 51 | |
71 72 78 55 73 | |
11 36 5 98 19 | |
30 67 89 95 62 | |
54 38 70 29 51 | |
16 19 80 96 63 | |
76 23 10 30 24 | |
45 81 97 82 90 | |
60 94 28 11 83 | |
50 56 42 68 48 | |
6 70 78 22 27 | |
75 11 63 24 47 | |
29 99 91 73 97 | |
7 16 28 12 44 | |
20 62 50 36 12 | |
3 10 40 8 56 | |
78 61 66 37 89 | |
72 26 19 65 22 | |
30 91 27 5 63 | |
75 91 84 0 96 | |
1 58 83 81 20 | |
36 8 82 66 77 | |
59 15 71 80 56 | |
17 45 46 26 73 | |
33 71 28 10 80 | |
90 0 92 30 74 | |
66 46 43 88 75 | |
11 36 42 67 22 | |
37 79 69 17 94 | |
46 66 4 20 77 | |
59 34 23 30 52 | |
85 65 61 33 40 | |
19 48 82 68 37 | |
88 11 12 43 75 | |
4 53 32 29 3 | |
0 6 17 5 76 | |
13 67 92 2 24 | |
64 57 80 42 30 | |
18 85 21 65 44 | |
90 98 50 8 89 | |
40 9 42 62 61 | |
60 86 48 31 32 | |
15 96 88 95 1 | |
93 68 72 74 73 | |
75 90 96 59 95 | |
84 38 26 70 73 | |
23 11 63 29 48 | |
28 1 4 80 55 | |
15 14 67 12 61 | |
1 93 54 63 56 | |
61 19 20 8 95 | |
3 73 22 60 36 | |
91 27 37 38 99 | |
83 64 74 87 28 | |
13 89 95 72 37 | |
10 81 47 52 88 | |
56 78 50 42 73 | |
38 0 5 43 55 | |
77 69 74 28 94 | |
7 59 76 36 43 | |
48 82 57 4 83 | |
22 62 1 16 11 | |
37 27 54 34 87 | |
95 89 85 3 44 | |
76 6 53 52 89 | |
31 18 81 23 25 | |
77 79 20 66 7 | |
72 19 73 91 57 | |
17 33 63 92 88 | |
52 51 1 19 7 | |
36 46 73 37 6 | |
87 77 2 56 57 | |
8 18 40 23 71 | |
50 58 5 65 31 | |
45 86 87 12 75 | |
95 20 93 72 50 | |
90 1 55 13 66 | |
14 3 70 97 54 | |
32 26 60 11 62 | |
20 25 0 82 83 | |
3 14 61 34 46 | |
85 58 65 76 26 | |
47 15 86 81 88 | |
49 90 16 42 70 | |
87 85 68 17 57 | |
69 40 99 71 24 | |
12 55 86 95 64 | |
42 2 1 72 3 | |
80 7 18 94 31 | |
27 41 21 89 46 | |
57 3 18 98 4 | |
5 60 62 54 14 | |
31 26 81 53 71 | |
91 13 43 12 15 | |
66 82 9 23 8 | |
52 64 79 99 29 | |
21 7 39 74 70 | |
50 0 89 26 5 | |
1 83 62 6 93 | |
64 85 74 73 11 | |
1 57 0 97 93 | |
95 7 17 45 47 | |
52 5 28 81 34 | |
18 8 80 29 54 | |
0 10 92 70 88 | |
30 14 77 24 33 | |
56 6 75 40 48 | |
17 34 65 79 68 | |
51 67 71 64 8 | |
36 10 94 91 34 | |
8 23 6 79 40 | |
4 44 15 0 67 | |
90 97 12 26 30 | |
57 93 22 99 27 | |
22 90 32 83 40 | |
84 67 69 4 49 | |
39 42 16 29 71 | |
47 77 15 13 78 | |
19 92 43 62 35 | |
50 7 86 9 33 | |
93 73 51 26 46 | |
91 84 67 29 56 | |
69 54 74 19 35 | |
2 43 63 53 78 | |
85 51 4 17 90 | |
21 67 24 40 99 | |
10 83 84 11 48 | |
8 56 87 2 6 | |
7 30 74 35 43 | |
11 67 27 60 39 | |
43 40 94 1 50 | |
15 42 75 24 21 | |
87 68 29 41 84 | |
86 16 63 74 2 | |
84 64 7 11 50 | |
54 70 40 60 86 | |
67 66 58 18 98 | |
85 32 91 90 75 | |
81 97 74 94 28 | |
56 93 51 46 89 | |
29 14 53 17 64 | |
9 94 82 79 62 | |
81 84 58 78 90 | |
95 67 37 30 44 | |
91 17 88 54 41 | |
5 22 37 15 63 | |
36 89 34 48 49 | |
11 27 83 40 80 | |
8 7 26 69 33 | |
77 57 52 75 18 | |
8 33 48 9 97 | |
99 80 10 31 28 | |
64 14 49 68 72 | |
26 66 35 36 45 | |
81 22 65 55 39 | |
32 97 18 4 23 | |
61 91 60 33 40 | |
3 54 48 2 68 | |
24 62 67 53 77 | |
86 87 78 73 75 | |
0 2 54 95 63 | |
99 83 12 68 27 | |
13 90 44 77 88 | |
79 47 72 84 4 | |
30 48 23 81 93 | |
36 89 79 75 43 | |
54 55 29 74 92 | |
71 32 51 52 62 | |
13 72 6 63 65 | |
44 78 4 57 37 | |
15 24 88 30 89 | |
34 35 69 16 91 | |
36 12 98 55 51 | |
31 27 49 46 48 | |
60 32 24 98 58 | |
63 14 91 4 1 | |
74 69 56 65 40 | |
36 77 79 28 43 | |
95 31 12 88 55 | |
22 36 33 3 46 | |
64 79 25 38 10 | |
1 5 99 48 82 | |
35 96 21 50 7 | |
15 88 58 27 66 | |
87 62 22 41 79 | |
57 0 82 18 48 | |
17 73 83 46 60 | |
14 97 7 28 31 | |
90 94 16 58 66 | |
21 56 79 8 54 | |
35 58 25 12 22 | |
27 75 7 93 86 | |
3 99 9 59 32 | |
45 40 64 60 68 | |
96 26 19 49 28 | |
7 58 72 14 12 | |
55 80 1 35 71 | |
29 41 63 74 65 | |
69 46 75 82 73 | |
57 71 64 13 56 | |
31 77 95 40 66 | |
80 9 7 88 49 | |
73 47 82 46 75 | |
23 15 1 36 2 | |
62 23 58 0 75 | |
14 96 60 85 59 | |
49 43 80 64 29 | |
5 44 24 30 54 | |
78 90 98 97 38 | |
86 40 56 32 41 | |
27 19 69 30 77 | |
48 31 4 26 58 | |
55 78 94 34 99 | |
72 65 92 37 71 | |
16 23 61 65 34 | |
62 88 52 10 29 | |
11 77 67 2 90 | |
44 30 82 32 13 | |
26 53 56 93 9 | |
60 6 79 29 12 | |
28 68 21 71 97 | |
3 24 34 63 95 | |
13 52 74 18 91 | |
14 64 57 94 20 | |
98 84 40 24 45 | |
69 81 1 85 49 | |
91 29 78 7 35 | |
5 20 27 93 61 | |
47 95 43 39 17 | |
49 35 97 41 26 | |
10 51 36 94 14 | |
65 83 82 27 55 | |
24 88 29 13 95 | |
56 57 38 16 21 | |
98 3 62 58 45 | |
67 17 81 93 19 | |
86 42 10 99 51 | |
8 57 55 63 92 | |
25 50 76 18 4 | |
39 99 67 56 30 | |
41 1 7 68 70 | |
37 75 29 62 50 | |
61 55 16 52 15 | |
84 0 73 31 33 | |
19 3 87 72 90 | |
57 43 35 8 15 | |
51 10 4 42 56 | |
86 62 25 29 83 | |
97 49 28 70 59 | |
8 13 31 38 59 | |
86 94 55 10 1 | |
81 18 45 48 32 | |
43 25 37 49 67 | |
22 95 11 82 44 | |
12 87 40 76 5 | |
18 43 69 98 27 | |
30 4 63 20 89 | |
7 97 0 9 54 | |
39 45 25 53 52 | |
14 32 62 54 56 | |
57 66 19 99 51 | |
65 41 90 94 11 | |
36 10 87 83 73 | |
84 82 50 95 29 | |
2 92 14 4 11 | |
9 63 81 20 46 | |
26 39 70 15 7 | |
18 85 68 79 84 | |
74 32 57 12 28 | |
70 59 90 17 15 | |
33 16 3 41 26 | |
8 49 73 95 76 | |
93 13 94 55 91 | |
20 54 30 74 52 | |
95 8 54 84 34 | |
33 24 68 14 64 | |
88 42 27 10 20 | |
70 40 52 6 32 | |
99 9 1 72 73 | |
81 63 67 98 79 | |
42 14 48 74 4 | |
10 51 8 13 56 | |
90 61 3 18 23 | |
33 58 43 75 41 | |
93 42 68 44 53 | |
26 1 21 22 64 | |
56 32 30 9 35 | |
63 91 29 40 47 | |
99 57 11 96 15 | |
43 29 69 68 65 | |
23 16 15 86 6 | |
50 56 78 9 21 | |
73 82 36 7 22 | |
8 18 37 58 95 | |
19 85 36 73 71 | |
65 62 14 52 3 | |
30 83 44 41 5 | |
55 15 0 61 95 | |
28 13 32 31 88 | |
48 92 33 50 7 | |
11 47 46 35 76 | |
36 37 54 2 89 | |
23 63 52 69 9 | |
56 20 67 14 43 | |
38 28 47 70 57 | |
4 85 46 97 34 | |
14 94 2 35 72 | |
27 58 63 68 39 | |
6 92 54 91 96 | |
28 96 60 89 37 | |
83 77 57 5 27 | |
71 67 99 91 29 | |
88 10 41 19 50 | |
76 9 20 14 98 | |
52 43 80 33 1 | |
68 83 59 37 87 | |
10 85 24 90 58 | |
48 79 69 27 42 | |
76 61 86 23 7 | |
72 49 51 12 43 | |
73 56 83 4 27 | |
48 94 38 18 32 | |
14 96 36 8 13 | |
87 60 5 77 42 | |
41 36 16 28 2 | |
94 15 97 70 48 | |
32 39 80 95 69 | |
31 75 21 8 19 | |
79 65 50 14 67 | |
76 67 16 49 87 | |
3 22 11 82 65 | |
73 15 78 13 52 | |
19 17 64 9 56 | |
60 77 24 91 38 | |
11 56 41 8 86 | |
53 38 69 62 67 | |
32 6 35 24 66 | |
57 84 83 49 2 | |
82 88 10 28 47 | |
13 60 28 34 76 | |
57 54 59 48 99 | |
19 85 53 22 45 | |
9 69 55 32 64 | |
70 15 5 71 33 | |
91 63 9 8 85 | |
37 46 23 60 24 | |
59 50 87 43 3 | |
57 47 51 98 25 | |
53 86 4 42 52 | |
19 82 11 14 89 | |
4 78 92 43 5 | |
96 61 67 47 69 | |
50 45 49 86 44 | |
27 88 32 98 59 | |
83 8 33 54 16 | |
30 95 23 86 27 | |
44 72 5 43 2 | |
76 26 28 63 81 | |
24 37 45 90 73 | |
16 48 9 62 61 | |
50 45 92 59 4 | |
56 86 98 3 44 | |
76 43 97 40 11 | |
38 58 67 20 74 | |
14 75 39 44 42 | |
47 80 99 57 77 | |
1 48 24 85 79 | |
68 38 25 28 49 | |
17 20 11 36 67 | |
67 59 32 19 53 | |
45 26 0 35 91 | |
85 80 89 51 25 | |
7 95 11 78 73 | |
50 5 1 88 62 | |
38 91 25 80 14 | |
26 96 82 52 67 | |
8 53 92 77 34 | |
49 76 50 35 42 | |
66 17 85 75 16 | |
36 63 78 73 26 | |
51 28 74 57 54 | |
21 27 14 2 67 | |
19 69 16 40 41 | |
95 45 38 70 8 | |
12 23 17 46 91 | |
75 88 58 25 9 | |
65 64 62 49 33 | |
27 59 63 21 73 | |
56 31 87 81 0 | |
14 82 79 46 51 | |
32 77 11 1 99 | |
0 29 15 25 64 | |
44 16 35 60 95 | |
41 54 72 61 87 | |
58 2 13 51 1 | |
29 97 98 71 36 | |
66 89 50 38 62 | |
87 42 79 75 76 | |
37 6 77 11 72 | |
97 98 88 90 73 | |
36 50 71 33 57 | |
44 9 37 54 25 | |
27 15 13 77 60 | |
21 24 72 68 85 | |
77 58 45 95 32 | |
38 79 84 56 90 | |
1 70 24 88 12 | |
7 91 98 9 18 | |
93 89 37 81 25 | |
53 34 44 59 46 | |
61 42 89 37 15 | |
23 30 43 3 55 | |
49 6 60 79 50 | |
77 10 92 36 17 | |
60 14 58 49 19 | |
9 87 80 76 3 | |
81 62 66 38 50 | |
53 28 69 12 64 | |
98 83 72 34 85 | |
38 30 52 43 24 | |
75 29 57 4 3 | |
97 72 94 41 19 | |
80 90 39 9 20 | |
6 91 10 44 67 | |
51 43 76 64 42 | |
16 56 46 82 99 | |
55 72 35 39 65 | |
66 86 93 23 34 | |
31 84 9 96 74 | |
64 68 14 2 97 | |
88 22 99 23 28 | |
5 41 11 47 63 | |
81 17 10 27 89 | |
24 36 0 58 86 | |
20 34 1 89 36 | |
86 15 79 30 17 | |
96 31 4 50 16 | |
92 23 61 12 99 | |
60 65 91 13 76 | |
41 67 90 27 78 | |
85 48 40 57 19 | |
43 36 30 11 68 | |
16 91 76 74 81 | |
97 39 86 75 80 | |
94 92 54 14 60 | |
31 17 39 77 73 | |
11 12 52 49 40 | |
63 96 68 35 71 | |
98 75 37 65 44 | |
3 97 59 72 85 | |
14 55 96 87 28 | |
47 63 91 81 50 | |
68 79 9 35 37 | |
49 10 1 24 20 | |
42 66 54 29 95 | |
47 28 81 14 68 | |
37 15 22 58 13 | |
49 36 90 72 5 | |
74 71 88 34 70 | |
34 65 39 6 86 | |
80 43 8 14 27 | |
72 45 0 25 23 | |
50 2 13 41 26 | |
64 18 9 69 35 | |
36 43 4 3 90 | |
69 47 95 10 65 | |
6 56 30 13 22 | |
55 50 63 99 76 | |
54 92 51 96 23 | |
56 4 52 37 98 | |
84 49 95 33 85 | |
34 87 75 15 91 | |
14 68 13 24 97 | |
59 58 10 90 93 | |
26 63 36 68 39 | |
47 79 33 25 8 | |
91 52 11 59 93 | |
50 67 96 34 6 | |
20 54 41 89 3 | |
63 59 34 62 74 | |
84 76 88 54 8 | |
15 61 60 7 77 | |
22 55 18 80 37 | |
90 2 94 91 70 | |
23 12 16 11 50 | |
59 27 58 32 35 | |
92 42 75 19 70 | |
31 88 28 30 95 | |
17 72 80 39 91 | |
38 46 18 54 76 | |
25 22 47 10 11 | |
63 29 74 71 92 | |
75 98 0 65 4 | |
87 14 13 64 12 |
module bingo | |
go 1.16 |