给定一个未排序的唯一正整数列表,输出序列整数最长可能范围的最短列表。
9 13 3 11 8 4 10 15
stdin
8-11
。3 5 6
不能缩短为3-6
,因为4
不存在 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
IN> 9 13 3 11 8 4 10 15
OUT> 3-15
范围包含输入中未包含的值。
IN> 9 13 3 11 8 4 10 15
OUT> 3 4 8 9 10 11 13 15
所有顺序值都应表示为范围。
IN> 9 13 3 11 8 4 10 15
OUT> 3-4 8-9 10-11 13 15
划分范围,8-9
和10-11
应为8-11
IN> 9 13 3 11 8 4 10 15
OUT> 8-9 13 10-11 3-4 15
输出没有正确排序
发布于 2015-06-26 21:41:03
这样的问题往往会让我检查Ruby是否有合适的方法,今天我发现了一个新的方法:Array#slice_when
,这是Rubyv2.2中新引入的,似乎正是针对这种情况:)
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
发布于 2020-10-31 09:10:14
ṢI’kƊ.ịⱮUQ€j€”-K
Ṣ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
发布于 2015-06-27 00:22:36
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];}}}
检查范围并相应地打印它们。不幸的是,我不得不为数组中的最后一个元素做一个特例,因为程序将终止而不打印最后一个数字或范围。
https://codegolf.stackexchange.com/questions/52321
复制相似问题