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