|
Packit Service |
4d2de5 |
package match
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// todo common table of rune's length
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
import (
|
|
Packit Service |
4d2de5 |
"fmt"
|
|
Packit Service |
4d2de5 |
"strings"
|
|
Packit Service |
4d2de5 |
)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
const lenOne = 1
|
|
Packit Service |
4d2de5 |
const lenZero = 0
|
|
Packit Service |
4d2de5 |
const lenNo = -1
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
type Matcher interface {
|
|
Packit Service |
4d2de5 |
Match(string) bool
|
|
Packit Service |
4d2de5 |
Index(string) (int, []int)
|
|
Packit Service |
4d2de5 |
Len() int
|
|
Packit Service |
4d2de5 |
String() string
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
type Matchers []Matcher
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func (m Matchers) String() string {
|
|
Packit Service |
4d2de5 |
var s []string
|
|
Packit Service |
4d2de5 |
for _, matcher := range m {
|
|
Packit Service |
4d2de5 |
s = append(s, fmt.Sprint(matcher))
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return fmt.Sprintf("%s", strings.Join(s, ","))
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
// appendMerge merges and sorts given already SORTED and UNIQUE segments.
|
|
Packit Service |
4d2de5 |
func appendMerge(target, sub []int) []int {
|
|
Packit Service |
4d2de5 |
lt, ls := len(target), len(sub)
|
|
Packit Service |
4d2de5 |
out := make([]int, 0, lt+ls)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
for x, y := 0, 0; x < lt || y < ls; {
|
|
Packit Service |
4d2de5 |
if x >= lt {
|
|
Packit Service |
4d2de5 |
out = append(out, sub[y:]...)
|
|
Packit Service |
4d2de5 |
break
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
if y >= ls {
|
|
Packit Service |
4d2de5 |
out = append(out, target[x:]...)
|
|
Packit Service |
4d2de5 |
break
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
xValue := target[x]
|
|
Packit Service |
4d2de5 |
yValue := sub[y]
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
switch {
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
case xValue == yValue:
|
|
Packit Service |
4d2de5 |
out = append(out, xValue)
|
|
Packit Service |
4d2de5 |
x++
|
|
Packit Service |
4d2de5 |
y++
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
case xValue < yValue:
|
|
Packit Service |
4d2de5 |
out = append(out, xValue)
|
|
Packit Service |
4d2de5 |
x++
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
case yValue < xValue:
|
|
Packit Service |
4d2de5 |
out = append(out, yValue)
|
|
Packit Service |
4d2de5 |
y++
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
target = append(target[:0], out...)
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
return target
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
func reverseSegments(input []int) {
|
|
Packit Service |
4d2de5 |
l := len(input)
|
|
Packit Service |
4d2de5 |
m := l / 2
|
|
Packit Service |
4d2de5 |
|
|
Packit Service |
4d2de5 |
for i := 0; i < m; i++ {
|
|
Packit Service |
4d2de5 |
input[i], input[l-i-1] = input[l-i-1], input[i]
|
|
Packit Service |
4d2de5 |
}
|
|
Packit Service |
4d2de5 |
}
|