Реализации алгоритмов/Кодирование длин серий

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

C/C++[править]

#include <stdio.h>
#include <string.h>

int main()
{
    int cnt;
    char smb;
    char *code = new char [80];
    char *encode = new char [80];
    char *str = new char [80];

    scanf("%s", code);

    strcpy(encode, "");
    smb = code[0];
    cnt = 0;

    for (int i = 0; i <= strlen(code); i++) {
        if (code[i]==smb) {
            cnt++;
        }
        else {
            sprintf(str, "%d", cnt);
            strcat(encode, str);
            sprintf(str, "%c", smb);
            strcat(encode, str);
            smb = code[i];
            cnt = 1;
        }
    }

    printf("%s\n", encode);

    return 0;
}

Python[править]

def rle(src):
    result = []
    if src:
        current = src.pop(0)
        counter = 1
        for e in src:
            if e == current:
                counter += 1
            else:
                result.append((counter, current))
                current = e
                counter = 1
        result.append((counter, current))
    return result

PHP[править]

<?php
$code = 'fafaaaaaaaaaaaaa';
$encode = '';

for ($i = 0; $i < strlen($code);$i++){
	$smb = $code[$i] ;
	$count = 1 ;
	for ($b = $i; $b < strlen($code);$b++){
		if ($code[$b + 1] != $smb) break ;
		$count++ ;

		$i++ ;
	}
	$encode .= $count . $smb ;
}
print 'Строку: ' . $code . ' удалось сжать до ' . $encode . '.<br> И мы сэкономили ' . (strlen($code) - strlen($encode)) . ' байт.' 
?>

Delphi/Pascal[править]

function encode(s:string):string;
var i,k:integer; c:char;
begin
  Result:='';
  if s='' then exit;
  c:=s[1]; 
  k:=1;
  for i:=2 to length(s)+1 do
    if s[i]=c then inc(k) else
      begin
        if k>1 then Result:=Result+IntToStr(k);
        Result:=Result+c;
        c:=s[i];
        k:=1;
      end;
end;
 
function decode(s:string):string;
var i,j,c:integer;
    newS:string;
begin
i:=1;
while i <= length(s) do
  begin
    j:=i;
    while s[j] in ['0'..'9'] do inc(j);
    if j-i > 0 then
    begin
      for c:=1 to strtoint(copy(s,i,j-i)) do newS := newS + s[j];
      delete(s,i,j-i+1);
    end else
    begin
      newS := newS + s[i];
      inc(i);
    end;
  end;
  result:= newS;
end;

Visual Basic 6[править]

Public Function Encode(ByVal SrcString As String) As String
    Dim I As Long, N As Long, sResult As String
    N = 1
    
    For I = 1 To Len(SrcString)
        If Not Mid(SrcString, I, 1) = Mid(SrcString, I + 1, 1) Then
            sResult = sResult & IIf(I - N + 1 > 1, CStr(I - N + 1), CStr("")) & Mid(SrcString, I, 1)
            N = I + 1
        End If
    Next
    
    Encode = sResult
End Function