RosettaCodeData/Task/Range-extraction/Eiffel/range-extraction.e

73 lines
1.5 KiB
Plaintext

class
RANGE
create
make
feature
make
local
extended_range: STRING
do
extended_range := "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"
print("Extended range: " + extended_range + "%N")
print("Extracted range: " + extracted_range(extended_range) + "%N%N")
end
feature
extracted_range(sequence: STRING): STRING
local
elements: LIST[STRING]
first, curr: STRING
subrange_size, index: INTEGER
do
sequence.replace_substring_all (", ", ",")
elements := sequence.split (',')
from
index := 2
first := elements.at (1)
subrange_size := 0
Result := ""
until
index > elements.count
loop
curr := elements.at (index)
if curr.to_integer - first.to_integer - subrange_size = 1
then
subrange_size := subrange_size + 1
else
Result.append(first)
if (subrange_size <= 1)
then
Result.append (", ")
else
Result.append (" - ")
end
if (subrange_size >= 1)
then
Result.append ((first.to_integer + subrange_size).out)
Result.append (", ")
end
first := curr
subrange_size := 0
end
index := index + 1
end
Result.append(first)
if (subrange_size <= 1)
then
Result.append (", ")
else
Result.append (" - ")
end
if (subrange_size >= 1)
then
Result.append ((first.to_integer + subrange_size).out)
end
end
end