LZW compression: Difference between revisions
Content added Content deleted
(→{{header|Haskell}}: Replaced older liftM2 and ap with <$> ... <*> etc. Added main and GHC output.) |
m (→{{header|Julia}}: update from Julia 0.6 to 1.1.1) |
||
Line 2,465: | Line 2,465: | ||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
{{works with|Julia| |
{{works with|Julia|1.1.1}} |
||
<lang julia>function compressLZW(decompressed::String) |
<lang julia>function compressLZW(decompressed::String) |
||
dictsize = 256 |
dictsize = 256 |
||
dict = Dict{String,Int}(string(Char(i)) => i for i in |
dict = Dict{String,Int}(string(Char(i)) => i for i in 0:dictsize) |
||
result = Vector{Int}(0) |
result = Vector{Int}(undef, 0) |
||
w = "" |
w = "" |
||
for c in decompressed |
for c in decompressed |
||
Line 2,485: | Line 2,485: | ||
return result |
return result |
||
end |
end |
||
function decompressLZW(compressed::Vector{Int}) |
function decompressLZW(compressed::Vector{Int}) |
||
dictsize = 256 |
dictsize = 256 |
||
dict = Dict{Int,String}(i => string('\0' + i) for i in |
dict = Dict{Int,String}(i => string('\0' + i) for i in 0:dictsize) |
||
result = IOBuffer() |
result = IOBuffer() |
||
w = string(Char( |
w = string(Char(popfirst!(compressed))) |
||
write(result, w) |
write(result, w) |
||
for k in compressed |
for k in compressed |
||
Line 2,505: | Line 2,505: | ||
w = entry |
w = entry |
||
end |
end |
||
return String(result) |
return String(take!(result)) |
||
end |
end |
||
original = ["0123456789", "TOBEORNOTTOBEORTOBEORNOT", "dudidudidudida"] |
original = ["0123456789", "TOBEORNOTTOBEORTOBEORNOT", "dudidudidudida"] |
||
compressed = compressLZW.(original) |
compressed = compressLZW.(original) |
||
decompressed = decompressLZW.(compressed) |
decompressed = decompressLZW.(compressed) |
||
for (word, comp, decomp) in zip(original, compressed, decompressed) |
for (word, comp, decomp) in zip(original, compressed, decompressed) |
||
comprate = (length(word) - length(comp)) / length(word) * 100 |
comprate = (length(word) - length(comp)) / length(word) * 100 |
||
println("Original: $word\n-> Compressed: $comp (compr.rate: $(round(comprate, 2))%)\n-> Decompressed: $decomp") |
println("Original: $word\n-> Compressed: $comp (compr.rate: $(round(comprate, digits=2))%)\n-> Decompressed: $decomp") |
||
end</lang> |
end</lang> |
||