Run-length encoding: Difference between revisions

(Added Arturo implementation)
Line 5,541:
}</lang>
 
=={{header|TMGTSE SAL}}==
<lang TSESAL>
Unix TMG is designed to process and generate ''files'' rather than process text in memory. Therefore encoding and decoding parts can be done in separate programs.
STRING PROC FNStringGetDecodeStringCharacterEqualCountS( STRING inS )
 
STRING s1[255] = ""
Encoding:
STRING s2[255] = ""
<lang UnixTMG>loop: ordcop [lch?]\loop;
STRING s3[255] = ""
ordcop: ord/copy;
STRING s4[255] = ""
ord: char(ch)/last [ch!=lch?]\new [cnt++] fail;
INTEGER I = 0
new: ( [lch?] parse(out) | () ) [lch=ch] [cnt=1] fail;
INTEGER J = 0
out: decimal(cnt) scopy = { 2 1 };
INTEGER K = 0
last: parse(out) [lch=0];
INTEGER L = 0
copy: smark any(!<<>>);
K = Length( inS )
 
ch: I = 1 - 0;1
REPEAT
lch: 0;
cnt: J = 0;</lang>1 - 1
s3 = ""
 
REPEAT
Decoding:
I = I + 1
<lang UnixTMG>loop: readint(n) copy\loop;
J = J + 1
copy: smark any(!<<>>)
s1 = SubStr( inS, I, 1 )
repeat: [n?] parse(( scopy )) [--n>0?]\repeat;
s3 = s3 + s1
 
s4 = SubStr( inS, I + 1, 1 )
/* Reads decimal integer */
UNTIL ( NOT ( s4 IN '0'..'9' ) )
readint: proc(n;i) ignore(<<>>) [n=0] inta
FOR L = 1 TO Val( s3 )
int1: [n = n*12+i] inta\int1;
s2 = s2 + s4
inta: char(i) [i<72?] [(i =- 60)>=0?];
ENDFOR
 
I = I + 1
i: 0;
UNTIL ( I >= ( K - 1 ) )
n: 0;</lang>
RETURN( s2 )
END
//
STRING PROC FNStringGetEncodeStringCharacterEqualCountS( STRING inS )
STRING s1[255] = ""
STRING s2[255] = ""
INTEGER I = 0
INTEGER J = 0
INTEGER K = 0
K = Length( inS )
I = 1 - 1
REPEAT
J = 1 - 1
REPEAT
I = I + 1
J = J + 1
s1 = SubStr( inS, I, 1 )
UNTIL ( NOT ( SubStr( inS, I + 1, 1 ) == s1 ) )
s2 = s2 + Str( J ) + s1
UNTIL ( I >= ( K - 1 ) )
RETURN( s2 )
END
//
STRING PROC FNStringGetEncodeDecodeStringCharacterEqualCountS( STRING inS )
STRING s1[255] = FNStringGetEncodeStringCharacterEqualCountS( inS )
STRING s2[255] = FNStringGetDecodeStringCharacterEqualCountS( s1 )
RETURN( s2 )
END
//
PROC Main()
STRING s1[255] = "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
STRING s2[255] = ""
IF ( NOT ( Ask( "string: get: encode: decode: string: character: equal: count: inS = ", s1, _EDIT_HISTORY_ ) ) AND ( Length( s1 ) > 0 ) ) RETURN() ENDIF
s2 = FNStringGetEncodeDecodeStringCharacterEqualCountS( s1 )
Warn( "equal strings if result is 1", ",", " ", "and the result is", ":", " ", s1 == s2 )
END
n: 0;</lang>
 
=={{header|TUSCRIPT}}==