Fișierul intrare/ieșire | lsgrep.in, lsgrep.out | Sursă | Marele Premiu (PACO) |
---|---|---|---|
Autor | Vlad Sănduleac | Adăugată de | Sanduleac Vlad • StelarCF |
Timp de execuție pe test | 1 sec | Limită de memorie | 1024 KB |
Scorul tău | N/A | Dificultate |
Vezi soluțiile trimise | Statistici
Lsgrep
Iulică și-a cumpărat un nou laptop. La sugestia ta, și-a instalat pe el Debian Wheezy, un sistem de operare Linux. Folosind prima oară acest sistem de operare, el a șters din greșeală ls, cd și grep.
Iulică și-a luat laptop-ul cu el în excursie, dar sistemul grafic X nu mai funcționează și tu trebuie să îl repari. Pentru aceasta trebuie să scrii un program care să înlocuiască comenzile pierdute.
Cerință
Programul tău va primi structura directoarelor și a fișierelor. Numele acestora nu vor conține caracterele “ “, “.”, “|”,”^”,”$”, “[” și “]”. Înaintea fiecărui nume se poate afla un număr de caractere “>”, care reprezintă nivelul lor. Un director A aflat pe un nivel x urmat de un grup B de directoare și fișiere (neîntrerupt de directoare/fișiere aflate pe nivele <=x), aflate pe nivelul x+1 reprezintă faptul că directoarele și fișierele din grupul B se află în directorul A.
Toate directoarele de pe nivelul 0 se află într-un director special numit “home”, dar scris “~/”
După aceea va primi un număr de comenzi, care vor începe cu caracterul $ urmat de un spațiu. Comenzile pot fi următoarele:
ls – listează subdirectoarele
cd – schimbă directorul de lucru în cel specificat ca argument
grep – caută într-o listă și listează rezultatele
Directorul de lucru este directorul curent. La început, el este în folderul home.
grep folosește un șir de caractere pentru căutare, în cazul nostru un subset al regex. Astfel, caracterul “.” va fi un “wild-card”, adică va găsi corect orice caracter pus în locul lui; caracterele “^” și “$” reprezintă indicatori de poziție, adică începutul și respectiv, sfârșitul numelui; în lipsa indicatorilor de poziție secvența va fi afișată oriunde în ea se află secvența de caractere. Șirul de identificare va fi încadrat între ghilimele.
ls poate primi opțiunea -r, care îl va determina să afișeze numele tuturor subdirectoarelor și fișierelor din directorul de lucru, inclusiv cele care se află într-un alt subdirector (De exemplu, dacă avem directorul B în A și C în B, iar directorul de lucru este A, atunci ls -r va scrie “B” și “C”, pe linii separate.
cd schimbă directorul de lucru. Acesta acceptă un “drum”, unde subdirectoarele sunt separate prin /. Dacă avem, de exemplu, A/B, asta înseamnă directorul B din A. De asemenea, A/B/C/D înseamnă directorul D din C din B din A. Dacă șirul începe cu ~/, atunci ne ducem pe un drum absolut – adică începând din directorul home. Dacă aceste două caractere lipsesc, atunci drumul este relativ – adică începând din directorul de lucru. De asemenea, se poate folosi “..” semnificând că mutăm directorul de lucru în directorul părinte.
Comenzile pot fi înlănțuite cu un caracter “|”. Rezultatele primei comenzi devin argumente pentru comanda următoare.
Astfel putem transmite rezultatul comenzii ls comenzii grep pentru a rafina căutarea. De exemplu,
$ ls | grep “^Hello” va returna toate subdirectoarele care încep cu cuvântul “Hello”.
Date de intrare
Fișierul de intrare lsgrep.in începe cu directoarele și fișierele listate câte unul pe linie, formatate precum mai sus. După aceea urmează o listă de comenzi.
Date de ieșire
În fișierul de ieșire lsgrep.out se vor afișa rezultatele comenzilor citite, separate prin linii albe.
Restricții
- Toate testele vor folosi comanda cd
- 20% din teste vor folosi doar comanda ls fără opțiunea -r
- 30% din teste vor folosi doar comanda ls, cu sau fără opțiunea -r
- 50% din teste nu vor folosi, în cadrul comenzii grep, caractere speciale ( “^”, “.”, “$” )
- Vor fi maxim 1000 de directoare și 500 de comenzi
- Fiecare nume de director va avea maxim 255 de caractere
- Fiecare director va fi pe o adâncime de maxim 100 (maxim 100 de caractere ‘>’ la începutul liniilor)
- Timp de execuție pe test = 0.5 secunde
- Memorie disponibilă = 2 MB / 2MB
- Comanda cd NU afișează text.
Exemplu
lsgrep.in | lsgrep.out |
---|---|
usr >home >>homespace >>>desktop >>>helper >>derringer >>>games >>>>steam >>>>>Magico >>>>>>map >>>>>>exe >>>>>EuropaUniversalis4 >>>>>>history >>>>>>map >>>>>>common >>>nothere >>>yarp system >util >>lsgrepandcd >>>nofiles >>gcc >>g++ >xgraphicssystem >>source >>binaries >>gource >>orrel $ cd usr $ cd home $ cd derringer $ ls $ ls -r $ ls | grep "a" $ ls -r | grep "a" $ cd games $ ls |
games nothere yarp games steam Magico map exe EuropaUniversalis4 history map common nothere yarp games yarp games steam Magico map EuropaUniversalis4 map yarp steam |