aboutsummaryrefslogtreecommitdiff
path: root/challenge-006/archargelod/nim/ch_1.nim
blob: 0e1c252ea33697c09b449e605283f008753fc243 (plain)
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"