Range modifications: Difference between revisions

m
→‎{{header|jq}}: negative integers allowed
(Added 11l)
m (→‎{{header|jq}}: negative integers allowed)
 
(6 intermediate revisions by 6 users not shown)
Line 24:
* The add and remove operations should print their result in the standard form mentioned.
* Solutions '''must''' work by modifying range boundaries, splitting and joining, as well as creating and deleting ranges. <br> '''Do not''' use algorithms that create and modify arrays of all the integer values within ranges.
 
 
Show the results, (including intermediate results), of performing the following
Line 59 ⟶ 60:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">T Sequence
[(Int, Int)] ranges
 
Line 163 ⟶ 164:
remove 26
remove 9
remove 7’)</langsyntaxhighlight>
 
{{out}}
Line 191 ⟶ 192:
remove 7 => 1-5,10-25,27-30
 
</pre>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">DEFINE PTR="CARD"
TYPE Range=[BYTE low,high]
TYPE Ranges=[
PTR data
INT count]
 
PROC InitRanges(Ranges POINTER rs PTR d)
rs.data=d rs.count=0
RETURN
 
PROC CheckIndex(Ranges POINTER rs INT index)
IF index<0 OR index>=rs.count THEN
Break()
FI
RETURN
 
PTR FUNC GetItemPtr(Ranges POINTER rs INT index)
CheckIndex(rs,index)
RETURN (rs.data+2*index)
 
PROC PrintRanges(Ranges POINTER rs)
Range POINTER r
INT i
 
IF rs.count=0 THEN
Print("empty")
ELSE
FOR i=0 TO rs.count-1
DO
IF i>0 THEN Print(",") FI
r=GetItemPtr(rs,i)
PrintF("%B-%B",r.low,r.high)
OD
FI
RETURN
 
PROC AppendRange(Ranges POINTER rs BYTE l,h)
Range POINTER r
 
rs.count==+1
r=GetItemPtr(rs,rs.count-1)
r.low=l r.high=h
RETURN
 
PROC InsertRange(Ranges POINTER rs INT index BYTE l,h)
Range POINTER r1,r2
INT i
 
IF index=rs.count THEN
AppendRange(rs,l,h)
RETURN
FI
 
CheckIndex(rs,index)
rs.count==+1
i=rs.count-1
WHILE i>index
DO
r1=GetItemPtr(rs,i-1)
r2=GetItemPtr(rs,i)
r2.low=r1.low r2.high=r1.high
i==-1
OD
r1=GetItemPtr(rs,index)
r1.low=l r1.high=h
RETURN
 
PROC DeleteRange(Ranges POINTER rs INT index)
Range POINTER r1,r2
INT i
 
CheckIndex(rs,index)
FOR i=index TO rs.count-2
DO
r1=GetItemPtr(rs,i+1)
r2=GetItemPtr(rs,i)
r2.low=r1.low r2.high=r1.high
OD
rs.count==-1
RETURN
 
BYTE FUNC InRange(Range POINTER r BYTE n)
IF r.low<=n AND n<=r.high THEN
RETURN (1)
FI
RETURN (0)
 
INT FUNC FindRange(Ranges POINTER rs BYTE n)
Range POINTER r
INT i
 
FOR i=0 TO rs.count-1
DO
r=GetItemPtr(rs,i)
IF n<=r.high THEN
RETURN (i)
FI
OD
RETURN (rs.count)
 
PROC Add(Ranges POINTER rs BYTE n)
Range POINTER r,r2
INT i
 
IF rs.count=0 THEN
AppendRange(rs,n,n) RETURN
FI
FOR i=0 TO rs.count-1
DO
r=GetItemPtr(rs,i)
IF n<r.low-1 THEN
InsertRange(rs,i,n,n) RETURN
ELSEIF n=r.low-1 THEN
r.low=n RETURN
ELSEIF n<=r.high THEN
RETURN
ELSEIF n=r.high+1 THEN
r.high=n
IF i<rs.count-1 THEN
r2=GetItemPtr(rs,i+1)
IF n=r2.low OR n+1=r2.low THEN
r.high=r2.high
DeleteRange(rs,i+1)
FI
FI
RETURN
ELSEIF i=rs.count-1 THEN
AppendRange(rs,n,n)
RETURN
FI
OD
RETURN
 
