71 lines
1.8 KiB
Plaintext
71 lines
1.8 KiB
Plaintext
DataSection
|
|
Data.i 33 ;count of elements to be read
|
|
Data.i 0, 1, 2, 4, 6, 7, 8, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24
|
|
Data.i 25, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39
|
|
EndDataSection
|
|
|
|
NewList values()
|
|
;setup list
|
|
Define elementCount, i
|
|
Read.i elementCount
|
|
For i = 1 To elementCount
|
|
AddElement(values()): Read.i values()
|
|
Next
|
|
|
|
Procedure.s rangeExtract(List values())
|
|
Protected listSize = ListSize(values()) - 1
|
|
Protected rangeMarker, rangeStart, rangeIncrement, retraceSteps, rangeSize, endOfRange, output.s, sub.s
|
|
|
|
ForEach values()
|
|
rangeStart = values():
|
|
sub = Str(rangeStart)
|
|
If NextElement(values())
|
|
retraceSteps = 1
|
|
rangeIncrement = values() - rangeStart
|
|
If rangeIncrement = 1 Or rangeIncrement = -1
|
|
;found start of possible range
|
|
If ListIndex(values()) <> listSize
|
|
retraceSteps = 2
|
|
rangeSize = 2
|
|
endOfRange = #False
|
|
rangeMarker = values()
|
|
While NextElement(values())
|
|
If values() - rangeMarker <> rangeIncrement
|
|
endOfRange = #True
|
|
Break
|
|
EndIf
|
|
rangeSize + 1
|
|
rangeMarker = values()
|
|
Wend
|
|
|
|
If rangeSize > 2
|
|
sub = Str(rangeStart) + "-" + Str(rangeMarker)
|
|
If Not endOfRange
|
|
retraceSteps = 0 ;at end of list
|
|
Else
|
|
retraceSteps = 1
|
|
EndIf
|
|
EndIf
|
|
EndIf
|
|
EndIf
|
|
|
|
;return to the value before look-aheads
|
|
While retraceSteps > 0
|
|
PreviousElement(values()): retraceSteps - 1
|
|
Wend
|
|
EndIf
|
|
|
|
output + sub + ","
|
|
Next
|
|
|
|
ProcedureReturn RTrim(output, ",")
|
|
EndProcedure
|
|
|
|
If OpenConsole()
|
|
PrintN(rangeExtract(values()))
|
|
|
|
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
|
|
Input()
|
|
CloseConsole()
|
|
EndIf
|