Advertisement
Bu2410

Untitled

Nov 30th, 2015
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. var fs = require('fs');
  2. var text = fs.readFileSync(process.argv[3], 'binary').toString();
  3. if (process.argv[2] === 'encode') {
  4. try {
  5. var result = encode(text);
  6. } catch (err) {
  7. console.log(err.name + err.message);
  8. }
  9. fs.writeFileSync(process.argv[4], result, 'binary');
  10. fs.writeFileSync(process.argv[5], '', 'binary');
  11. }
  12.  
  13. if (process.argv[2] === 'decode') {
  14. try {
  15. var result = decode(text);
  16. } catch (err) {
  17. console.log(err.name + err.message);
  18. }
  19. fs.writeFileSync('out.txt', result, 'binary');
  20. }
  21.  
  22. function encode(text) {
  23. var stat = [];
  24. var count = 0;
  25. for (var i = 0; i < text.length; i++) {
  26. var letter = text.charAt(i);
  27. if (!(letter in stat)) {
  28. stat[letter] = 0;
  29. count++;
  30. }
  31. stat[letter]++;
  32. }
  33. var thCompr = theorCompression(stat, text).toFixed(2);
  34. var arr = sortObjects(count, stat);
  35. var tree = getTree(arr.slice());
  36. var result = {};
  37. for (var i = 0; i < arr.length; i++) {
  38. var currCode = "";
  39. result[arr[i].key] = findCode(arr[i].key, tree, currCode);
  40. createTable(arr[i].key, result[arr[i].key]);
  41. }
  42. console.log(result);
  43. var out = "";
  44. for (var i = 0; i < text.length; i++) {
  45. out += result[text[i]];
  46. }
  47. console.log(out);
  48. var resCompt=(resultinCompression(text, out).toFixed(2));
  49. return out;
  50. }
  51. function decode(text) {
  52. var file = fs.readFileSync('table.txt', 'binary').split("\n");
  53. try {
  54. var codes = tableParse(file);
  55. } catch (err) {
  56. console.log(err.name + err.message);
  57. }
  58. var result = "";
  59. var currCount = 1;
  60. var ispCount = 0;
  61. for (var i = 0; i < text.length; i++) {
  62. var currentCode = text.substr(ispCount, currCount);
  63. if (typeof codes[currentCode] === 'undefined') {
  64. currCount += 1;
  65. } else {
  66. result += codes[currentCode];
  67. ispCount += currCount;
  68. currCount = 1;
  69. }
  70. }
  71. if (ispCount < text.length) {
  72. fs.writeFileSync(process.argv[4], result, 'binary');
  73. throw new Error(": Incorrect input");
  74. }
  75. return result;
  76. }
  77.  
  78. function tableParse(file) {
  79. var codes = {};
  80. for (var i in file) {
  81. var str = file[i];
  82. j = 3;
  83. var code = '';
  84. while (str[j] == '0' || str[j] == '1') {
  85. code += str[j++];
  86. if ((parseInt(str[j]) > 1 || parseInt(str[j - 1]) > 1)) {
  87. throw new Error(": Invalid table");
  88. }
  89. }
  90. codes[code] = str[1];
  91. }
  92. return codes;
  93. }
  94. function sortObjects(count, stat) {
  95. var arr = [];
  96. for (var j = 0; j < count + 1; j++) {
  97. var minVal = 10000;
  98. var minSym = '';
  99. for (var x in stat) {
  100. if (stat[x] < minVal && stat[x] != 0) {
  101. minVal = stat[x];
  102. minSym = x;
  103. }
  104. }
  105. if (minVal != 10000 && minVal > 0) {
  106. arr.push({
  107. key: minSym,
  108. value: minVal
  109. });
  110. }
  111. stat[minSym] = 0;
  112. }
  113. return arr;
  114. }
  115. function findCode(ch, node, currCode) {
  116. if (node.key == ch) {
  117. return currCode;
  118. }
  119. if ((node.child1.key).indexOf(ch, 0) != -1) {
  120. currCode += '0';
  121. return findCode(ch, node.child1, currCode);
  122. } else {
  123. currCode += '1';
  124. return findCode(ch, node.child2, currCode);
  125. }
  126. }
  127.  
  128. function theorCompression(stat, text) {
  129. var entropy = 0;
  130. for (var x in stat) {
  131. var P = stat[x] / (text.length);
  132. entropy -= P * Math.log(P);
  133. }
  134. if (entropy != 0)
  135. return (8/(entropy / Math.log(2) ));
  136. else {
  137. entropy=8;
  138. return (8/entropy);
  139. }
  140. }
  141. function resultinCompression(text, out) {
  142. return (out.length / 8) / text.length;
  143. }
  144.  
  145. function createTable(key, value) {
  146. fs.appendFile('table.txt', ' ' + key + ' ' + value + '\n', 'binary');
  147. }
  148.  
  149. function getTree(letters) {
  150. while (letters.length > 1) {
  151. var child1 = letters[0];
  152. letters.shift();
  153. var child2 = letters[0];
  154. letters.shift();
  155. var tree = {
  156. key: child1.key + child2.key,
  157. value: child2.value + child1.value,
  158. child1: child1,
  159. child2: child2
  160. };
  161. var i = 0;
  162. while ((letters.length > i) && (letters[i].value < tree.value))
  163. i++;
  164. letters.splice(i, 0, tree);
  165. }
  166. return letters[0];
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement