Advertisement
Guest User

arc

a guest
Dec 10th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5.  
  6. int bin (int num) {
  7.     int bin = 0, k = 1;
  8.  
  9.     while (num)
  10.     {
  11.         bin += (num % 2) * k;
  12.         k *= 10;
  13.         num /= 2;
  14.     }
  15.  
  16.     return bin;
  17. }
  18.  
  19. int num (long long a) {
  20.     long long p = 0;
  21.     while (a > 0) {
  22.         a /= 10;
  23.         p++;
  24.     }
  25.     return p;
  26. }
  27.  
  28. void range (int uniquesymbol, int z, long long *mas) {
  29.     while (uniquesymbol >= z) {
  30.         long long min = 2000000000000;
  31.         for (int i = 0; i < uniquesymbol - 1; i++) {
  32.             if (mas[i] + mas[i + 1] < min) {
  33.                 min = mas[i] + mas[i + 1];
  34.             }
  35.         }
  36.         for (int i = 0; i < uniquesymbol - 1; i++) {
  37.             if (mas[i] + mas[i + 1] == min) {
  38.                 mas[i] = mas[i] + mas[i + 1];
  39.                 for (int k = i + 1; k < uniquesymbol - 1; k++) {
  40.                     mas[k] = mas[k + 1];
  41.                 }
  42.                 break;
  43.             }
  44.         }
  45.         uniquesymbol--;
  46.     }
  47. }
  48.  
  49. struct file
  50. {
  51.     int byte[37500];
  52. };
  53.  
  54. struct filearc
  55. {
  56.     int bit[300000];
  57. };
  58.  
  59. int symbols = 0, uniquesymbol = 0, tmp = 0;
  60.  
  61. int compare (const void * a, const void * b) {
  62.     return(*(int*)b - *(int*)a);
  63. }
  64.  
  65. int main(int argc, char* argv[]) {
  66.     FILE *f;
  67.  
  68.     tmp = 0;
  69.  
  70.     struct file file;
  71.     struct filearc filearc;
  72.  
  73.     char create[] = "--create";
  74.     if (!strcmp(argv[3], create)) {
  75.         for (int i = 4; i < argc; i++) {
  76.             if ((f = fopen(argv[i], "rb")) == NULL)
  77.                 return -1;
  78.  
  79.             for (int j = symbols; (file.byte[j] = getc(f)) != EOF; j++) {
  80.                 symbols = j + 2;
  81.             }
  82.             fclose(f);
  83.         }
  84.         int a[256] = {};
  85.         for (int j = 0; j < symbols; j++) {
  86.             a[file.byte[j]]++;
  87.         }
  88.         if ((f = fopen(argv[2], "wb")) == NULL)
  89.             return -1;
  90.         for (int i = 0; i < 256; i++)
  91.             if (a[i] != 0) {
  92.                 uniquesymbol++;
  93.             }
  94.         symbols = symbols - argc + 4;
  95.         fprintf(f, "%d %d ", symbols, uniquesymbol);
  96.         int mas[uniquesymbol];
  97.         for (int i = 0; i < uniquesymbol; i++) {
  98.             for (int j = tmp; j < 256; j++) {
  99.                 if (a[j] != 0) {
  100.                     mas[i] = a[j];
  101.                     tmp = j + 1;
  102.                     break;
  103.                 }
  104.             }
  105.         }
  106.         qsort(mas, uniquesymbol, 4, compare);
  107.        long long mas2[uniquesymbol], mas1[uniquesymbol];
  108.         long long mas3[256] = {};
  109.         long long mas4[uniquesymbol];
  110.         for (int i = 0; i < uniquesymbol; i++)
  111.             mas3[i] = 1;
  112.         for (int i = 0; i < uniquesymbol; i++) {
  113.             mas1[i] = mas[i];
  114.             mas2[i] = mas[i];
  115.         }
  116.         long long s = 0, ss = 0;
  117.         for (int z = 1; z < uniquesymbol; z++) {
  118.             range(uniquesymbol, z + 1, mas1);
  119.             range(uniquesymbol, z + 2, mas2);
  120.             for (int i = 0; i < z; i++) {
  121.                 if (mas1[i] != mas2[i]) {
  122.                     s = 0;
  123.                     ss = 0;
  124.                     for (int j = 0; j < i; j++) {
  125.                         s += mas1[j];
  126.                     }
  127.                     tmp = 0;
  128.                     for (int j = 0; s != ss; j++) {
  129.                         ss += mas[j];
  130.                         tmp = j + 1;
  131.                     }
  132.                     ss = 0;
  133.                     int start, end;
  134.                     start = tmp;
  135.                     for (int j = tmp; ss != mas2[i]; j++) {
  136.                         ss += mas[j];
  137.                         tmp = j + 1;
  138.                     }
  139.                     end = tmp;
  140.                     for (int j = start; j < end; j++) {
  141.                         mas3[j] = mas3[j] * 10;
  142.                     }
  143.                     start = end;
  144.                     ss = 0;
  145.                     for (int j = tmp; ss != mas2[i + 1]; j++) {
  146.                         ss += mas[j];
  147.                         tmp = j + 1;
  148.                     }
  149.                     end = tmp;
  150.                     for (int j = start; j < end; j++) {
  151.                         mas3[j] = mas3[j] * 10 + 1;
  152.                     }
  153.                     for (int j = 0; j < uniquesymbol; j++) {
  154.                         mas1[j] = mas[j];
  155.                         mas2[j] = mas[j];
  156.                     }
  157.                 }
  158.             }
  159.         }
  160.         tmp = 0;
  161.         int l;
  162.         for (int i = 0; i < uniquesymbol; i++) {
  163.             for (int j = 0; j < 256; j++) {
  164.                 bool t = true;
  165.                 if (a[j] == mas[i]) {
  166.                     for (int y = 0; y < i; y++) if (j == mas4[y]) t = false;
  167.                     if (t) {
  168.                         mas4[i] = j;
  169.                         fprintf(f, "%d ", bin(j));
  170.                         l = num(mas3[i]) - 1;
  171.                         long long m = 10000000000000000;
  172.                         for (int z = 0; z < 16 - l; z++) {
  173.                             m /= 10;
  174.                         }
  175.                         for (int z = 0; z < l; z++) {
  176.                             m /= 10;
  177.                             fprintf(f, "%lld", mas3[i] / m % 10);
  178.                         }
  179.                         fprintf(f, " ");
  180.                         break;
  181.                     }
  182.                 }
  183.             }
  184.         }
  185.         s = 0;
  186.         int y = 0;
  187.         fprintf(f, "%d ", argc - 4);
  188.         for (int i = 4; i < argc; i++) {
  189.             y = 0;
  190.             fprintf(f, "%s ", argv[i]);
  191.             for (int j = tmp; file.byte[j] != EOF; j++) {
  192.                 for (int z = 0; z < uniquesymbol; z++) {
  193.                     if (file.byte[j] == mas4[z]) {
  194.                         l = num(mas3[z]) - 1;
  195.                         long long m = 10000000000000000;
  196.                         for (int x = 0; x < 16 - l; x++) {
  197.                             m /= 10;
  198.                         }
  199.                         for (int x = 0; x < l; x++) {
  200.                             m /= 10;
  201.                             filearc.bit[s] = mas3[z] / m % 10;
  202.                             s++;
  203.                             y++;
  204.                         }
  205.                     }
  206.                 }
  207.                 tmp = j;
  208.             }
  209.             fprintf(f, "%d ", y);
  210.             tmp += 2;
  211.         }
  212.         fprintf(f, "%d ", s);
  213.         int output;
  214.         for (int j = 0; j < s / 8 + 1; j++) {
  215.             output = 128 * filearc.bit[j * 8] + 64 * filearc.bit[j * 8 + 1] + 32 * filearc.bit[j * 8 + 2] + 16 * filearc.bit[j * 8 + 3] + 8 * filearc.bit[j * 8 + 4] + 4 * filearc.bit[j * 8 + 5] + 2 * filearc.bit[j * 8 + 6] + filearc.bit[j * 8 + 7];
  216.             fwrite(&output, 1, 1, f);
  217.         }
  218.         fclose(f);
  219.     }
  220.     char extract[] = "--extract";
  221.     if (!strcmp(argv[3], extract)) {
  222.         if ((f = fopen(argv[2], "rb")) == NULL)
  223.             return -1;
  224.         char number[16] = {32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32};
  225.         long long number1[16] = {};
  226.         long long number2[16] = {};
  227.         uniquesymbol = 0;
  228.         for (int j = 0; (number[j] = getc(f)) != 32; j++);
  229.         for (int j = 0; (number[j] = getc(f)) != 32; j++);
  230.         for (int j = 0; j < 16; j++)
  231.             if (number[j] != 32) {
  232.                 uniquesymbol = uniquesymbol * 10 + number[j] - 48;
  233.             } else break;
  234.         int k = 1;
  235.         long long mas3[256] = {};
  236.         long long mas[256][16] = {};
  237.  
  238.         for (int i = 0; i < uniquesymbol; i++) {
  239.             for (int j = 0; (number1[j] = getc(f)) != 32; j++) tmp = j;
  240.             for (int j = tmp; j >= 0; j--) {
  241.                 mas3[i] = mas3[i] + k * (number1[j] - 48);
  242.                 k *= 2;
  243.             }
  244.             for (int j = 0; (number2[j] = getc(f)) != 32; j++) tmp = j;
  245.             for (int j = tmp; j >= 0; j--) {
  246.                 mas[i][j] = number2[j];
  247.             }
  248.             k = 1;
  249.         }
  250.         int filein, empty;
  251.         filein = getc(f);
  252.         filein -= 48;
  253.         empty = getc(f);
  254.         char size[16];
  255.         int filesize[16] = {};
  256.         char numm[10][16];
  257.         for (int i = 0; i < filein; i++) {
  258.             for (int j = 0; (number[j] = getc(f)) != 32; j++) tmp = j + 1;
  259.             for (int j = 0; j < tmp; j++)
  260.                 numm[i][j] = number[j];
  261.             for (int j = 0; (size[j] = getc(f)) != 32; j++);
  262.             for (int j = 0; j < 8; j++)
  263.                 if (size[j] != 32) {
  264.                     filesize[i] = filesize[i] * 10 + size[j] - 48;
  265.                 } else break;
  266.         }
  267.         char bytes[10];
  268.         int sizebits = 0;
  269.         for (int j = 0; (bytes[j] = getc(f)) != 32; j++);
  270.         for (int j = 0; j < 16; j++)
  271.             if (bytes[j] != 32) {
  272.                 sizebits = sizebits * 10 + bytes[j] - 48;
  273.             } else break;
  274.         for (int i = 0; i < sizebits / 8 + 1; i++) {
  275.             fread(&file.byte[i], 1, 1, f);
  276.         }
  277.         fclose(f);
  278.         for (int i = 0; i < sizebits / 8 + 1; i++) {
  279.             filearc.bit[i * 8] = bin(file.byte[i]) / 10000000;
  280.             filearc.bit[i * 8 + 1] = bin(file.byte[i]) / 1000000 % 10;
  281.             filearc.bit[i * 8 + 2] = bin(file.byte[i]) / 100000 % 10;
  282.             filearc.bit[i * 8 + 3] = bin(file.byte[i]) / 10000 % 10;
  283.             filearc.bit[i * 8 + 4] = bin(file.byte[i]) / 1000 % 10;
  284.             filearc.bit[i * 8 + 5] = bin(file.byte[i]) / 100 % 10;
  285.             filearc.bit[i * 8 + 6] = bin(file.byte[i]) / 10 % 10;
  286.             filearc.bit[i * 8 + 7] = bin(file.byte[i]) % 10;
  287.         }
  288.         tmp = 0;
  289.         for (int i = 0; i < filein - 1; i++) {
  290.             filesize[i + 1] += filesize[i];
  291.         }
  292.         bool iftrue = true;
  293.         for (int i = 0; i < filein; i++) {
  294.             char *str;
  295.             str = strtok(numm[i], " ");
  296.             if ((f = fopen(str, "wb")) == NULL)
  297.                 return -1;
  298.             for (int z = tmp; z < filesize[i]; z++) {
  299.                 for (int j = 0; j < 256; j++) {
  300.                     for (int p = 0; p < 16 && (mas[j][p] != 0); p++) {
  301.                         if ((mas[j][p] - 48) == filearc.bit[z + p]) {
  302.                             iftrue *= 1;
  303.                         } else {
  304.                             iftrue = false;
  305.                         }
  306.                     }
  307.                     if (iftrue) {
  308.                         fprintf(f, "%c", mas3[j]);
  309.                         for (int l = 0; l < 16; l++) {
  310.                             if (mas[j][l] != 0)
  311.                                 z++;
  312.                         }
  313.                         j = 256;
  314.                     }
  315.                     iftrue = true;
  316.                 }
  317.                 z--;
  318.                 tmp = filesize[i];
  319.             }
  320.             fclose(f);
  321.         }
  322.     }
  323. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement