79 lines
2.3 KiB
Rexx
79 lines
2.3 KiB
Rexx
/* Rexx */
|
|
|
|
parse arg userInput
|
|
call runSample userInput
|
|
return
|
|
exit
|
|
|
|
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
|
-- Compact a list of numbers by reducing ranges
|
|
compact:
|
|
procedure
|
|
--trace ?r;nop
|
|
parse arg expanded
|
|
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 += 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
|
|
-- collect terminating value (a range)
|
|
rezult = rezult || FIRST || delim(RANGE) || FIRST + RANGE
|
|
end
|
|
else do
|
|
-- collect terminating value (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
|
|
delim:
|
|
procedure
|
|
parse arg range .
|
|
if range == 1 then dlm = ','
|
|
else dlm = '-'
|
|
return dlm
|
|
|
|
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
|
|
-- sample driver
|
|
runSample:
|
|
procedure
|
|
parse arg userInput
|
|
td. = 0
|
|
if userInput~words > 0 then do
|
|
td.0 += 1; r_ = td.0; td.r_ = userInput
|
|
end
|
|
else do
|
|
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 += 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 += 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
|