Range modifications: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: moved a printf(), added ^^ markers)
m (→‎{{header|Phix}}: added high range)
Line 350: Line 350:
<lang Phix>requires("0.8.2") -- (uses latest apply() functionality)
<lang Phix>requires("0.8.2") -- (uses latest apply() functionality)


function add(sequence ranges, integer v)
function add(sequence ranges, atom v)
--
--
-- eg {} + 9 --> {{9,9}} -- [1]
-- eg {} + 9 --> {{9,9}} -- [1]
Line 366: Line 366:
if i>l then ranges &= {{v,v}} exit -- [1]
if i>l then ranges &= {{v,v}} exit -- [1]
end if
end if
integer {lo,hi} = ranges[i], nl
atom nl,{lo,hi} = ranges[i]
if v>=lo and v<=hi then exit -- [2]
if v>=lo and v<=hi then exit -- [2]
elsif v=lo-1 then ranges[i][1] = v exit -- [3]
elsif v=lo-1 then ranges[i][1] = v exit -- [3]
Line 386: Line 386:
end function
end function


function del(sequence ranges, integer v)
function del(sequence ranges, atom v)
--
--
-- eg {{1,2}} - 1 --> {{2,2}} -- [1]
-- eg {{1,2}} - 1 --> {{2,2}} -- [1]
Line 395: Line 395:
--
--
for i=1 to length(ranges) do
for i=1 to length(ranges) do
integer {lo,hi} = ranges[i]
atom {lo,hi} = ranges[i]
if v>=lo and v<=hi then
if v>=lo and v<=hi then
if v=lo then
if v=lo then
Line 430: Line 430:
remove 9
remove 9
remove 7
remove 7
Start with "13-14,22-22,100000999999-100001000000"
remove 22
remove 100000999999
remove 100001000000
add 100001000001
remove 100001000001
""","\n",no_empty:=true)
""","\n",no_empty:=true)


Line 440: Line 446:
ranges = split(range,",")
ranges = split(range,",")
ranges = vslice(apply(true,scanf,{ranges,{"%d-%d"}}),1)
ranges = vslice(apply(true,scanf,{ranges,{"%d-%d"}}),1)
printf(1,"\nNew start range: \"%s\"\n",{range})
printf(1,"\n Start range: \"%s\"\n",{range})
-- ^^ ^^
-- ^^ ^^
else
else
{{string op, integer v}} = scanf(trim(ti),"%s %d")
{{string op, atom v}} = scanf(trim(ti),"%s %d")
integer rid = routine_id(substitute(op,"remove","del"))
integer rid = routine_id(substitute(op,"remove","del"))
ranges = rid(ranges,v)
ranges = rid(ranges,v)
range = join(apply(true,sprintf,{{"%d-%d"},ranges}),",")
range = join(apply(true,sprintf,{{"%d-%d"},ranges}),",")
printf(1," %9s %2d -> \"%s\"\n",{op,v,range})
printf(1," %9s %-12d -> \"%s\"\n",{op,v,range})
-- ^^ ^^
-- ^^ ^^
end if
end if
end for</lang>
end for</lang>
Line 454: Line 460:
<small>(Note that all double-quotes in the output were deliberately added in the last two printf() statements, mainly to prove there are no unnecessary spaces, etc, and are (see ^^) obviously trivial to remove.)</small>
<small>(Note that all double-quotes in the output were deliberately added in the last two printf() statements, mainly to prove there are no unnecessary spaces, etc, and are (see ^^) obviously trivial to remove.)</small>
<pre>
<pre>
New start range: ""
Start range: ""
add 77 -> "77-77"
add 77 -> "77-77"
add 79 -> "77-77,79-79"
add 79 -> "77-77,79-79"
add 78 -> "77-79"
add 78 -> "77-79"
remove 77 -> "78-79"
remove 77 -> "78-79"
remove 78 -> "79-79"
remove 78 -> "79-79"
remove 79 -> ""
remove 79 -> ""


New start range: "1-3,5-5"
Start range: "1-3,5-5"
add 1 -> "1-3,5-5"
add 1 -> "1-3,5-5"
remove 4 -> "1-3,5-5"
remove 4 -> "1-3,5-5"
add 7 -> "1-3,5-5,7-7"
add 7 -> "1-3,5-5,7-7"
add 8 -> "1-3,5-5,7-8"
add 8 -> "1-3,5-5,7-8"
add 6 -> "1-3,5-8"
add 6 -> "1-3,5-8"
remove 7 -> "1-3,5-6,8-8"
remove 7 -> "1-3,5-6,8-8"


New start range: "1-5,10-25,27-30"
Start range: "1-5,10-25,27-30"
add 26 -> "1-5,10-30"
add 26 -> "1-5,10-30"
add 9 -> "1-5,9-30"
add 9 -> "1-5,9-30"
add 7 -> "1-5,7-7,9-30"
add 7 -> "1-5,7-7,9-30"
remove 26 -> "1-5,7-7,9-25,27-30"
remove 26 -> "1-5,7-7,9-25,27-30"
remove 9 -> "1-5,7-7,10-25,27-30"
remove 9 -> "1-5,7-7,10-25,27-30"
remove 7 -> "1-5,10-25,27-30"
remove 7 -> "1-5,10-25,27-30"

Start range: "13-14,22-22,100000999999-100001000000"
remove 22 -> "13-14,100000999999-100001000000"
remove 100000999999 -> "13-14,100001000000-100001000000"
remove 100001000000 -> "13-14"
add 100001000001 -> "13-14,100001000001-100001000001"
remove 100001000001 -> "13-14"
</pre>
</pre>