Korjauksia yms. ottaisin ihan mielelläni vastaan, koska tiedän että unisena koodaaminen ei aina tuota juuri sitä parasta tulosta.
Code: Select all
SCREEN 800,600
Dim _text As String
Dim tulos As String
_text = "Tämä on esimerkki 'run-length' enkoodauksesta"
Print _text
Print ""
Print "RLE tulos: "+RLE(_text,True)
WaitKey
End
Function RLE$(_line$,_print)
Dim sum%
Dim result$
Dim _found$
For i=1 To Len(_line)
char$=Mid(_line,i,1)
For f=0 To Len(_found)
If char=Mid(_found,f+1,1)
uniq=False
Exit
Else
uniq=True
EndIf
Next f
If uniq Then
_found=_found+char
For k=1 To Len(_line)
If char=Mid(_line,k,1) Then
sum=sum+1
EndIf
Next k
result=result+Str(sum)+Str(char)
If _print Then Print char+": "+sum
EndIf
sum=0
Next i
Return result
EndFunction
EDIT:
Itseasiassa yllä oleva koodi ei olekaan oikea RLE (vaan se lähentelee Huffman Coding:ia), vaan alla oleva =D Mutta kuitenkin...
Code: Select all
' Päivitin aikaisemman koodinpätkän ja laitoin RLE:n funktioon parilla selventävällä kommentilla.
'** Esimerkkikoodi vv
teksti$ = "BBBBBBBBBBBBWBBBBBBBBBBWWBBBBBBWWWWWWBBBBBBBBBBBBBBB"
enkoodattu$ = RLE(teksti)
Print "RLE koodattu tulos on: "+enkoodattu
WaitKey
'** Esimerkkikoodi ^^
'RLE-funktio
Function RLE$(_line As String)
Dim result As String
Dim check As String
Dim sum As Integer
Dim oldc As String
result = ""
sum=1
'Käydään annettu merkkijono läpi
For i=1 To Len(_line)
check$=Mid(_line,i,1) 'Otetaan tarkistusmerkki merkkijonosta
If check=oldc Then 'Jos tarkistusmerkki on edelleen sama, lisätään summaan yksi (1)
sum=sum+1
Else 'Jos se ei olekaan enää sama, lisätään summa ja merkki palautusmerkkijonoon
If i>1 Then 'Tämä siksi ettei lisätä pelkkää ykköstä ensimmäisellä tarkistuskerralla
result=result+Str(sum)+Str(oldc)
Print result
sum=1 'Palautetaan summa takaisin seuraavaa merkkiä varten
EndIf
EndIf
oldc=check 'Edellinen tarkistusmerkki
Next i
Return result 'Palautetaan enkoodattu tulos
EndFunction