User
package main import ( "fmt" "strconv" "strings" ) type Period struct { start *int end *int } func (period *Period) AddStart(start int) { period.start = &start } func (period *Period) AddEnd(end int) { period.end = &end } func (period *Period) ToString() string { if period.start == nil { return strconv.Itoa(*period.end) } if period.end == nil { return strconv.Itoa(*period.start) } return strconv.Itoa(*period.start) + "-" + strconv.Itoa(*period.end) } type Language struct { Periods []Period } func (language *Language) ToString() string { out := []string{} for _, token := range (*language).Periods { out = append(out, token.ToString()) } return strings.Join(out, ",") } func main() { arr := []int{1, 2, 3, -1, 10, 11, 12, 4, 5, 6, 12, 13, -1, -2, -1, 0} str := GetRanges(arr) fmt.Print(str) } func GetRanges(arr []int) string { language := Tokenize(arr) return language.ToString() } func Tokenize(arr []int) (tokens Language) { lexema := &Period{} for index, item := range arr { switch true { case index == 0: lexema.AddStart(item) break case index == len(arr)-1: lexema.AddEnd(item) tokens.Periods = append(tokens.Periods, *lexema) break case item+1 != arr[index+1]: lexema.AddEnd(item) tokens.Periods = append(tokens.Periods, *lexema) lexema = &Period{} break case item+1 == arr[index+1] && lexema.start == nil: lexema.AddStart(item) break } } return }