Range modifications: Difference between revisions

(New draft task with Python solution)
 
Line 52:
remove 9
remove 7
 
=={{header|Phix}}==
<lang Phix>requires("0.8.2") -- (uses latest apply() functionality)
 
function consolidate(sequence ranges)
for i=2 to length(ranges) do
integer {lo,hi} = ranges[i-1],
{nl,nh} = ranges[i]
if hi+1>=nl then
ranges[i-1..i] = {{lo,nh}}
exit
end if
end for
return ranges
end function
 
function add(sequence ranges, integer v)
integer l = length(ranges)
for i=1 to l+1 do
if i>l then ranges &= {{v,v}} exit end if
integer {lo,hi} = ranges[i]
if v>=lo and v<=hi then exit
elsif v=lo-1 then ranges[i][1] = v exit
elsif v=hi+1 then ranges[i][2] = v exit
elsif v<lo then ranges[i..i-1] = {{v,v}} exit
end if
end for
return consolidate(ranges)
end function
 
function del(sequence ranges, integer v)
for i=1 to length(ranges) do
integer {lo,hi} = ranges[i]
if v>=lo and v<=hi then
if v=lo then
if v<hi then ranges[i][1] = lo+1
else ranges[i..i] = {} end if
elsif v=hi then
if lo<v then ranges[i][2] = hi-1
else ranges[i..i] = {} end if
else
ranges[i..i] = {{lo,v-1},{v+1,hi}}
end if
exit
elsif v<hi then
exit
end if
end for
return ranges
end function
 
function action(string range, integer op, v)
sequence ranges = split(range,",")
ranges = vslice(apply(true,scanf,{ranges,{"%d-%d"}}),1)
ranges = op(ranges,v)
ranges = apply(true,sprintf,{{"%d-%d"},ranges})
range = join(ranges,",")
return range
end function
 
constant tests = split("""
Start with ""
add 77
add 79
add 78
remove 77
remove 78
remove 79
Start with "1-3,5-5"
add 1
remove 4
add 7
add 8
add 6
remove 7
Start with "1-5,10-25,27-30"
add 26
add 9
add 7
remove 26
remove 9
remove 7
""","\n",no_empty:=true)
 
string range = ""
for i=1 to length(tests) do
string ti = tests[i]
if match("Start with",ti) then
{{range}} = scanf(ti,"Start with \"%s\"")
printf(1,"\nNew start range: \"%s\"\n",{range})
else
{{string op, integer v}} = scanf(trim(ti),"%s %d")
range = action(range,routine_id(substitute(op,"remove","del")),v)
printf(1," %9s %2d -> \"%s\"\n",{op,v,range})
end if
end for</lang>
{{out}}
<pre>
New start range: ""
add 77 -> "77-77"
add 79 -> "77-77,79-79"
add 78 -> "77-79"
remove 77 -> "78-79"
remove 78 -> "79-79"
remove 79 -> ""
 
New start range: "1-3,5-5"
add 1 -> "1-3,5-5"
remove 4 -> "1-3,5-5"
add 7 -> "1-3,5-5,7-7"
add 8 -> "1-3,5-5,7-8"
add 6 -> "1-3,5-8"
remove 7 -> "1-3,5-6,8-8"
 
New start range: "1-5,10-25,27-30"
add 26 -> "1-5,10-30"
add 9 -> "1-5,9-30"
add 7 -> "1-5,7-7,9-30"
remove 26 -> "1-5,7-7,9-25,27-30"
remove 9 -> "1-5,7-7,10-25,27-30"
remove 7 -> "1-5,10-25,27-30"
</pre>
 
=={{header|Python}}==
7,794

edits