Run-length encoding: Difference between revisions

added code for sed (may need some polishing)
(added code for sed (may need some polishing))
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)}'''
 
=={{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}}==
Anonymous user