using System;
namespace MyNameSpace
{
class Stack
{
private Fragment[] _stack;
private int top = -1;
private int length;
public Stack(int length)
{
this._stack = new Fragment[length];
this.length = length;
}
public void Push(Fragment value)
{
if (top == length - 1)
{
throw new InvalidOperationException("stack is full");
}
top++;
this._stack[top] = value;
}
public Fragment Pop()
{
if (top == -1)
{
throw new InvalidOperationException("Stack is empty");
}
var value = this._stack[top];
top--;
return value;
}
public Fragment Top()
{
if (top == -1)
{
throw new InvalidOperationException("Stack is empty");
}
return this._stack[top];
}
public void PrintStack()
{
for (int i = 0; i <= top; i++)
{
Console.Write("{0} ", this._stack[i]);
}
}
public bool IsEmpty()
{
return top == -1;
}
}
class Fragment
{
public string value;
public int level;
public bool hasImageFile = false;
private string _path;
public Fragment(string value, int level)
{
this.level = level;
this.value = value.Trim();
}
public string getAbsolutePath()
{
return this._path;
}
public void setAbsolutePath(string parentPath)
{
this._path = string.Concat(parentPath, "/", this.value);
}
public bool isDirectory()
{
return !this.value.Contains(".");
}
public bool isImageFile()
{
foreach (var ext in imageFileExtensions)
{
if (this.value.EndsWith(ext))
{
return true;
}
}
return false;
}
private static string[] imageFileExtensions = { ".jpeg", ".png", ".gif" };
}
class Program
{
static void Main(string[] args)
{
string str = "dir1\n dir11\n dir12\n picture.jpeg\n dir 121\n file1.txt\ndir2\n file2.gif";
Console.WriteLine(getLengthOfPathContainintImageFiles(str));
Console.Read();
}
private static int getLengthOfPathContainintImageFiles(string str)
{
int length = 0;
string[] paths = getListOfPaths(str);
Stack stack = new Stack(paths.Length);
int i = 0;
while(i < paths.Length)
{
Fragment fragment = new Fragment(paths[i], getLevel(paths[i]));
if (!stack.IsEmpty() && stack.Top().level >= fragment.level)
{
stack.Pop();
continue;
}
if (stack.IsEmpty())
{
fragment.setAbsolutePath("");
stack.Push(fragment);
i++;
continue;
}
if (fragment.isDirectory()) {
var parentPath = stack.IsEmpty() ? "" : stack.Top().getAbsolutePath();
fragment.setAbsolutePath(parentPath);
stack.Push(fragment);
i++;
continue;
}
if (stack.Top().hasImageFile == false && fragment.isImageFile()) {
length += stack.Top().getAbsolutePath().Length;
stack.Top().hasImageFile = true;
}
i++;
}
return length;
}
private static int getLevel(string str)
{
int indentationCount = 0;
for (int i = 0; i < str.Length; i++)
{
if (str[i] == ' ')
{
indentationCount++;
}
else
{
break;
}
}
return indentationCount;
}
private static string[] getListOfPaths(string str)
{
return str.Split('\n');
}
}
}