1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off
type
NumberRange = tuple
val, l: int
func `$`(s: NumberRange): string =
if s.l == 0:
$s.val
elif s.l == 1:
$s.val & ',' & $(s.val + s.l)
else:
$s.val & '-' & $(s.val + s.l)
func compactNumString*(numbers: openarray[int]): string =
if numbers.len < 1: return result
var range: NumberRange = (numbers[0], 0)
for i, num in numbers[1..^1]:
if num == range.val + range.l + 1:
inc range.l
else:
result &= $range & ','
range = (num, 0)
result &= $range
when isMainModule:
import std/unittest
suite "Compact number lists":
test "Example 1":
check compactNumString([1,2,3,4,9,10,14,15,16]) == "1-4,9,10,14-16"
|