Update 'sk1/README.md'
This commit is contained in:
parent
48c03ecf41
commit
4814d4cb07
@ -1,55 +1,73 @@
|
|||||||
# Zadanie
|
## Zadanie
|
||||||
|
|
||||||
Naprogramuj nástroj na kompresiu a dekompresiu. Na kompresiu použite jeden alebo viac kompresných algoritmov: Huffmanovo kódovanie, LZ77, LZ78, Run Length kódovanie alebo iný.
|
Virtuálny stroj programovacieho jazyka TUKAFUK sa skladá z dvoch pások. Na jednej páske je napísaný program. Po programovej páske beží programová hlava PH a číta inštrukcie zľava doprava. Stroj má k dispozícii aj dátovú pásku s osobitnou hlavou DH.
|
||||||
Meno vstupného a výstupného súboru načítajte ako argument príkazového riadka. V zadaní by mali byť implementované tieto dve funkcie:
|
|
||||||
|
Príklad počiatočného stavu virtuálneho stroja TUKAFUK:
|
||||||
|
|
||||||
|
```
|
||||||
|
PH
|
||||||
|
|
|
||||||
|
v
|
||||||
|
+-----+-----+-----+-----+
|
||||||
|
Program | TUK | INK | DEK | FUK |
|
||||||
|
+-----+-----+-----+-----+
|
||||||
|
|
||||||
|
DH
|
||||||
|
|
|
||||||
|
v
|
||||||
|
+---+---+---+---+
|
||||||
|
Data | 0 | 0 | 0 | 0 |
|
||||||
|
+---+---+---+---+
|
||||||
|
```
|
||||||
|
|
||||||
|
Skladá sa z nasledujúcich symbolov:
|
||||||
|
|
||||||
|
```
|
||||||
|
TUK začiatok programu
|
||||||
|
INK inkrementuj údaj na mieste kde ukazuje DH
|
||||||
|
DEK dekrementuj údaj na mieste kde ukazuje DH
|
||||||
|
BREK posuň hlavu DH do prava o jedno miesto
|
||||||
|
GLEK posuň hlavu DH do ľava o jedno miesto
|
||||||
|
PUK vypíš 1 byte z miesta kde ukazuje hlava DH
|
||||||
|
KUK načítaj 1 byte na miesto je ukazuje hlava DH
|
||||||
|
[ ak je hlava DH nula, posuň PH na zodpovedajúcu značku ]. Inak pokračj ďalej.
|
||||||
|
] ak hlava nie je nula, pokračuj s PH na zodpovedajúvej značke [. Inak pokračuj ďalej.
|
||||||
|
FUK koniec programu
|
||||||
|
iný znak: odeľuje príkazy alebo slúži ako komentár.
|
||||||
|
```
|
||||||
|
|
||||||
|
Vytvorte interpret jazyka TUKAFUK. Program by mal implementovať funkciu:
|
||||||
|
|
||||||
```C
|
```C
|
||||||
/**
|
void run_tukafuk(const char* code);
|
||||||
* Skomprimuje súbor in a zapíše do súboru out.
|
|
||||||
* @arg in smerník na otvorený vstupný súbor (na čítanie)
|
|
||||||
* @arg out smerník na otvorený výstupný súbor (na zápis)
|
|
||||||
* @return počet bajtov skomprimovaného súboru
|
|
||||||
*/
|
|
||||||
int compress(FILE* in, FILE* out);
|
|
||||||
/**
|
|
||||||
* Dekomprimuje súbor in a zapíše do súboru out.
|
|
||||||
* @arg in smerník na otvorený vstupný súbor (na čítanie)
|
|
||||||
* @arg out smerník na otvorený výstupný súbor (na zápis)
|
|
||||||
* @return počet bajtov dekomprimovaného súboru
|
|
||||||
*/
|
|
||||||
void decompress(FILE* in, FILE* out);
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Kompresor a dekompresor by mal byť schopný pracovať s ľubovoľným binárnym súborom do 10 MB. Súbor by mal byť po skomprimovaní menší minimálne o 10 percent a po dekomprimovaní by mal byť zhodný s pôvodným súborom. Pri práci s binárnymi súbormi môžete využiť funkcie fopen(), fread() a fwrite().
|
Funkcia preloží vstupný program (zistí adresy skokov) a spustí ho. Preklad programu znamená identifikáciu inštrukcií a zistenie adries pre skok programovej hlavy PH. Pri implementácii zistenia adries PH v programe pre inštrukcie [ a ]. Funkcie getchar() a putchar() použite pre implementáciu inštrukcií PUK a KUK . Pre implementáciu dátovej pásky použite pole znakov, pre implementáciu programovej pásky použite pole spracovaných inštrukcií.
|
||||||
|
|
||||||
Na otestovanie kompresora a dekompresora použite súbory z Cantebury corpus.
|
Vytvorte program v jazyku TUKAFUK na výpis celého Vášho mena.
|
||||||
|
|
||||||
# Stručný opis funkčnosti
|
## Stručný opis funkčnosti
|
||||||
|
|
||||||
Musíme vytvoriť program, ktorý dokáže komprimovať a dekomprimovať súbory bez straty akýchkoľvek údajov
|
Musíme navrhnúť jednoduchý programovací jazyk podobný brainfucku. Načíta zdrojový súbor s príkazmi a potom vykoná rôzne operácie s poľom údajov na základe príkazov, ktoré prečítal
|
||||||
|
|
||||||
# Stručný opis riešenia
|
## Stručný opis riešenia
|
||||||
|
|
||||||
Program používa na kompresiu súborov algoritmus stratovej kompresie dát LZ78. Kombinácie písmen kombinácie a index tejto kombinácie dynamicky uloží do stromu a potom zapíše iba index do súboru.
|
Program číta vstupy slovo po slove (oddelené medzerou) a ak je načítaná slová jednou z funkcií, potom sa zapíše do špeciálneho poľa, ktoré tieto funkcie ukladá. Potom sa operácia zavolá na pole s funkciami, ktoré potom spustí samotnú akciu funkcie.
|
||||||
|
|
||||||
# Podmienky za ktorých funguje
|
## Podmienky za ktorých funguje
|
||||||
|
|
||||||
Program dokáže skutočne komprimovať súbory s dobrým opakovaním podobných bajtových sekvencií. Funguje zle s malými súbormi a so súbormi s veľmi rozdielnymi bajtovými sekvenciami
|
Existuje neidentifikovaný dôvod, prečo program nikdy neopustí slučku hľadajúcu TUK, ak prvý riadok súboru nie je príkaz TUK alebo prázdny riadok
|
||||||
|
|
||||||
# Návod na použitie
|
## Používateľská príručka
|
||||||
|
|
||||||
- Skompilujte program
|
Zostavte pomocou:
|
||||||
|
|
||||||
```bash
|
```
|
||||||
make all
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
- spustiť program
|
Spustiť pomocou
|
||||||
|
|
||||||
```bash
|
|
||||||
./program c vstupný súbor vystupný súbor
|
|
||||||
./program d vstupný súbor vystupný súbor
|
|
||||||
```
|
```
|
||||||
|
./program source_file
|
||||||
použite c na zakódovanie súboru
|
```
|
||||||
použite d na dekódovanie súboru
|
|
||||||
|
Loading…
Reference in New Issue
Block a user