77 lines
2.5 KiB
Plaintext
77 lines
2.5 KiB
Plaintext
/* NetRexx */
|
|
options replace format comments java crossref symbols nobinary
|
|
|
|
runSample(arg)
|
|
return
|
|
|
|
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
|
-- Compact a list of numbers by reducing ranges
|
|
method compact(expanded) public static
|
|
nums = expanded.changestr(',', ' ').space -- remove possible commas & clean up the string
|
|
rezult = ''
|
|
|
|
RANGE = 0
|
|
FIRST = nums.word(1) -- set starting value
|
|
loop i_ = 2 to nums.words -- each word in the string is a number to examine
|
|
LOCAL = nums.word(i_)
|
|
if LOCAL - FIRST - RANGE == 1 then do
|
|
-- inside a range
|
|
RANGE = RANGE + 1
|
|
end
|
|
else do
|
|
-- not inside a range
|
|
if RANGE \= 0 then do
|
|
-- we have a range of numbers so collect this and reset
|
|
rezult = rezult || FIRST || delim(RANGE) || FIRST + RANGE || ','
|
|
RANGE = 0
|
|
end
|
|
else do
|
|
-- just collect this number
|
|
rezult = rezult || FIRST || ','
|
|
end
|
|
FIRST = LOCAL -- bump new starting value
|
|
end
|
|
end i_
|
|
|
|
if RANGE \= 0 then do
|
|
-- terminating value is a range
|
|
rezult = rezult || FIRST || delim(RANGE) || FIRST + RANGE
|
|
end
|
|
else do
|
|
-- terminating value is a single number
|
|
rezult = rezult || FIRST
|
|
end
|
|
|
|
return rezult.space(1, ',') -- format and return result string
|
|
|
|
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
|
-- determine if the range delimiter should be a comma or dash
|
|
method delim(range) private static
|
|
if range == 1 then dlm = ','
|
|
else dlm = '-'
|
|
return dlm
|
|
|
|
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
|
-- sample driver
|
|
method runSample(arg) public static
|
|
|
|
parse arg userInput
|
|
td = 0
|
|
if userInput.words > 0 then do
|
|
-- use input from command line
|
|
td[0] = td[0] + 1; r_ = td[0]; td[r_] = userInput
|
|
end
|
|
else do
|
|
-- use canned test data
|
|
td[0] = td[0] + 1; r_ = td[0]; td[r_] = ' -6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20'
|
|
td[0] = td[0] + 1; r_ = td[0]; td[r_] = ' 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'
|
|
td[0] = td[0] + 1; r_ = td[0]; td[r_] = ' -4, -3, -2, 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'
|
|
end
|
|
|
|
loop r_ = 1 to td[0]
|
|
say 'Original: ' td[r_].changestr(',', ' ').space(1, ',')
|
|
say 'Compacted:' compact(td[r_])
|
|
say
|
|
end r_
|
|
return
|