Fişierul intrare/ieşire:lsgrep.in, lsgrep.outSursăMarele Premiu (PACO)
AutorVlad SanduleacAdăugată deStelarCFSanduleac Vlad StelarCF
Timp execuţie pe test1 secLimită de memorie1024 kbytes
Scorul tăuN/ADificultatenormalnormalnormalnormalnormal

Vezi solutiile trimise

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.inlsgrep.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
Trebuie sa te autentifici pentru a trimite solutii. Click aici