Move-to-front algorithm: Difference between revisions
Content added Content deleted
m (fix) |
(Added solution for Action!) |
||
Line 144: | Line 144: | ||
bananaaa encodes to [1, 1, 13, 1, 1, 1, 0, 0], which decodes back to bananaaa |
bananaaa encodes to [1, 1, 13, 1, 1, 1, 0, 0], which decodes back to bananaaa |
||
hiphophiphop encodes to [7, 8, 15, 2, 15, 2, 2, 3, 2, 2, 3, 2], which decodes back to hiphophiphop |
hiphophiphop encodes to [7, 8, 15, 2, 15, 2, 2, 3, 2, 2, 3, 2], which decodes back to hiphophiphop |
||
</pre> |
|||
=={{header|Action!}}== |
|||
<lang Action!>DEFINE SYMBOL_TABLE_SIZE="26" |
|||
PROC InitSymbolTable(BYTE ARRAY table BYTE len) |
|||
BYTE i |
|||
FOR i=0 TO len-1 |
|||
DO |
|||
table(i)=i+'a |
|||
OD |
|||
RETURN |
|||
BYTE FUNC Find(BYTE ARRAY table BYTE len,c) |
|||
BYTE i |
|||
FOR i=0 TO len-1 |
|||
DO |
|||
IF table(i)=c THEN |
|||
RETURN (i) |
|||
FI |
|||
OD |
|||
Break() |
|||
RETURN (0) |
|||
PROC MoveToFront(BYTE ARRAY table BYTE len,pos) |
|||
BYTE sym |
|||
sym=table(pos) |
|||
WHILE pos>0 |
|||
DO |
|||
table(pos)=table(pos-1) |
|||
pos==-1 |
|||
OD |
|||
table(pos)=sym |
|||
RETURN |
|||
PROC Encode(CHAR ARRAY in BYTE ARRAY out BYTE POINTER outLen) |
|||
BYTE ARRAY table(SYMBOL_TABLE_SIZE) |
|||
BYTE i,pos |
|||
outLen^=0 |
|||
InitSymbolTable(table,SYMBOL_TABLE_SIZE) |
|||
FOR i=1 TO in(0) |
|||
DO |
|||
pos=Find(table,SYMBOL_TABLE_SIZE,in(i)) |
|||
out(outLen^)=pos |
|||
outLen^==+1 |
|||
MoveToFront(table,SYMBOL_TABLE_SIZE,pos) |
|||
OD |
|||
RETURN |
|||
PROC Decode(BYTE ARRAY in BYTE inLen CHAR ARRAY out) |
|||
BYTE ARRAY table(SYMBOL_TABLE_SIZE) |
|||
BYTE i,pos,len |
|||
len=0 |
|||
InitSymbolTable(table,SYMBOL_TABLE_SIZE) |
|||
FOR i=0 TO inLen-1 |
|||
DO |
|||
pos=in(i) |
|||
len==+1 |
|||
out(len)=table(pos) |
|||
MoveToFront(table,SYMBOL_TABLE_SIZE,pos) |
|||
OD |
|||
out(0)=len |
|||
RETURN |
|||
PROC Test(CHAR ARRAY s) |
|||
BYTE ARRAY encoded(255) |
|||
CHAR ARRAY decoded(256) |
|||
BYTE encodedLength,i |
|||
Print("Source: ") |
|||
PrintE(s) |
|||
Encode(s,encoded,@encodedLength) |
|||
Print("Encoded: ") |
|||
FOR i=0 TO encodedLength-1 |
|||
DO |
|||
PrintB(encoded(i)) Put(32) |
|||
OD |
|||
PutE() |
|||
Decode(encoded,encodedLength,decoded) |
|||
Print("Decoded: ") |
|||
PrintE(decoded) |
|||
IF SCompare(s,decoded)=0 THEN |
|||
PrintE("Decoded is equal to the source.") |
|||
ELSE |
|||
PrintE("Decoded is different from the source!") |
|||
FI |
|||
PutE() |
|||
RETURN |
|||
PROC Main() |
|||
Test("broood") |
|||
Test("bananaaa") |
|||
Test("hiphophiphop") |
|||
RETURN</lang> |
|||
{{out}} |
|||
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Move-to-front_algorithm.png Screenshot from Atari 8-bit computer] |
|||
<pre> |
|||
Source: broood |
|||
Encoded: 1 17 15 0 0 5 |
|||
Decoded: broood |
|||
Decoded is equal to the source. |
|||
Source: bananaaa |
|||
Encoded: 1 1 13 1 1 1 0 0 |
|||
Decoded: bananaaa |
|||
Decoded is equal to the source. |
|||
Source: hiphophiphop |
|||
Encoded: 7 8 15 2 15 2 2 3 2 2 3 2 |
|||
Decoded: hiphophiphop |
|||
Decoded is equal to the source. |
|||
</pre> |
</pre> |
||