RosettaCodeData/Task/Range-extraction/Wren/range-extraction.wren

38 lines
1.0 KiB
Plaintext

var extractRange = Fn.new { |list|
if (list.isEmpty) return ""
var sb = ""
var first = list[0]
var prev = first
var append = Fn.new { |index|
if (first == prev) {
sb = sb + prev.toString
} else if (first == prev - 1) {
sb = sb + first.toString + "," + prev.toString
} else {
sb = sb + first.toString + "-" + prev.toString
}
if (index < list.count - 1) sb = sb + ","
}
for (i in 1...list.count) {
if (list[i] == prev + 1) {
prev = prev + 1
} else {
append.call(i)
first = list[i]
prev = first
}
}
append.call(list.count - 1)
return sb
}
var list1 = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]
System.print(extractRange.call(list1))
var list2 = [0, 1, 2, 4, 6, 7, 8, 11, 12, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 27, 28, 29, 30, 31, 32, 33, 35, 36,
37, 38, 39]
System.print(extractRange.call(list2))