package main
import (
"fmt"
"math"
"os"
"strconv"
"strings"
)
var separators = []string{"-", ":", ".."}
func main() {
for i := range os.Args {
fmt.Print(ParseRange(os.Args[i]), "\r\n")
}
}
func ParseRange(input string) []int {
var elements = strings.Split(input, ",")
var ret []int
var last = 0
for _, v := range elements {
elems := ProcessElement(v, last)
last = elems[len(elems)-1]
ret = append(ret, elems...)
}
return ret
}
func ProcessElement(elem string, last int) []int {
var ret []int
if sep := GetSeparator(elem); sep != "" {
ret = ExplodeRanges(strings.Split(elem, sep), last)
} else {
ret = []int{BiasString(last, elem)}
}
return ret
}
func ExplodeRanges(nums []string, last int) []int {
var ret []int
for i := 0; i < len(nums)-1; i++ {
lower := BiasString(last, nums[i])
upper := BiasString(lower, nums[i+1])
arr := MakeRange(lower, upper)
if i+1 < len(nums)-1 {
arr = arr[:len(arr)-1]
}
ret = append(ret, arr...)
}
return ret
}
func MakeRange(lower int, upper int) []int {
var ret = make([]int, upper-lower+1)
for i := range ret {
ret[i] = lower + i
}
return ret
}
func Digits(n int) int {
return len(strconv.FormatInt(int64(n), 10))
}
func Bias(f int, s int) int {
mod := int(math.Pow(10, float64(Digits(s))))
f -= s
for f%mod != 0 {
f++
}
return f + s
}
func BiasString(f int, s string) int {
var add, sub = 0, 0
if strings.HasPrefix(s, "0") {
add = int(math.Pow(10, float64(len(s))))
sub = add / 10
}
b, _ := strconv.Atoi(s)
return add + Bias(f, b+sub) - sub
}
func GetSeparator(input string) string {
for i := 0; i < 3; i++ {
if strings.Contains(input, separators[i]) {
return separators[i]
}
}
return ""
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAogICAgImZtdCIKICAgICJtYXRoIgogICAgIm9zIgogICAgInN0cmNvbnYiCiAgICAic3RyaW5ncyIKKQoKdmFyIHNlcGFyYXRvcnMgPSBbXXN0cmluZ3siLSIsICI6IiwgIi4uIn0KCmZ1bmMgbWFpbigpIHsKICAgIGZvciBpIDo9IHJhbmdlIG9zLkFyZ3MgewogICAgICAgIGZtdC5QcmludChQYXJzZVJhbmdlKG9zLkFyZ3NbaV0pLCAiXHJcbiIpCiAgICB9Cn0KCmZ1bmMgUGFyc2VSYW5nZShpbnB1dCBzdHJpbmcpIFtdaW50IHsKICAgIHZhciBlbGVtZW50cyA9IHN0cmluZ3MuU3BsaXQoaW5wdXQsICIsIikKICAgIHZhciByZXQgW11pbnQKICAgIHZhciBsYXN0ID0gMAoKICAgIGZvciBfLCB2IDo9IHJhbmdlIGVsZW1lbnRzIHsKICAgICAgICBlbGVtcyA6PSBQcm9jZXNzRWxlbWVudCh2LCBsYXN0KQogICAgICAgIGxhc3QgPSBlbGVtc1tsZW4oZWxlbXMpLTFdCiAgICAgICAgcmV0ID0gYXBwZW5kKHJldCwgZWxlbXMuLi4pCiAgICB9CgogICAgcmV0dXJuIHJldAp9CgpmdW5jIFByb2Nlc3NFbGVtZW50KGVsZW0gc3RyaW5nLCBsYXN0IGludCkgW11pbnQgewogICAgdmFyIHJldCBbXWludAogICAgaWYgc2VwIDo9IEdldFNlcGFyYXRvcihlbGVtKTsgc2VwICE9ICIiIHsKICAgICAgICByZXQgPSBFeHBsb2RlUmFuZ2VzKHN0cmluZ3MuU3BsaXQoZWxlbSwgc2VwKSwgbGFzdCkKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0ID0gW11pbnR7Qmlhc1N0cmluZyhsYXN0LCBlbGVtKX0KICAgIH0KICAgIHJldHVybiByZXQKfQoKZnVuYyBFeHBsb2RlUmFuZ2VzKG51bXMgW11zdHJpbmcsIGxhc3QgaW50KSBbXWludCB7CiAgICB2YXIgcmV0IFtdaW50CgogICAgZm9yIGkgOj0gMDsgaSA8IGxlbihudW1zKS0xOyBpKysgewogICAgICAgIGxvd2VyIDo9IEJpYXNTdHJpbmcobGFzdCwgbnVtc1tpXSkKICAgICAgICB1cHBlciA6PSBCaWFzU3RyaW5nKGxvd2VyLCBudW1zW2krMV0pCiAgICAgICAgYXJyIDo9IE1ha2VSYW5nZShsb3dlciwgdXBwZXIpCiAgICAgICAgaWYgaSsxIDwgbGVuKG51bXMpLTEgewogICAgICAgICAgICBhcnIgPSBhcnJbOmxlbihhcnIpLTFdCiAgICAgICAgfQogICAgICAgIHJldCA9IGFwcGVuZChyZXQsIGFyci4uLikKICAgIH0KICAgIHJldHVybiByZXQKfQoKZnVuYyBNYWtlUmFuZ2UobG93ZXIgaW50LCB1cHBlciBpbnQpIFtdaW50IHsKICAgIHZhciByZXQgPSBtYWtlKFtdaW50LCB1cHBlci1sb3dlcisxKQogICAgZm9yIGkgOj0gcmFuZ2UgcmV0IHsKICAgICAgICByZXRbaV0gPSBsb3dlciArIGkKICAgIH0KICAgIHJldHVybiByZXQKfQoKZnVuYyBEaWdpdHMobiBpbnQpIGludCB7CiAgICByZXR1cm4gbGVuKHN0cmNvbnYuRm9ybWF0SW50KGludDY0KG4pLCAxMCkpCn0KCmZ1bmMgQmlhcyhmIGludCwgcyBpbnQpIGludCB7CiAgICBtb2QgOj0gaW50KG1hdGguUG93KDEwLCBmbG9hdDY0KERpZ2l0cyhzKSkpKQogICAgZiAtPSBzCiAgICBmb3IgZiVtb2QgIT0gMCB7CiAgICAgICAgZisrCiAgICB9CiAgICByZXR1cm4gZiArIHMKfQoKZnVuYyBCaWFzU3RyaW5nKGYgaW50LCBzIHN0cmluZykgaW50IHsKICAgIHZhciBhZGQsIHN1YiA9IDAsIDAKICAgIGlmIHN0cmluZ3MuSGFzUHJlZml4KHMsICIwIikgewogICAgICAgIGFkZCA9IGludChtYXRoLlBvdygxMCwgZmxvYXQ2NChsZW4ocykpKSkKICAgICAgICBzdWIgPSBhZGQgLyAxMAogICAgfQogICAgYiwgXyA6PSBzdHJjb252LkF0b2kocykKICAgIHJldHVybiBhZGQgKyBCaWFzKGYsIGIrc3ViKSAtIHN1Ygp9CgpmdW5jIEdldFNlcGFyYXRvcihpbnB1dCBzdHJpbmcpIHN0cmluZyB7CiAgICBmb3IgaSA6PSAwOyBpIDwgMzsgaSsrIHsKICAgICAgICBpZiBzdHJpbmdzLkNvbnRhaW5zKGlucHV0LCBzZXBhcmF0b3JzW2ldKSB7CiAgICAgICAgICAgIHJldHVybiBzZXBhcmF0b3JzW2ldCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICIiCn0=
JnF1b3Q7MSwzLDcsMiw0LDEmcXVvdDsKJnF1b3Q7MS0zLDEtMiZxdW90OwomcXVvdDsxOjU6MiZxdW90OwomcXVvdDsxMDQtMiZxdW90OwomcXVvdDsxMDQuLjAyJnF1b3Q7CiZxdW90OzU0NSw2NDoxMSZxdW90Owo=
"1,3,7,2,4,1"
"1-3,1-2"
"1:5:2"
"104-2"
"104..02"
"545,64:11"