Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение
Задачу можно решить с помощью небольшого токенизатора

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
}

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность