Code Golf:数字范围

SLa*_*aks 17 language-agnostic code-golf

挑战

通过用范围替换连续运行来压缩一长串数字.

输入

1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 15
输入保证按升序排列,不包含重复项.

产量

1 - 4, 7, 8, 10, 12 - 15
请注意,两个数字的范围应保持不变.(7, 8;不是7 - 8)

规则

您可以接受整数(或等效数据类型)的排序列表作为方法参数,从命令行或标准输入.(选择哪个选项导致更短的代码)
您可以通过打印它们或通过返回来输出字符串列表单个字符串或一组字符串.

参考实施

(C#)

IEnumerable<string> Sample(IList<int> input) {
    for (int i = 0; i < input.Count; ) {
        var start = input[i];
        int size = 1;
        while (++i < input.Count && input[i] == start + size)
            size++;

        if (size == 1)
            yield return start.ToString();
        else if (size == 2) {
            yield return start.ToString();
            yield return (start + 1).ToString();
        } else if (size > 2)
            yield return start + " - " + (start + size - 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*all 6

Python,98个字符

def f(a):
 for x in a:
  if x-1not in a or x+1not in a:print x,"-"if x+1in a and x+2in a else",",
Run Code Online (Sandbox Code Playgroud)

Python - 86个字符

这个最后不包括额外的','

f=lambda a:''.join(`x`+",-"[(x+1in a)&x+2in a]for x in a if(x-1in a)&(x+1in a)^1)[:-1]
Run Code Online (Sandbox Code Playgroud)


Jul*_*éon 4

Python,83 个字符

def f(l,a=2):
 for x in l:
  b,a=a,(x+1in l)*(x-1in l)
  if a<1:print',- '[b],`x`,
Run Code Online (Sandbox Code Playgroud)

演示:

>>> l=[1, 2, 3, 4, 7, 8, 10, 12, 13, 14, 15]
>>> f(l)
  1 - 4 , 7 , 8 , 10 , 12 - 15
Run Code Online (Sandbox Code Playgroud)