Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.2 KiB
81 lines
1.2 KiB
package match |
|
|
|
// todo common table of rune's length |
|
|
|
import ( |
|
"fmt" |
|
"strings" |
|
) |
|
|
|
const lenOne = 1 |
|
const lenZero = 0 |
|
const lenNo = -1 |
|
|
|
type Matcher interface { |
|
Match(string) bool |
|
Index(string) (int, []int) |
|
Len() int |
|
String() string |
|
} |
|
|
|
type Matchers []Matcher |
|
|
|
func (m Matchers) String() string { |
|
var s []string |
|
for _, matcher := range m { |
|
s = append(s, fmt.Sprint(matcher)) |
|
} |
|
|
|
return fmt.Sprintf("%s", strings.Join(s, ",")) |
|
} |
|
|
|
// appendMerge merges and sorts given already SORTED and UNIQUE segments. |
|
func appendMerge(target, sub []int) []int { |
|
lt, ls := len(target), len(sub) |
|
out := make([]int, 0, lt+ls) |
|
|
|
for x, y := 0, 0; x < lt || y < ls; { |
|
if x >= lt { |
|
out = append(out, sub[y:]...) |
|
break |
|
} |
|
|
|
if y >= ls { |
|
out = append(out, target[x:]...) |
|
break |
|
} |
|
|
|
xValue := target[x] |
|
yValue := sub[y] |
|
|
|
switch { |
|
|
|
case xValue == yValue: |
|
out = append(out, xValue) |
|
x++ |
|
y++ |
|
|
|
case xValue < yValue: |
|
out = append(out, xValue) |
|
x++ |
|
|
|
case yValue < xValue: |
|
out = append(out, yValue) |
|
y++ |
|
|
|
} |
|
} |
|
|
|
target = append(target[:0], out...) |
|
|
|
return target |
|
} |
|
|
|
func reverseSegments(input []int) { |
|
l := len(input) |
|
m := l / 2 |
|
|
|
for i := 0; i < m; i++ { |
|
input[i], input[l-i-1] = input[l-i-1], input[i] |
|
} |
|
}
|
|
|