mirror of
https://github.com/Threnklyn/advent-of-code-go.git
synced 2026-05-18 19:13:27 +02:00
learning about regexp capture groups, seems like it could be quite useful...
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
// Package learning is for testing random things that might be useful but I need
|
||||
// to spend some time playing around with
|
||||
package learning
|
||||
@@ -0,0 +1,32 @@
|
||||
package learning
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/alexchao26/advent-of-code-go/cast"
|
||||
)
|
||||
|
||||
func CaptureBingoBoard(board string) [][]int {
|
||||
var nums [][]int
|
||||
// parens create indexed capture groups
|
||||
// when used with (*regexp).FindStringSubmatch a string slice is returned
|
||||
pattern := regexp.MustCompile(`\s?(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)`)
|
||||
|
||||
for _, row := range strings.Split(board, "\n") {
|
||||
matches := pattern.FindStringSubmatch(row)
|
||||
if matches == nil {
|
||||
panic("row does not match pattern: " + row)
|
||||
}
|
||||
|
||||
// submatch[0] is the entire string
|
||||
// submatch[1:] are the captured groups that i'm interested in
|
||||
var rowNums []int
|
||||
for _, v := range matches[1:] {
|
||||
rowNums = append(rowNums, cast.ToInt(v))
|
||||
}
|
||||
nums = append(nums, rowNums)
|
||||
}
|
||||
|
||||
return nums
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package learning
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var (
|
||||
example1 = `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`
|
||||
|
||||
example2 = ` 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`
|
||||
|
||||
example3 = `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`
|
||||
)
|
||||
|
||||
func TestCaptureBingoBoard(t *testing.T) {
|
||||
type args struct {
|
||||
board string
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want [][]int
|
||||
}{
|
||||
{
|
||||
name: "example 1",
|
||||
args: args{
|
||||
board: example1,
|
||||
},
|
||||
want: [][]int{
|
||||
{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},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "example 2",
|
||||
args: args{
|
||||
board: example2,
|
||||
},
|
||||
want: [][]int{
|
||||
{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},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "example 3",
|
||||
args: args{
|
||||
board: example3,
|
||||
},
|
||||
want: [][]int{
|
||||
{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},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := CaptureBingoBoard(tt.args.board); !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("CaptureBingoBoard() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user