From 7f8e052305d6c905ba40914469e13537a31c8471 Mon Sep 17 00:00:00 2001 From: ftrrtf Date: Tue, 27 May 2014 22:46:48 +0300 Subject: [PATCH 1/2] First task --- task1/desc.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 task1/desc.md diff --git a/task1/desc.md b/task1/desc.md new file mode 100644 index 0000000..06311e9 --- /dev/null +++ b/task1/desc.md @@ -0,0 +1,61 @@ +# Команды cd и pwd + +Вася пишет оболочку для своей операционной системы. В ней непременно должны присутствовать команды для работы с директориями. Для начала он решил обойтись всего двумя командами: cd (смена текущей директории) и pwd (вывод на экран текущей директории). + +Директории в операционной системе Васи образуют традиционную иерархическую древовидную структуру. Существует единственная корневая директория, обозначаемая символом слеш «/». У всех остальных директорий есть названия — непустые строки из строчных латинских букв. У каждой некорневой директории есть родительская директория — та, внутри которой она расположена. Эта директория обозначается как «..». + +Команда cd принимает один параметр, являющийся путем в файловой системе. Команда меняет текущую директорию на директорию, расположенную по заданному пути. Путь состоит из названий директорий, разделённых слешами. В качестве названия директории может использоваться «..», что обозначает переход в родительскую директорию. «..» может встретиться вместо названия директории в любом месте пути, возможно, несколько раз. Если путь начинается со слеша, он считается абсолютным путём, то есть директория меняется на указанную, считая от корневой. Если параметр начинается с имени директории (или «..»), он считается относительным путём, то есть директория меняется на указанную, считая от текущей. + +Команда pwd должна выводить абсолютный путь до текущей директории. Этот путь не должен содержать «..». + +Изначально текущей директорией является корневая. Все директории, явно упоминаемые или проходимые косвенно внутри одной команды cd, считаются существующими. Гарантируется отсутствие попыток перехода в родительскую директорию корневой директории. + +Входные данные +В входных данных n строк по одной команде в каждой строке. В каждой из этих строк записана либо команда pwd, либо команда cd, после которой идёт отделённый пробелом непустой параметр. + +В параметре команды cd используются только строчные латинские буквы, слеши и точки, не может идти два слеша подряд, точки встречаются только как название родительской псевдо-директории. Параметр команды cd не завершается слешем, кроме случая, когда это единственный символ, указывающий на корневую директорию. Параметр команды имеет длину от 1 до 200 символов включительно. + +Директории в файловой системе могут иметь одинаковые имена. + +Выходные данные +Для каждой команды pwd требуется вывести полный абсолютный путь текущей директории, завершённый слешем. Он должен начинаться со слеша и содержать список директорий в порядке вложенности от корневой до текущей, разделённый слешами. Этот путь не должен содержать точек. + + +## Примеры тестов: + +### Входные данные + +``` +pwd +cd /home/vasya +pwd +cd .. +pwd +cd vasya/../petya +pwd +``` + +### Выходные данные + +``` +/ +/home/vasya/ +/home/ +/home/petya/ +``` + +### Входные данные + +``` +cd /a/b +pwd +cd ../a/b +pwd +``` + +### Выходные данные + +``` +/a/b/ +/a/a/b/ +``` \ No newline at end of file From ea6960e4f001b42f783b9dea955bcf404da783ef Mon Sep 17 00:00:00 2001 From: akhsunna Date: Tue, 3 Jun 2014 20:05:22 +0300 Subject: [PATCH 2/2] Java solution with JUnit tests --- task1/solution/src/cdpwd.java | 77 ++++++++++++++++++++++++++++++ task1/solution/test/cdpwdTest.java | 63 ++++++++++++++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 task1/solution/src/cdpwd.java create mode 100644 task1/solution/test/cdpwdTest.java diff --git a/task1/solution/src/cdpwd.java b/task1/solution/src/cdpwd.java new file mode 100644 index 0000000..f5b5212 --- /dev/null +++ b/task1/solution/src/cdpwd.java @@ -0,0 +1,77 @@ +package cdpwd; +import java.util.*; + +/** + * This class implements work of commands cd and pwd. + * @author Anna + * @version 1.0 + */ +public class cdpwd { + + static ArrayList list; + + /** + * This method implements the command cd. + * @param st string that was broken into tokens - names of folders. + */ + public static void cd(StringTokenizer st){ + while(st.hasMoreTokens()){ + list.add(st.nextToken()); + if(list.get(list.size()-1).equals("..")){ + if(list.size()==2){ + System.out.println("Error"); + list.remove(list.size()-1); + } else { + list.remove(list.size()-1); + list.remove(list.size()-1); + } + } + } + } + + /** + * This method implements the command pwd. + * @return current directory + */ + public static String pwd(){ + String way = ""; + for(String t: list){ + way=way+t+"/"; + } + return way; + } + + /** + * This method determines which command must be executed. + */ + public static void comand(){ + Scanner sc = new Scanner(System.in); + StringTokenizer st = new StringTokenizer(sc.nextLine(), " \t\n\r/"); + String c=st.nextToken(); + if(c.equals("pwd")){ + System.out.println(pwd()); + } + if(c.equals("cd")){ + cd(st); + } + if(c.equals("exit")){ + return; + } + comand(); + } + + /** + * The main (start) method. + * @param args + */ + public static void main(String[] args){ + // TODO Auto-generated method stub + list = new ArrayList(); + list.add(""); + comand(); + } + +} + + + diff --git a/task1/solution/test/cdpwdTest.java b/task1/solution/test/cdpwdTest.java new file mode 100644 index 0000000..3d35333 --- /dev/null +++ b/task1/solution/test/cdpwdTest.java @@ -0,0 +1,63 @@ +package cdpwd; + +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.StringTokenizer; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class cdpwdTest { + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + cdpwd.list = new ArrayList(); + cdpwd.list.add(""); + } + + @Test + public void testOne(){ + StringTokenizer st = new StringTokenizer("cd ..", " \t\n\r/"); + st.nextToken(); + cdpwd.cd(st); + assertEquals("/",cdpwd.pwd()); + } + + @Test + public void testTwo(){ + StringTokenizer st = new StringTokenizer("cd a/b/../c", " \t\n\r/"); + st.nextToken(); + cdpwd.cd(st); + assertEquals("/a/c/",cdpwd.pwd()); + } + + @Test + public void testThree(){ + StringTokenizer st = new StringTokenizer("cd /", " \t\n\r/"); + st.nextToken(); + cdpwd.cd(st); + assertEquals("/a/c/",cdpwd.pwd()); + } + + @Test + public void testList(){ + ArrayList expecteds = new ArrayList(); + expecteds.add(""); expecteds.add("a"); expecteds.add("c"); + assertArrayEquals(expecteds, cdpwd.list); + } + + @Test + public void testNotEmpty(){ + StringTokenizer st = new StringTokenizer("cd ../../../../..", " \t\n\r/"); + st.nextToken(); + cdpwd.cd(st); + assertTrue(cdpwd.list.size()!=0); + } + + private void assertArrayEquals(ArrayList expecteds, + ArrayList list) { + // TODO Auto-generated method stub + } + +}