type LzwCompression fun compress ← List by text uncompressed List output ← int[] text working ← Text.EMPTY Map symbolTable ← text%int[].with(256, i)) for each text c in uncompressed text augmented ← working + c if symbolTable.has(augmented) working ← augmented else symbolTable.insert(augmented, symbolTable.length) int i ← symbolTable[working] output.append(i) working ← c end end if not working.isEmpty() int i ← symbolTable[working] output.append(i) end return output end fun decompress ← text by List compressed Map symbolTable ← int%text[].with(256, chr(i))) text working ← symbolTable[compressed[0]] text output ← *working for each int i in compressed.extract(1) text s if symbolTable.has(i) s ← symbolTable[i] else if i æ symbolTable.length # cScSc problem s ← working + working[0] else error(65, "Error decompressing") end output.append(s) symbolTable.insert(symbolTable.length, working + s[0]) working ← s end return output end List compressed = compress("TOBEORNOTTOBEORTOBEORNOT") writeLine(compressed) text decompressed = decompress(compressed) writeLine(decompressed)