Range modifications: Difference between revisions
Content added Content deleted
Alextretyak (talk | contribs) (Added 11l) |
|||
Line 56: | Line 56: | ||
Requires [https://www.autohotkey.com/boards/viewtopic.php?t=6517 Gdip Library] |
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}}== |
=={{header|AutoHotkey}}== |
||
<lang AutoHotkey>RangeModifications(arr, Modify, v){ |
<lang AutoHotkey>RangeModifications(arr, Modify, v){ |