RosettaCodeData/Task/Range-extraction/FutureBasic/range-extraction.basic

47 lines
1.3 KiB
Plaintext

void local fn DoRangeExtraction
CFArrayRef nums = @[
@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]
CFMutableArrayRef array = fn MutableArrayNew
CFRange range
long prevNum = NSNotFound
for CFNumberRef num in nums
if ( prevNum == NSNotFound )
range = fn CFRangeMake(intval(num),1)
else
if ( intval(num) == prevNum + 1 )
range.length++
else
MutableArrayAddObject( array, @(range) )
range = fn CFRangeMake(intval(num),1)
end if
end if
prevNum = intval(num)
next
MutableArrayAddObject( array, @(range) )
CFMutableStringRef ranges = fn MutableStringNew
for ValueRef value in array
range = fn ValueRange( value )
if ( range.length > 2 )
if ( len(ranges) ) then MutableStringAppendString(ranges,@", ")
MutableStringAppendFormat( ranges, @"%ld-%ld", range.location, range.location + range.length - 1 )
else
for long i = range.location to range.location + range.length - 1
if ( len(ranges) ) then MutableStringAppendString(ranges,@", ")
MutableStringAppendFormat( ranges, @"%ld", i )
next
end if
next
print ranges
end fn
fn DoRangeExtraction
HandleEvents