PROC Remove(Ranges POINTER rs BYTE n)
Range POINTER r
BYTE h
INT i
 
IF rs.count=0 THEN
RETURN
FI
FOR i=0 TO rs.count-1
DO
r=GetItemPtr(rs,i)
IF n<=r.low-1 THEN
RETURN
ELSEIF n=r.low THEN
r.low=n+1
IF r.low>r.high THEN
DeleteRange(rs,i)
FI
RETURN
ELSEIF n<r.high THEN
h=r.high
r.high=n-1
InsertRange(rs,i+1,n+1,h)
RETURN
ELSEIF n=r.high THEN
r.high=n-1
RETURN
FI
OD
RETURN
 
PROC TestAdd(Ranges POINTER rs BYTE n)
PrintF("%E Add %B -> ",n)
Add(rs,n)
PrintRanges(rs)
RETURN
 
PROC TestRemove(Ranges POINTER rs BYTE n)
PrintF("%E Remove %B -> ",n)
Remove(rs,n)
PrintRanges(rs)
RETURN
 
PROC Main()
CARD ARRAY d(20)
Ranges rs
 
InitRanges(rs,d)
PrintRanges(rs)
TestAdd(rs,77)
TestAdd(rs,79)
TestAdd(rs,78)
TestRemove(rs,77)
TestRemove(rs,78)
TestRemove(rs,79)
 
PutE() PutE()
InitRanges(rs,d)
AppendRange(rs,1,3)
AppendRange(rs,5,5)
PrintRanges(rs)
TestAdd(rs,1)
TestRemove(rs,4)
TestAdd(rs,7)
TestAdd(rs,8)
TestAdd(rs,6)
TestRemove(rs,7)
 
PutE() PutE()
InitRanges(rs,d)
AppendRange(rs,1,5)
AppendRange(rs,10,25)
AppendRange(rs,27,30)
PrintRanges(rs)
TestAdd(rs,26)
TestAdd(rs,9)
TestAdd(rs,7)
TestRemove(rs,26)
TestRemove(rs,9)
TestRemove(rs,7)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Range_modifications.png Screenshot from Atari 8-bit computer]
<pre>
empty
Add 77 -> 77-77
Add 79 -> 77-77,79-79
Add 78 -> 77-79
Remove 77 -> 78-79
Remove 78 -> 79-79
Remove 79 -> empty
 
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
 
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|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">RangeModifications(arr, Modify, v){
global steps ; optional line to track examples steps
if (Modify = "add")
Line 240 ⟶ 484:
x := StrSplit(v, "-"), arr.push([x.1, x.2])
return arr
}</langsyntaxhighlight>
Examples:<langsyntaxhighlight AutoHotkeylang="autohotkey">arr := string2obj("")
steps .= "start with`t:`t" obj2string(arr) "`n"
arr := RangeModifications(arr, "Add", 77)
Line 272 ⟶ 516:
arr := RangeModifications(arr, "Remove", 7)
MsgBox % steps
return</langsyntaxhighlight>
{{out}}
<pre>start with :
Line 299 ⟶ 543:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <iomanip>
#include <iostream>
Line 440 ⟶ 684:
test3();
return 0;
}</langsyntaxhighlight>
 
{{out}}
Line 471 ⟶ 715:
=={{header|Go}}==
{{trans|Wren}}
<langsyntaxhighlight lang="go">package main
 
import (
Line 592 ⟶ 836:
fns[op[0]](&rngs, op[1])
}
}</langsyntaxhighlight>
 
{{out}}
Line 619 ⟶ 863:
remove 9 => 1-5,7-7,10-25,27-30
remove 7 => 1-5,10-25,27-30
</pre>
 
