fork download
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math"
  6. "os"
  7. "strconv"
  8. "strings"
  9. )
  10.  
  11. var separators = []string{"-", ":", ".."}
  12.  
  13. func main() {
  14. for i := range os.Args {
  15. fmt.Print(ParseRange(os.Args[i]), "\r\n")
  16. }
  17. }
  18.  
  19. func ParseRange(input string) []int {
  20. var elements = strings.Split(input, ",")
  21. var ret []int
  22. var last = 0
  23.  
  24. for _, v := range elements {
  25. elems := ProcessElement(v, last)
  26. last = elems[len(elems)-1]
  27. ret = append(ret, elems...)
  28. }
  29.  
  30. return ret
  31. }
  32.  
  33. func ProcessElement(elem string, last int) []int {
  34. var ret []int
  35. if sep := GetSeparator(elem); sep != "" {
  36. ret = ExplodeRanges(strings.Split(elem, sep), last)
  37. } else {
  38. ret = []int{BiasString(last, elem)}
  39. }
  40. return ret
  41. }
  42.  
  43. func ExplodeRanges(nums []string, last int) []int {
  44. var ret []int
  45.  
  46. for i := 0; i < len(nums)-1; i++ {
  47. lower := BiasString(last, nums[i])
  48. upper := BiasString(lower, nums[i+1])
  49. arr := MakeRange(lower, upper)
  50. if i+1 < len(nums)-1 {
  51. arr = arr[:len(arr)-1]
  52. }
  53. ret = append(ret, arr...)
  54. }
  55. return ret
  56. }
  57.  
  58. func MakeRange(lower int, upper int) []int {
  59. var ret = make([]int, upper-lower+1)
  60. for i := range ret {
  61. ret[i] = lower + i
  62. }
  63. return ret
  64. }
  65.  
  66. func Digits(n int) int {
  67. return len(strconv.FormatInt(int64(n), 10))
  68. }
  69.  
  70. func Bias(f int, s int) int {
  71. mod := int(math.Pow(10, float64(Digits(s))))
  72. f -= s
  73. for f%mod != 0 {
  74. f++
  75. }
  76. return f + s
  77. }
  78.  
  79. func BiasString(f int, s string) int {
  80. var add, sub = 0, 0
  81. if strings.HasPrefix(s, "0") {
  82. add = int(math.Pow(10, float64(len(s))))
  83. sub = add / 10
  84. }
  85. b, _ := strconv.Atoi(s)
  86. return add + Bias(f, b+sub) - sub
  87. }
  88.  
  89. func GetSeparator(input string) string {
  90. for i := 0; i < 3; i++ {
  91. if strings.Contains(input, separators[i]) {
  92. return separators[i]
  93. }
  94. }
  95. return ""
  96. }
Success #stdin #stdout 0s 790016KB
stdin
"1,3,7,2,4,1"
"1-3,1-2"
"1:5:2"
"104-2"
"104..02"
"545,64:11"
stdout
[0]