首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从值列表确定范围

从值列表确定范围
EN

Code Golf用户
提问于 2015-06-26 19:05:24
回答 5查看 984关注 0票数 20

给定一个未排序的唯一正整数列表,输出序列整数最长可能范围的最短列表。

输入

  • 唯一正整数的未排序列表
    • 例如9 13 3 11 8 4 10 15

  • 输入可以从以下任意一个中获取:
    • stdin
    • 命令行参数
    • 函数参数

输出

  • 输出到标准输出或语言最接近的输出的范围或单个值的有序列表。
    • 如果存在两个或多个顺序整数(按值顺序,而不是按列表中的位置排列),则它们将使用-表示为包含范围,例如8-11
    • 所有其他整数都是简单地用其他符号打印的。
    • 一个空格将分隔输出。

  • 输入中不存在的数字不应该出现在输出中,例如3 5 6不能缩短为3-6,因为4不存在

示例

成功:

代码语言:javascript
运行
复制
 IN> 9 13 3 11 8 4 10 15 6
OUT> 3-4 6 8-11 13 15

 IN> 11 10 6 9 13 8 3 4 15
OUT> 3-4 6 8-11 13 15

 IN> 5 8 3 2 6 4 7 1
OUT> 1-8

 IN> 5 3 7 1 9
OUT> 1 3 5 7 9

错误:

代码语言:javascript
运行
复制
 IN> 9 13 3 11 8 4 10 15
OUT> 3-15

范围包含输入中未包含的值。

代码语言:javascript
运行
复制
 IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15

所有顺序值都应表示为范围。

代码语言:javascript
运行
复制
 IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15

划分范围,8-910-11应为8-11

代码语言:javascript
运行
复制
 IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15

输出没有正确排序

规则

  • 不允许有标准的漏洞
  • 如果你的语言有这样的功能,那是不允许的
  • 您可以编写完整的程序或函数。
  • 尾随空格不重要

评分

  • 最小字节获胜
EN

回答 5

Code Golf用户

发布于 2015-06-26 21:41:03

Ruby,70字节

这样的问题往往会让我检查Ruby是否有合适的方法,今天我发现了一个新的方法:Array#slice_when,这是Rubyv2.2中新引入的,似乎正是针对这种情况:)

代码语言:javascript
运行
复制
f=->a{puts a.sort.slice_when{|i,j|j-i>1}.map{|x|x.minmax.uniq*?-}*' '}

在对数组进行排序和适当切片之后,它接受每个子数组并从最高和最低元素中创建一个字符串,然后将整个数组连接到一个字符串中。

示例:

f.call [9,13,3,11,8,4,10,15,6]打印3-4 6 8-11 13 15

票数 4
EN

Code Golf用户

发布于 2020-10-31 09:10:14

果冻,16字节

代码语言:javascript
运行
复制
ṢI’kƊ.ịⱮUQ€j€”-K

在网上试试!

是如何工作的

代码语言:javascript
运行
复制
ṢI’kƊ.ịⱮUQ€j€”-K - Main link. Takes an array L on the left
Ṣ                - Sort L; Call this A
    Ɗ            - Monad. Link the previous three links together f(A):
 I               -   Forward differences
  ’              -   Decrement
   k             -   Partition
                   This groups consecutive runs
                   Take A = [3, 4, 6, 8, 9, 10, 11, 13, 15]
                   I: [1, 2, 2, 1, 1, 1, 2, 2]
                   ’: [0, 1, 1, 0, 0, 0, 1, 1]
                   k then partitions A at truthy elements in I’
                   [[3, 4], [6], [8, 9, 10, 11], [13], [15]
       Ɱ         - For each:
     .ị          -   Take the 0.5th element

                   For non-integer left argument, x, Jelly's ị atom takes
                   floor(x) and ceil(x) and returns [floor(x)ịy, ceil(x)ịy]
                   As Jelly's indexing is 1-based and modular:
                     0ị returns the last element
                     1ị returns the first element
                     .ị returns [0ị, 1ị]

        U        - Reverse each
         Q€      - Deduplicate each
           j€”-  - Join each with "-"
               K - Join by spaces
票数 3
EN

Code Golf用户

发布于 2015-06-27 00:22:36

Java,191个字节

代码语言:javascript
运行
复制
void f(int[]a){java.util.Arrays.sort(a);for(int b=a.length,c=b-1,i=0,j=a[0],l=j;++i<b;){if(a[i]!=++j||i==c){System.out.print((l+1==j?l+(i==c?" "+a[c]:""):l+"-"+(i==c?j:j-1))+" ");l=j=a[i];}}}

检查范围并相应地打印它们。不幸的是,我不得不为数组中的最后一个元素做一个特例,因为程序将终止而不打印最后一个数字或范围。

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/52321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档