Range modifications: Difference between revisions

Added 11l
(Added 11l)
Line 56:
 
Requires [https://www.autohotkey.com/boards/viewtopic.php?t=6517 Gdip Library]
=={{header|11l}}==
{{trans|Python}}
 
<lang 11l>T Sequence
[(Int, Int)] ranges
 
F (sequence_string)
I sequence_string != ‘’
L(r) sequence_string.split(‘,’)
V (b, e) = r.split(‘-’).map(x -> Int(x))
.ranges [+]= (b, e)
assert(.ranges == sorted(.ranges), ‘Sequence order error’)
 
F remove(rem)
L(&r) .ranges
V i = L.index
I rem C r[0] .. r[1]
I r[0] == rem
I r[1] > rem
r[0]++
E
.ranges.pop(i)
E I r[1] == rem
I r[0] < rem
r[1]--
E
.ranges.pop(i)
E
V (r1, splitrange) = (rem - 1, (rem + 1, r[1]))
r[1] = r1
.ranges.insert(i + 1, splitrange)
L.break
I r[0] > rem
L.break
 
F add(add)
L(&r) .ranges
V i = L.index
I add C r[0] .. r[1]
L.break
E I r[0] - 1 == add
r[0] = add
L.break
E I r[1] + 1 == add
r[1] = add
L.break
E I r[0] > add
.ranges.insert(i, (add, add))
L.break
L.was_no_break
.ranges.append((add, add))
 
.consolidate()
 
F consolidate()
‘Combine overlapping ranges’
L(i) 0 .< .ranges.len - 1
V this = i
V that = i + 1
I .ranges[this][1] + 1 >= .ranges[that][0]
I .ranges[this][1] >= .ranges[that][1]
.ranges[that] = .ranges[this]
.ranges[this] = (-1, -1)
E
.ranges[that] = (.ranges[this][0], .ranges[that][1])
.ranges[this] = (-1, -1)
.ranges = .ranges.filter(r -> r != (-1, -1))
 
F String()
R .ranges.map(r -> r[0]‘-’r[1]).join(‘,’)
 
F demo(opp_txt)
V by_line = opp_txt.split("\n")
V start = by_line.pop(0)
V ex = Sequence(start.split(‘ ’).last[1 .< (len)-1])
V lines = by_line.map(line -> line.ltrim(‘ ’).split(‘ ’))
V opps = lines.map(word -> (word[0], Int(word[1])))
print(‘Start: "’ex‘"’)
L(op, val) opps
I op == ‘add’
ex.add(val)
E
assert(op == ‘remove’)
ex.remove(val)
print(‘ #6 #2 => #.’.format(op, val, ex))
print()
 
demo(‘ Start with ""
add 77
add 79
add 78
remove 77
remove 78
remove 79’)
demo(‘ Start with "1-3,5-5"
add 1
remove 4
add 7
add 8
add 6
remove 7’)
demo(‘ Start with "1-5,10-25,27-30"
add 26
add 9
add 7
remove 26
remove 9
remove 7’)</lang>
 
{{out}}
<pre>
Start: ""
add 77 => 77-77
add 79 => 77-77,79-79
add 78 => 77-79
remove 77 => 78-79
remove 78 => 79-79
remove 79 =>
 
Start: "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
 
Start: "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}}==
<lang AutoHotkey>RangeModifications(arr, Modify, v){
1,480

edits