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, |
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 |
||
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, |
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 |
||
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,"\ |
printf(1,"\n Start range: \"%s\"\n",{range}) |
||
-- ^^ ^^ |
-- ^^ ^^ |
||
else |
else |
||
{{string op, |
{{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 % |
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> |
||
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 -> "" |
||
Start range: "1-3,5-5" |
|||
add |
add 1 -> "1-3,5-5" |
||
remove |
remove 4 -> "1-3,5-5" |
||
add |
add 7 -> "1-3,5-5,7-7" |
||
add |
add 8 -> "1-3,5-5,7-8" |
||
add |
add 6 -> "1-3,5-8" |
||
remove |
remove 7 -> "1-3,5-6,8-8" |
||
Start range: "1-5,10-25,27-30" |
|||
add 26 -> "1-5,10-30" |
add 26 -> "1-5,10-30" |
||
add |
add 9 -> "1-5,9-30" |
||
add |
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 |
remove 9 -> "1-5,7-7,10-25,27-30" |
||
remove |
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> |
||