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|0.6}}
{{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 range(0, dictsize))
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 range(0, dictsize))
dict = Dict{Int,String}(i => string('\0' + i) for i in 0:dictsize)
result = IOBuffer()
result = IOBuffer()
w = string(Char(shift!(compressed)))
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>