Sync
This commit is contained in:
parent
6f050a029e
commit
776bba907c
3887 changed files with 59894 additions and 7280 deletions
104
Task/LZW-compression/Objeck/lzw-compression.objeck
Normal file
104
Task/LZW-compression/Objeck/lzw-compression.objeck
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
use Collection;
|
||||
|
||||
class LZW {
|
||||
function : Main(args : String[]) ~ Nil {
|
||||
compressed := Compress("TOBEORNOTTOBEORTOBEORNOT");
|
||||
Show(compressed);
|
||||
decompressed := Decompress(compressed);
|
||||
decompressed->PrintLine();
|
||||
}
|
||||
|
||||
function : native : Compress(uncompressed : String) ~ IntVector {
|
||||
# Build the dictionary.
|
||||
dictSize := 256;
|
||||
dictionary := StringMap->New();
|
||||
for (i := 0; i < 256; i+=1;) {
|
||||
key := "";
|
||||
key->Append(i->As(Char));
|
||||
dictionary->Insert(key, IntHolder->New(i));
|
||||
};
|
||||
|
||||
w := "";
|
||||
result := IntVector->New();
|
||||
|
||||
each (i : uncompressed) {
|
||||
c := uncompressed->Get(i);
|
||||
wc := String->New(w);
|
||||
wc->Append(c);
|
||||
if (dictionary->Has(wc)) {
|
||||
w := wc;
|
||||
}
|
||||
else {
|
||||
value := dictionary->Find(w)->As(IntHolder);
|
||||
result->AddBack(value->Get());
|
||||
# Add wc to the dictionary.
|
||||
dictionary->Insert(wc, IntHolder->New(dictSize));
|
||||
dictSize+=1;
|
||||
w := "";
|
||||
w->Append(c);
|
||||
};
|
||||
};
|
||||
|
||||
# Output the code for w.
|
||||
if (w->Size() > 0) {
|
||||
value := dictionary->Find(w)->As(IntHolder);
|
||||
result->AddBack(value->Get());
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function : Decompress(compressed : IntVector) ~ String {
|
||||
# Build the dictionary.
|
||||
dictSize := 256;
|
||||
dictionary := IntMap->New();
|
||||
for (i := 0; i < 256; i+=1;) {
|
||||
value := "";
|
||||
value->Append(i->As(Char));
|
||||
dictionary->Insert(i, value);
|
||||
};
|
||||
|
||||
w := "";
|
||||
found := compressed->Remove(0);
|
||||
w->Append(found->As(Char));
|
||||
|
||||
result := String->New(w);
|
||||
each (i : compressed) {
|
||||
k := compressed->Get(i);
|
||||
|
||||
entry : String;
|
||||
if (dictionary->Has(k)) {
|
||||
entry := dictionary->Find(k);
|
||||
}
|
||||
else if (k = dictSize) {
|
||||
entry := String->New(w);
|
||||
entry->Append(w->Get(0));
|
||||
}
|
||||
else {
|
||||
return "";
|
||||
};
|
||||
result->Append(entry);
|
||||
|
||||
# Add w+entry[0] to the dictionary.
|
||||
value := String->New(w);
|
||||
value->Append(entry->Get(0));
|
||||
dictionary->Insert(dictSize, value);
|
||||
dictSize+=1;
|
||||
|
||||
w := entry;
|
||||
};
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function : Show(results : IntVector) ~ Nil {
|
||||
"["->Print();
|
||||
each(i : results) {
|
||||
results->Get(i)->Print();
|
||||
if(i + 1 < results->Size()) {
|
||||
", "->Print();
|
||||
};
|
||||
};
|
||||
"]"->PrintLine();
|
||||
}
|
||||
}
|
||||
18
Task/LZW-compression/Scala/lzw-compression.scala
Normal file
18
Task/LZW-compression/Scala/lzw-compression.scala
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
// for now, only compress
|
||||
def compress(tc:String) = {
|
||||
//initial dictionary
|
||||
val startDict = (1 to 255).map(a=>(""+a.toChar,a)).toMap
|
||||
val (fullDict, result, remain) = tc.foldLeft ((startDict, List[Int](), "")) {
|
||||
case ((dict,res,leftOver),nextChar) =>
|
||||
if (dict.contains(leftOver + nextChar)) // current substring already in dict
|
||||
(dict, res, leftOver+nextChar)
|
||||
else if (dict.size < 4096) // add to dictionary
|
||||
(dict + ((leftOver+nextChar, dict.size+1)), dict(leftOver) :: res, ""+nextChar)
|
||||
else // dictionary is full
|
||||
(dict, dict(leftOver) :: res, ""+nextChar)
|
||||
}
|
||||
if (remain.isEmpty) result.reverse else (fullDict(remain) :: result).reverse
|
||||
}
|
||||
|
||||
// test
|
||||
compress("TOBEORNOTTOBEORTOBEORNOT")
|
||||
Loading…
Add table
Add a link
Reference in a new issue