Unix


Submit solution

Points: 40 (partial)
Time limit: 1.0s
Memory limit: 64M

Author:
Problem type
Allowed languages
Assembly, Awk, C, C++, Java, Perl, Python

DRŽAVNO NATJECANJE 2014. - Prvi dan natjecanja / Srednja škola, I. podskupina (1. i 2. razred) - 1. zadatak

Napišite program koji će simulirati niz naredbi za rad s direktorijima sličnih (ali ne identičnih) onima u UNIX operativnom sustavu.

Za ovu priliku ime direktorija je niz od jednog ili više malih slova engleske abecede.

Naravno, direktoriji mogu sadržavati druge direktorije te tako čine hijerarhiju kao na slici dolje.

Poseban slučaj je takozvani korijenski ili “root” direktorij koji se nalazi na vrhu hijerarhije te nema ime.

Dozvoljeno je da dva različita direktorija imaju isto ime, ali ne u slučaju ako se nalaze u istom direktoriju.

Putanja je niz znakova koji jedinstveno označava pojedini direktorij te se definira na sljedeći način: Ako su D1, D2, …, DN direktoriji te je D1 sadržan u root direktoriju, a svi ostali sadržani u prethodnom direktoriju u nizu (D2 je sadržan u D1, D3 je sadržan u D2 itd.) onda je putanja direktorija DN jednaka ‘/D1/D2/.../DN’.

Putanja root direktorija je samo ‘/’.

Tako je na primjeru na Slici 1 putanja direktorija s imenom ‘pero’ jednaka ‘/usr/pero’, a putanje do dva direktorija s imenom ‘home’ su ‘/usr/marko/home’ i ‘/usr/pero/home’.

Na početku postoji samo root direktorij, koji je postavljen kao trenutni direktorij.

Napišite program koji će čitati naredbe, za svaku naredbu simulirati zadane operacije na direktorijima te ispisati izlaz prema sljedećim pravilima:

  • Naredba: ‘mkdir X’, gdje je X ime direktorija
    • Ukoliko u trenutnom direktoriju već postoji direktorij s imenom X, ispisuje se ‘greska’.
    • Inače se stvara novi direktorij s imenom X u trenutnom direktoriju te ispisuje putanja novog direktorija.
    • Trenutni direktorij se ne mijenja.
  • Naredba: ‘rmdir X’, gdje je X ime direktorija
    • Ukoliko u trenutnom direktoriju ne postoji direktorij s imenom X ispisuje se ‘greska’.
    • Ukoliko X postoji, ali nije prazan tj. ako X sadrži druge direktorije ispisuje se ‘greska’.
    • Inače se direktorij X briše te se ispisuje putanja obrisanog direktorija.
    • Trenutni direktorij se ne mijenja.
  • Naredba: ‘cd X’, gdje je X ime direktorija
    • Ukoliko u trenutnom direktoriju ne postoji direktorij s danim imenom ispisuje se ‘greska’.
    • Trenutni direktorij postaje X te se ispisuje nova putanja trenutnog direktorija.
  • Naredba: ‘cd ..’ ('cd' pa točno jedan znak razmaka, pa dvije točke)
    • Ukoliko je trenutni direktorij korijenski direktorij ispisuje se ‘greska’
    • Inače trenutni direktorij postaje direktorij u kojem je neposredno sadržan stari trenutni direktorij te se ispisuje nova putanja trenutnog direktorija.

Obratite pažnju da je u svim navedenim naredbama X ime direktorija, a ne putanja.

Dakle naredbe poput ‘cd ../foo’, ‘mkdir /a/b' ili ‘rmdir mirko/slavko’ nisu dopuštene u ovom zadatku.

Ulazni podaci

U prvom redu nalazi se prirodan broj N (1 ≤ N ≤ 100), broj naredbi.

U svakom od sljedećih N redova nalazi se po jedna naredba. Svaka naredba sastoji se od malih slova engleske abecede, razmaka i znaka ‘.’ (točka) te će točno odgovarati jednoj od naredbi iz teksta zadatka.

Ime svakog direktorija X u naredbama 'mkdir X', 'rmdir X' i 'cd X' sastojat će se od najviše 10 malih slova engleske abecede.

Izlazni podaci

Potrebno je ispisati N redova, rezultate izvršavanja svake zadane naredbe kako je opisano u tekstu zadatka, onim redoslijedom kojim su zadane u ulazu.

Primjer zadatka

ULaz
6
mkdir a
mkdir a
mkdir b
mkdir c
rmdir d
rmdir b
Izlaz
/a
greska
/b
/c
greska
/b

Ulaz
13
cd ..
mkdir a
mkdir a
cd b
cd a
mkdir b
cd ..
rmdir b
rmdir a
cd a
rmdir b
cd ..
rmdir a
Izlaz
greska
/a
greska
greska
/a
/a/b
/
greska
greska
/a
/a/b
/
/a

Ulaz
29
mkdir usr
mkdir foo
cd foo
mkdir bar
cd ..
cd usr
mkdir marko
mkdir pero
cd marko
mkdir home
cd home
mkdir q
cd ..
cd ..
mkdir pero
cd pero
mkdir home
cd home
mkdir p
mkdir r
mkdir bla
rmdir bla
cd ..
rmdir home
cd home
rmdir p
rmdir r
cd ..
rmdir home
Izalz
/usr
/foo
/foo
/foo/bar
/
/usr
/usr/marko
/usr/pero
/usr/marko
/usr/marko/home
/usr/marko/home
/usr/marko/home/q
/usr/marko
/usr
greska
/usr/pero
/usr/pero/home
/usr/pero/home
/usr/pero/home/p
/usr/pero/home/r
/usr/pero/home/bla
/usr/pero/home/bla
/usr/pero
greska
/usr/pero/home
/usr/pero/home/p
/usr/pero/home/r
/usr/pero
/usr/pero/home

Comments

There are no comments at the moment.