Run-length encoding: Difference between revisions

Content added Content deleted
(added code for sed (may need some polishing))
Line 2,501: Line 2,501:


To make it faster (it's also faster than the longer implementation above) just replace '''""''' with '''new StringBuilder''' and '''s+i+p''' with '''{s.append(i);s.append(p)}'''
To make it faster (it's also faster than the longer implementation above) just replace '''""''' with '''new StringBuilder''' and '''s+i+p''' with '''{s.append(i);s.append(p)}'''

=={{header|sed}}==
The encode script:
<lang sed>
/^$/ {
b
}
:start
/^[0-9]/ {
b
}
s/(.)(\1*)(.*)/\21\1\3/
:loop
h
/^[^0-9]+9+[^0-9]/ {
s/^[^0-9]+9+[^0-9]//
x
s/^([^0-9]+9+[^0-9]).*/\1/
y/9/0/
s/.0/10/
G
s/\n//
b loop
}
/^[^0-9]+[0-9]*[0-8][^0-9]/ {
s/^[^0-9]+[0-9]*([0-8]).*/\1/
y/012345678/123456789/
G
s/\n//
s/^([1-9]).([^0-9]*[0-9]*)[0-8]/\2\1/
b loop
}
/^[^0-9]+[0-9]+9+[^0-9]/ {
s/^[^0-9]+[0-9]*([0-8]9+)[^0-9].*/\1/
y/0123456789/1234567890/
G
s/\n//
s/^([0-9]+).([^0-9]*[0-9]*)[0-8]9+/\2\1/
b loop
}
s/^([0-9]+.)(.*)/\2\1/
b start
</lang>

The decode script:
<lang sed>
/^$/ {
b
}
:start
/^[^0-9]/ {
b
}
:loop
/^1[^0-9]/ {
s/^1(.)(\1*)(.*)/\3\1\2/
b start
}
/^[0-9]*[1-9][^0-9]/ {
h
s/^[0-9]*([1-9])[^0-9].*/\1/
y/123456789/012345678/
G
s/^([0-8])\n([0-9]*)[1-9]([^0-9])(.*)/\2\1\3\3\4/
b loop
}
/^[0-9]+0+[^0-9]/ {
h
s/^[0-9]*([1-9]0+)[^0-9].*/\1/
y/0123456789/9012345678/
G
s/^([0-9]+)\n([0-9]*)[1-9]0+([^0-9])(.*)/\2\1\3\3\4/
b loop
}
</lang>

Example (assuming the scripts reside in the files <code>encode.sed</code> and <code>decode.sed</code>):
<lang bash>
sed -rf encode.sed <<< "foo oops"
# 1f2o1 2o1p1s

sed -rf decode.sed <<< "1f2o1 2o1p1s"
# foo oops

(sed -rf encode.sed | sed -rf decode.sed) <<< "foo oops"
# foo oops

sed -rf decode.sed <<< "30+"
# ++++++++++++++++++++++++++++++

sed -rf encode.sed <<< "++++++++++++++++++++++++++++++"
# 30+
</lang>


=={{header|Seed7}}==
=={{header|Seed7}}==