=={{header|jq}}==
{{Works with|jq}}
 
'''Also works with gojq, the Go implementation of jq (*)'''
 
In this entry, a closed interval [i,j] is represented by the JSON array [i, j],
and a sequence of such intervals is represented as a sorted array of such arrays,
with the understanding that [] represents the null sequence. i and j may be negative.
 
In order to show progress using the string representation of ranges,
jq's "debug" filter is used to show intermediate steps.
 
(*) For gojq, a def of debug/1 may be required as follows:
<pre>
def debug(msg): (msg | debug | empty), .;
</pre>
<syntaxhighlight lang="jq">
# Conversion between string and JSON representations of ranges
# Allow negative integers
def r2j:
[ scan( "(-?[0-9]+)-(-?[0-9]+)|(-?[0-9]+)" )
| map(select(. != null) | tonumber)
| if length==1 then [first,first] end ] ;
 
def j2r:
map( if first == last then "\(first)"
else "\(first)-\(last)"
end )
| join(",");
 
# A quick determination of whether $n is in a sequence of intervals
def indexOf($n):
(first( range(0;length) as $i
| if .[$i][0] <= $n and $n <= .[$i][1] then $i
elif $n < .[$i][0] then -1
else empty
end ) // -1)
| if . == -1 then null else . end ;
 
def rangesAdd($n):
 
# Detect the special case where $i is the only integer in the gap between .[$i] and .[$i+1]
def tween($i):
-1 < $i and $i < length - 1 and .[$i][1] == $i - 1 and .[$i+1][0] == $i + 1;
 
# First handle the boundary cases:
if length == 0 then [[$n, $n]]
elif $n < .[0][0]-1 then [[$n,$n]] + .
elif $n == .[0][0]-1 then [[$n, .[0][1]]] + .[1:]
elif $n > .[-1][1]+1 then . + [[$n,$n]]
elif $n == .[-1][1]+1 then .[:-1] + [[.[-1][0], $n]]
else (map(first) | bsearch($n)) as $ix
| if $ix >= 0 then .
else (-2-$ix) as $i # $i >= 0 is the interval at the insertion point minus 1
| if tween($i)
then .[:$i] + [[.[$i][0], .[$i+1][1]]] + .[$i+2:] # coalesce
else .[$i] as $x # the preliminary checks above ensure 0 <= $i < $length-1
| if $x[0] <= $n and $n <= $x[1] # [_ $n _]
then .
elif $n == $x[1] + 1 # [ *] $n
then (if $i == 0 then null else .[$i-1:] end) + [[$x[0], $n]] + .[$i+1:]
elif $n == .[$i+1][0] - 1 # $n [* _]
then .[:$i+1] + [[$n, .[$i+1][1]]] + .[$i+2:]
else # assert($x[1] < $n and $n < .[$i+1][0]) # [] $n []
.[:$i+1] + [[$n,$n]] + .[$i+1:]
end
end
end
end ;
 
def rangesRemove($n):
# remove a value from a single interval
def remove($n):
. as [$a,$b]
| if $a == $b and $a == $n then null
elif $a == $n then [[$n+1, $b]]
elif $b == $n then [[$a, $n-1]]
else [[$a, $n-1], [$n+1, $b]]
end;
indexOf($n) as $ix
| if $ix then .[:$ix] + (.[$ix]|remove($n)) + .[$ix+1:]
else .
end ;
 
### Pretty printing
def lpad($len): tostring | ($len - length) as $l | (" " * $l) + .;
 
# Functions for showing intermediate results, in string form:
# Input: the JSON representation
def add(n):
rangesAdd(n)
| debug(" add \(n|lpad(3)) => \(j2r)");
def remove(n):
rangesRemove(n)
| debug(" remove \(n|lpad(3)) => \(j2r)");
 
# The tasks expressed as sequences of operations on the JSON representation
def s0:
add(77)
| add(79)
| add(78)
| remove(77)
| remove(78)
| remove(79)
;
 
def s1:
add(1)
| remove(4)
| add(7)
| add(8)
| add(6)
| remove(7)
;
 
def s2:
add(26)
| add(9)
| add(7)
| remove(26)
| remove(9)
| remove(7)
;
 
def ex0: "Starting with \(.)", "Ending with \(r2j | s0 | j2r)\n";
def ex1: "Starting with \(.)", "Ending with \(r2j | s1 | j2r)\n";
def ex2: "Starting with \(.)", "Ending with \(r2j | s2 | j2r)\n";
 
("" | ex0),
("1-3,5" | ex1),
("1-5,10-25,27-30" | ex2)
</syntaxhighlight>
{{output}}
<pre>
Starting with
["DEBUG:"," add 77 => 77"]
["DEBUG:"," add 79 => 77,79"]
["DEBUG:"," add 78 => 77-79"]
["DEBUG:"," remove 77 => 78-79"]
["DEBUG:"," remove 78 => 79"]
["DEBUG:"," remove 79 => "]
Ending with
 
Starting with 1-3,5
["DEBUG:"," add 1 => 1-3,5"]
["DEBUG:"," remove 4 => 1-3,5"]
["DEBUG:"," add 7 => 1-3,5,7"]
["DEBUG:"," add 8 => 1-3,5,7-8"]
["DEBUG:"," add 6 => 1-3,5-8"]
["DEBUG:"," remove 7 => 1-3,5-6,8"]
Ending with 1-3,5-6,8
 
Starting with 1-5,10-25,27-30
["DEBUG:"," add 26 => 1-5,10-30"]
["DEBUG:"," add 9 => 1-5,9-30"]
["DEBUG:"," add 7 => 1-5,7,9-30"]
["DEBUG:"," remove 26 => 1-5,7,9-25,27-30"]
["DEBUG:"," remove 9 => 1-5,7,10-25,27-30"]
["DEBUG:"," remove 7 => 1-5,10-25,27-30"]
Ending with 1-5,10-25,27-30
</pre>
 
=={{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.
<langsyntaxhighlight lang="julia">import Base.parse, Base.print, Base.reduce
 
const RangeSequence = Array{UnitRange, 1}
Line 718 ⟶ 1,126:
println("Parse \"10-25, 1-5, 27-30\" => ", parse(RangeSequence, "10-25, 1-5, 27-30"))
println("Parse \"3-1,15-5,25-10,30-27\" => ", parse(RangeSequence, "3-1,15-5,25-10,30-27"))
</langsyntaxhighlight>{{out}}
<pre>
Start: ""
Line 749 ⟶ 1,157:
 
=={{header|Nim}}==
<langsyntaxhighlight Nimlang="nim">import algorithm, sequtils, strscans, strutils
 
type
Line 899 ⟶ 1,307:
r.remove 26
r.remove 9
r.remove 7</langsyntaxhighlight>
 
{{out}}
Line 926 ⟶ 1,334:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">#!/usr/bin/perl
 
use strict;
Line 993 ⟶ 1,401:
remove 26
remove 9
remove 7</langsyntaxhighlight>
{{out}}
<pre>
Line 1,022 ⟶ 1,430:
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>requires("0.8.2") -- (uses latest apply() functionality)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
 
<span style="color: #008080;">function</span> <span style="color: #000000;">add</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
function add(sequence ranges, atom v)
<span style="color: #000080;font-style:italic;">--
--
-- eg {} + 9 -->&gt; <nowiki>{{</nowiki>9,9<nowiki>}}</nowiki> -- [1]
-- <nowiki>{{</nowiki>3,5<nowiki>}}</nowiki> + 9 -->&gt; <nowiki>{{</nowiki>3,5},{9,9<nowiki>}}</nowiki> -- [1]
-- <nowiki>{{</nowiki>3,5<nowiki>}}</nowiki> + 4 -->&gt; as-is -- [2]
-- <nowiki>{{</nowiki>3,5<nowiki>}}</nowiki> + 2 -->&gt; <nowiki>{{</nowiki>2,5<nowiki>}}</nowiki> -- [3]
-- <nowiki>{{</nowiki>3,5},{7,9<nowiki>}}</nowiki> + 6 -->&gt; <nowiki>{{</nowiki>3,9<nowiki>}}</nowiki> -- [4]
-- <nowiki>{{</nowiki>3,5},{8,9<nowiki>}}</nowiki> + 6 -->&gt; <nowiki>{{</nowiki>3,6},{8,9<nowiki>}}</nowiki> -- [5]
-- <nowiki>{{</nowiki>3,5},{8,9<nowiki>}}</nowiki> + 7 -->&gt; <nowiki>{{</nowiki>3,5},{7,9<nowiki>}}</nowiki> -- [3]
-- <nowiki>{{</nowiki>3,5<nowiki>}}</nowiki> + 6 -->&gt; <nowiki>{{</nowiki>3,6<nowiki>}}</nowiki> -- [6]
-- <nowiki>{{</nowiki>3,5<nowiki>}}</nowiki> + 1 -->&gt; <nowiki>{{</nowiki>1,1},{3,5<nowiki>}}</nowiki> -- [7]
--</span>
--
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ranges</span><span style="color: #0000FF;">)</span>
integer l = length(ranges)
<span style="color: #000000;">ranges</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ranges</span><span style="color: #0000FF;">)</span>
for i=1 to l+1 do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
if i>l then ranges &= {{v,v}} exit -- [1]
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">></span><span style="color: #000000;">l</span> <span style="color: #008080;">then</span> <span style="color: #000000;">ranges</span> <span style="color: #0000FF;">&=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">}}</span> <span style="color: #008080;">exit</span> <span style="color: #000080;font-style:italic;">-- [1]</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
atom nl,{lo,hi} = ranges[i]
<span style="color: #004080;">atom</span> <span style="color: #000000;">nl</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hi</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
if v>=lo and v<=hi then exit -- [2]
<span style="color: #008080;">if</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">lo</span> <span style="color: #008080;">and</span> <span style="color: #000000;">v</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">hi</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #000080;font-style:italic;">-- [2]</span>
elsif v=lo-1 then ranges[i][1] = v exit -- [3]
<span style="color: #008080;">elsif</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">=</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">v</span> <span style="color: #008080;">exit</span> <span style="color: #000080;font-style:italic;">-- [3]</span>
elsif v=hi+1 then
<span style="color: #008080;">elsif</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">=</span><span style="color: #000000;">hi</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
if i<l then
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;"><</span><span style="color: #000000;">l</span> <span style="color: #008080;">then</span>
{nl,hi} = ranges[i+1]
<span style="color: #0000FF;">{</span><span style="color: #000000;">nl</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hi</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
if nl=v+1 then
<span style="color: #008080;">if</span> <span style="color: #000000;">nl</span><span style="color: #0000FF;">=</span><span style="color: #000000;">v</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
ranges[i..i+1] = {{lo,hi}} exit -- [4]
<span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hi</span><span style="color: #0000FF;">}}</span> <span style="color: #008080;">exit</span> <span style="color: #000080;font-style:italic;">-- [4]</span>
else
<span ranges[i][2] style="color: v exit -- [5]#008080;">else</span>
<span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">v</span> <span style="color: #008080;">exit</span> <span style="color: #000080;font-style:italic;">-- [5]</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
else
<span style="color: #008080;">else</span>
ranges[i][2] = v exit -- [6]
<span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">v</span> <span style="color: #008080;">exit</span> <span style="color: #000080;font-style:italic;">-- [6]</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
elsif v<lo then ranges[i..i-1] = {{v,v}} exit -- [7]
<span style="color: #008080;">elsif</span> <span style="color: #000000;">v</span><span style="color: #0000FF;"><</span><span style="color: #000000;">lo</span> <span style="color: #008080;">then</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">}}</span> <span style="color: #008080;">exit</span> <span style="color: #000080;font-style:italic;">-- [7]</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
return ranges
<span style="color: #008080;">return</span> <span style="color: #000000;">ranges</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
function del(sequence ranges, atom v)
<span style="color: #008080;">function</span> <span style="color: #000000;">del</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
--
<span style="color: #000080;font-style:italic;">--
-- eg {{1,2}} - 1 --> {{2,2}} -- [1]
-- eg <nowiki>{{2</nowiki>1,2<nowiki>}}</nowiki> - 21 --> &gt; <nowiki>{{</nowiki>2,2<nowiki>} }</nowiki> -- [21]
-- <nowiki>{{1</nowiki>2,2<nowiki>}}</nowiki> - 2 -->&gt; {{1,1}} -- [32]
-- <nowiki>{{</nowiki>1,32<nowiki>}}</nowiki> - 2 -->&gt; <nowiki>{{</nowiki>1,1},{3,3<nowiki>}}</nowiki> -- [43]
-- <nowiki>{{2</nowiki>1,3<nowiki>}}</nowiki> - 12 --> as-is &gt; <nowiki>{{</nowiki>1,1},{3,3<nowiki>}}</nowiki> -- [54]
-- <nowiki>{{</nowiki>2,3<nowiki>}}</nowiki> - 1 --&gt; as-is -- [5]
--
--</span>
for i=1 to length(ranges) do
<span style="color: #000000;">ranges</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ranges</span><span style="color: #0000FF;">)</span>
atom {lo,hi} = ranges[i]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ranges</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if v>=lo and v<=hi then
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hi</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
if v=lo then
<span style="color: #008080;">if</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">lo</span> <span style="color: #008080;">and</span> <span style="color: #000000;">v</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">hi</span> <span style="color: #008080;">then</span>
if v<hi then ranges[i][1] = lo+1 -- [1]
<span style="color: #008080;">if</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">=</span><span style="color: #000000;">lo</span> <span style="color: #008080;">then</span>
else ranges[i..i] = {} end if -- [2]
<span style="color: #008080;">if</span> <span style="color: #000000;">v</span><span style="color: #0000FF;"><</span><span style="color: #000000;">hi</span> <span style="color: #008080;">then</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lo</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #000080;font-style:italic;">-- [1]</span>
elsif v==hi then ranges[i][2] = hi-1 -- [3]
<span style="color: #008080;">else</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- [2]</span>
else ranges[i..i] = {{lo,v-1},{v+1,hi}} -- [4]
<span style="color: #008080;">elsif</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">==</span><span style="color: #000000;">hi</span> <span style="color: #008080;">then</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">hi</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #000080;font-style:italic;">-- [3]</span>
end if exit
<span style="color: #008080;">else</span> <span style="color: #000000;">ranges</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">..</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">lo</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">v</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hi</span><span style="color: #0000FF;">}}</span> <span style="color: #000080;font-style:italic;">-- [4]</span>
elsif v<hi then exit end if -- [5]
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #008080;">exit</span>
end for
<span style="color: #008080;">elsif</span> <span style="color: #000000;">v</span><span style="color: #0000FF;"><</span><span style="color: #000000;">hi</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span> <span style="color: #000080;font-style:italic;">-- [5]</span>
return ranges
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end function
<span style="color: #008080;">return</span> <span style="color: #000000;">ranges</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
constant tests = split("""
Start with ""
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"""
add 77
Start with ""
add 79
add 7877
remove 77add 79
remove add 78
remove 7977
remove 78
Start with "1-3,5-5"
add 1remove 79
Start with "1-3,5-5"
remove 4
add 71
add 8remove 4
add 67
remove 7add 8
add 6
Start with "1-5,10-25,27-30"
add 26remove 7
Start with "1-5,10-25,27-30"
add 9
add 726
remove 26add 9
remove 9add 7
remove 726
remove 9
Start with "13-14,22-22,100000999999-100001000000,100001000003-999999999999"
remove 227
Start with "13-14,22-22,100000999999-100001000000,100001000003-999999999999"
remove 100000999999
remove 10000100000022
remove add 100001000001100000999999
remove add 100001000002100001000000
add 100001000001
remove 100001000002
add 100001000002
remove 100001000001
remove 100001000002
""","\n",no_empty:=true)
remove 100001000001
 
"""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">no_empty</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
string range = ""
sequence ranges -- range internal form
<span style="color: #004080;">string</span> <span style="color: #000000;">range</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
for i=1 to length(tests) do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ranges</span> <span style="color: #000080;font-style:italic;">-- range internal form</span>
string ti = tests[i]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if match("Start with",ti) then
<span style="color: #004080;">string</span> <span style="color: #000000;">ti</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
{{range}} = scanf(trim(ti),"Start with \"%s\"")
<span style="color: #008080;">if</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Start with"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
ranges = split(range,",")
<span style="color: #0000FF;">{</span><span style="color: #000000;">range</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"Start with \"%s\""</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
ranges = vslice(apply(true,scanf,{ranges,{"%d-%d"}}),1)
<span style="color: #000000;">ranges</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">range</span><span style="color: #0000FF;">,</span><span style="color: #008000;">","</span><span style="color: #0000FF;">)</span>
printf(1,"\n Start with: \"%s\"\n",{range})
<span style="color: #000000;">ranges</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">vslice</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">ranges</span><span style="color: #0000FF;">,{</span><span style="color: #008000;">"%d-%d"</span><span style="color: #0000FF;">}}),</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
-- ^^ ^^
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n Start with: \"%s\"\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">range</span><span style="color: #0000FF;">})</span>
else
<span style="color: #000080;font-style:italic;">-- ^^ ^^</span>
{{string op, atom v}} = scanf(trim(ti),"%s %d")
<span style="color: #008080;">else</span>
integer rid = routine_id(substitute(op,"remove","del"))
<span style="color: #0000FF;">{</span><span style="color: #004080;">string</span> <span style="color: #000000;">op</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">v</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ti</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"%s %d"</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
ranges = rid(ranges,v)
<span style="color: #004080;">integer</span> <span style="color: #000000;">rid</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">routine_id</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">op</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"remove"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"del"</span><span style="color: #0000FF;">))</span>
range = join(apply(true,sprintf,{{"%d-%d"},ranges}),",")
<span style="color: #000000;">ranges</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rid</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ranges</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">)</span>
printf(1," %9s %-12d -> \"%s\"\n",{op,v,range})
<span style="color: #000000;">range</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">,{{</span><span style="color: #008000;">"%d-%d"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">ranges</span><span style="color: #0000FF;">}),</span><span style="color: #008000;">","</span><span style="color: #0000FF;">)</span>
-- ^^ ^^
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" %9s %-12d -&gt; \"%s\"\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">op</span><span style="color: #0000FF;">,</span><span style="color: #000000;">v</span><span style="color: #0000FF;">,</span><span style="color: #000000;">range</span><span style="color: #0000FF;">})</span>
end if
<span style="color: #000080;font-style:italic;">-- ^^ ^^</span>
end for</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</syntaxhighlight>-->
{{out}}
<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>
Line 1,171 ⟶ 1,582:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">class Sequence():
def __init__(self, sequence_string):
Line 1,277 ⟶ 1,688:
remove 7
""")
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,314 ⟶ 1,725:
Won't handle negative numbers as written, mostly due the need to work around the syntax requirements for output.
 
<syntaxhighlight lang="raku" perl6line>my @seq;
 
-> $op, $string { printf "%20s -> %s\n", $op, $string } for
Line 1,420 ⟶ 1,831:
}
@ranges
}</langsyntaxhighlight>
 
{{out}}
Line 1,463 ⟶ 1,874:
=={{header|Wren}}==
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./fmt" for Fmt
 
var rangesAdd = Fn.new { |ranges, n|
Line 1,546 ⟶ 1,957:
Fmt.print("\nStart: $q", standard.call(ranges))
for (op in ops) fns[op[0]].call(ranges, op[1])
</syntaxhighlight>
</lang>
 
{{out}}
2,442

edits