langs a-z
This commit is contained in:
parent
db842d013d
commit
d066446780
11389 changed files with 98361 additions and 1020 deletions
97
Task/LZW-compression/PureBasic/lzw-compression.purebasic
Normal file
97
Task/LZW-compression/PureBasic/lzw-compression.purebasic
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
Procedure compress(uncompressed.s, List result.u())
|
||||
;Compress a string to a list of output symbols
|
||||
|
||||
;Build the dictionary.
|
||||
Protected dict_size = 255, i
|
||||
newmap dict.u()
|
||||
For i = 0 To 254
|
||||
dict(Chr(i + 1)) = i
|
||||
Next
|
||||
|
||||
Protected w.s, wc.s, *c.Character = @uncompressed
|
||||
w = ""
|
||||
LastElement(result())
|
||||
While *c\c <> #Null
|
||||
wc = w + Chr(*c\c)
|
||||
If FindMapElement(dict(), wc)
|
||||
w = wc
|
||||
Else
|
||||
AddElement(result())
|
||||
result() = dict(w)
|
||||
;Add wc to the dictionary
|
||||
dict(wc) = dict_size
|
||||
dict_size + 1 ;no check is performed for overfilling the dictionary.
|
||||
w = Chr(*c\c)
|
||||
EndIf
|
||||
*c + 1
|
||||
Wend
|
||||
|
||||
;Output the code for w
|
||||
If w
|
||||
AddElement(result())
|
||||
result() = dict(w)
|
||||
EndIf
|
||||
EndProcedure
|
||||
|
||||
Procedure.s decompress(List compressed.u())
|
||||
;Decompress a list of encoded values to a string
|
||||
If ListSize(compressed()) = 0: ProcedureReturn "": EndIf
|
||||
|
||||
;Build the dictionary.
|
||||
Protected dict_size = 255, i
|
||||
|
||||
Dim dict.s(255)
|
||||
For i = 1 To 255
|
||||
dict(i - 1) = Chr(i)
|
||||
Next
|
||||
|
||||
Protected w.s, entry.s, result.s
|
||||
FirstElement(compressed())
|
||||
w = dict(compressed())
|
||||
result = w
|
||||
|
||||
i = 0
|
||||
While NextElement(compressed())
|
||||
i + 1
|
||||
If compressed() < dict_size
|
||||
entry = dict(compressed())
|
||||
ElseIf i = dict_size
|
||||
entry = w + Left(w, 1)
|
||||
Else
|
||||
MessageRequester("Error","Bad compression at [" + Str(i) + "]")
|
||||
ProcedureReturn result;abort
|
||||
EndIf
|
||||
result + entry
|
||||
;Add w + Left(entry, 1) to the dictionary
|
||||
If ArraySize(dict()) <= dict_size
|
||||
Redim dict(dict_size + 256)
|
||||
EndIf
|
||||
dict(dict_size) = w + Left(entry, 1)
|
||||
dict_size + 1 ;no check is performed for overfilling the dictionary.
|
||||
|
||||
w = entry
|
||||
Wend
|
||||
ProcedureReturn result
|
||||
EndProcedure
|
||||
|
||||
If OpenConsole()
|
||||
;How to use:
|
||||
|
||||
Define initial.s, decompressed.s
|
||||
|
||||
Print("Type something: ")
|
||||
initial = Input()
|
||||
NewList compressed.u()
|
||||
compress(initial, compressed())
|
||||
ForEach compressed()
|
||||
Print(Str(compressed()) + " ")
|
||||
Next
|
||||
PrintN("")
|
||||
|
||||
decompressed = decompress(compressed())
|
||||
PrintN(decompressed)
|
||||
|
||||
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
|
||||
Input()
|
||||
CloseConsole()
|
||||
EndIf
|
||||
Loading…
Add table
Add a link
Reference in a new issue