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}}== |