37 lines
1 KiB
Groovy
37 lines
1 KiB
Groovy
def compress = { text ->
|
|
def dictionary = (0..<256).inject([:]) { map, ch -> map."${(char)ch}" = ch; map }
|
|
def w = '', compressed = []
|
|
text.each { ch ->
|
|
def wc = "$w$ch"
|
|
if (dictionary[wc]) {
|
|
w = wc
|
|
} else {
|
|
compressed << dictionary[w]
|
|
dictionary[wc] = dictionary.size()
|
|
w = "$ch"
|
|
}
|
|
}
|
|
if (w) { compressed << dictionary[w] }
|
|
compressed
|
|
}
|
|
|
|
def decompress = { compressed ->
|
|
def dictionary = (0..<256).inject([:]) { map, ch -> map[ch] = "${(char)ch}"; map }
|
|
int dictSize = 128;
|
|
String w = "${(char)compressed[0]}"
|
|
StringBuffer result = new StringBuffer(w)
|
|
|
|
compressed.drop(1).each { k ->
|
|
String entry = dictionary[k]
|
|
if (!entry) {
|
|
if (k != dictionary.size()) throw new IllegalArgumentException("Bad compressed k $k")
|
|
entry = "$w${w[0]}"
|
|
}
|
|
result << entry
|
|
|
|
dictionary[dictionary.size()] = "$w${entry[0]}"
|
|
w = entry
|
|
}
|
|
|
|
result.toString()
|
|
}
|