Range modifications: Difference between revisions

Content added Content deleted
m (sort input)
m (parse reversed ranges)
Line 209: Line 209:
=={{header|Julia}}==
=={{header|Julia}}==
Julia has iterator classes called a type of Range, such as integer UnitRanges, that are like the "10-10" of the task but are stated as 10:10, with a colon not a minus sign. This implementation uses Julia's UnitRange class internally.
Julia has iterator classes called a type of Range, such as integer UnitRanges, that are like the "10-10" of the task but are stated as 10:10, with a colon not a minus sign. This implementation uses Julia's UnitRange class internally.
<lang julia>import Base.string, Base.parse, Base.print
<lang julia>import Base.parse, Base.print, Base.reduce


const RangeSequence = Array{UnitRange, 1}
const RangeSequence = Array{UnitRange, 1}
Line 238: Line 238:
startstop = split(e, r"\:|\-")
startstop = split(e, r"\:|\-")
if length(startstop) == 2
if length(startstop) == 2
start = tryparse(Int, startstop[1])
start, stop = tryparse(Int, startstop[1]), tryparse(Int, startstop[2])
stop = tryparse(Int, startstop[2])
start, stop = start <= stop ? (start, stop) : (stop, start)
if start != nothing && stop != nothing
start != nothing && stop != nothing && combine!(seq, start:stop)
combine!(seq, start:stop)
end
elseif (n = tryparse(Int, startstop[1])) != nothing
elseif (n = tryparse(Int, startstop[1])) != nothing
combine!(seq, n:n)
combine!(seq, n:n)
Line 262: Line 260:
else
else
newseq = vcat(combine!(seq[1:pos], n:n), seq[pos+1:end])
newseq = vcat(combine!(seq[1:pos], n:n), seq[pos+1:end])
empty!(seq)
append!(empty!(seq), newseq)
append!(seq, newseq)
end
end
return seq
return seq
end
end


reduce(rangeseq) = begin seq = UnitRange[]; for r in rangeseq combine!(seq, r) end; seq end
reduce(a::RangeSequence) = begin seq = UnitRange[]; for r in a combine!(seq, r) end; seq end


function removeinteger!(seq, n::Integer)
function removeinteger!(seq, n::Integer)
Line 338: Line 335:


println("Parse \"10-25, 1-5, 27-30\" => ", parse(RangeSequence, "10-25, 1-5, 27-30"))
println("Parse \"10-25, 1-5, 27-30\" => ", parse(RangeSequence, "10-25, 1-5, 27-30"))
println("Parse \"1-3,5-15,25-10,27-30\" => ", parse(RangeSequence, "1-3,5-15,25-10,27-30"))
</lang>{{out}}
</lang>{{out}}
<pre>
<pre>
Line 365: Line 363:


Parse "10-25, 1-5, 27-30" => 1-5,10-25,27-30
Parse "10-25, 1-5, 27-30" => 1-5,10-25,27-30
Parse "1-3,5-15,25-10,27-30" => 1-3,10-25,27-30
</pre>
</pre>