mirror of
https://github.com/Threnklyn/advent-of-code-go.git
synced 2026-05-18 19:13:27 +02:00
algos added for splitting on multiple seperators
This commit is contained in:
+2
-17
@@ -6,6 +6,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/alexchao26/advent-of-code-go/algos"
|
||||||
"github.com/alexchao26/advent-of-code-go/util"
|
"github.com/alexchao26/advent-of-code-go/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -92,7 +93,7 @@ func parseInput(input string) (botsMap map[int][]int, rules []rule) {
|
|||||||
}
|
}
|
||||||
botsMap[botID] = append(botsMap[botID], value)
|
botsMap[botID] = append(botsMap[botID], value)
|
||||||
} else {
|
} else {
|
||||||
parts := splitOn(line, []string{" gives ", " and "})
|
parts := algos.SplitStringOn(line, []string{" gives ", " and "})
|
||||||
r := rule{lowRule: parts[1], highRule: parts[2]}
|
r := rule{lowRule: parts[1], highRule: parts[2]}
|
||||||
_, err := fmt.Sscanf(parts[0], "bot %d", &r.botID)
|
_, err := fmt.Sscanf(parts[0], "bot %d", &r.botID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -103,19 +104,3 @@ func parseInput(input string) (botsMap map[int][]int, rules []rule) {
|
|||||||
}
|
}
|
||||||
return botsMap, rules
|
return botsMap, rules
|
||||||
}
|
}
|
||||||
|
|
||||||
func splitOn(in string, cutset []string) []string {
|
|
||||||
parts := strings.Split(in, cutset[0])
|
|
||||||
cutset = cutset[1:]
|
|
||||||
var done bool
|
|
||||||
for !done && len(cutset) > 0 {
|
|
||||||
divider := cutset[0]
|
|
||||||
cutset = cutset[1:]
|
|
||||||
var newParts []string
|
|
||||||
for _, oldPart := range parts {
|
|
||||||
newParts = append(newParts, strings.Split(oldPart, divider)...)
|
|
||||||
}
|
|
||||||
parts = newParts
|
|
||||||
}
|
|
||||||
return parts
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package algos
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
// SplitStringOn is like strings.Split but takes in a slice of strings that are
|
||||||
|
// all used as dividers in the incoming string
|
||||||
|
func SplitStringOn(in string, cutset []string) []string {
|
||||||
|
parts := strings.Split(in, cutset[0])
|
||||||
|
cutset = cutset[1:]
|
||||||
|
var done bool
|
||||||
|
for !done && len(cutset) > 0 {
|
||||||
|
divider := cutset[0]
|
||||||
|
cutset = cutset[1:]
|
||||||
|
var newParts []string
|
||||||
|
for _, oldPart := range parts {
|
||||||
|
newParts = append(newParts, strings.Split(oldPart, divider)...)
|
||||||
|
}
|
||||||
|
parts = newParts
|
||||||
|
}
|
||||||
|
return parts
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package algos_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/alexchao26/advent-of-code-go/algos"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSplitStringOn(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
in string
|
||||||
|
cutset []string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want []string
|
||||||
|
}{
|
||||||
|
{"simple_cutset_len_1", args{"bot 1 gets 4", []string{" gets "}}, []string{"bot 1", "4"}},
|
||||||
|
{"simple", args{"hello x world y potato", []string{" x ", " y "}}, []string{"hello", "world", "potato"}},
|
||||||
|
{"longer example", args{"onextwoxthree-one-two-threexfour", []string{"x", "-"}}, []string{"one", "two", "three", "one", "two", "three", "four"}},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if got := algos.SplitStringOn(tt.args.in, tt.args.cutset); !reflect.DeepEqual(got, tt.want) {
|
||||||
|
t.Errorf("SplitStringOn() = %v, want %v", got, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user