-
Notifications
You must be signed in to change notification settings - Fork 39
/
solution_17.py
100 lines (72 loc) · 3.42 KB
/
solution_17.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
def coding_problem_17(path_str):
r"""
Suppose we represent our file system by a string in the following manner:
The string "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" represents:
dir
subdir1
subdir2
file.ext
The directory dir contains an empty sub-directory subdir1 and a sub-directory subdir2 containing a file file.ext.
The string "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" represents:
dir
subdir1
file1.ext
subsubdir1
subdir2
subsubdir2
file2.ext
The directory dir contains two sub-directories subdir1 and subdir2. subdir1 contains a file file1.ext and an empty
second-level sub-directory subsubdir1. subdir2 contains a second-level sub-directory subsubdir2 containing a
file file2.ext.
We are interested in finding the longest (number of characters) absolute path to a file within our file system.
For example, in the second example above, the longest absolute path is "dir/subdir2/subsubdir2/file2.ext", and its
length is 32 (not including the double quotes).
Given a string representing the file system in the above format, return the length of the longest absolute path to
a file in the abstracted file system. If there is no file in the system, return 0.
The name of a file contains at least a period and an extension.
The name of a directory or sub-directory will not contain a period.
Examples:
>>> coding_problem_17('file1.ext')
9
>>> coding_problem_17('dir\n\tfile1.ext')
13
>>> coding_problem_17('0\n\t23.567\n12345.789')
9
>>> coding_problem_17('dir\n\t\tfile1.ext')
Traceback (most recent call last):
...
RuntimeError: Malformed path string: nesting more than one level at a time.
>>> coding_problem_17('dir\n\tfile1.ext\n\t\tchild_of_a_file.ext')
Traceback (most recent call last):
...
RuntimeError: Malformed path string: a file cannot contain something else.
>>> coding_problem_17('dir\n\tfile1.ext\n\tsubdir\n\t\tsubsubdir\n\t\t\ttsubsubsubdir')
13
>>> coding_problem_17('dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext')
32
>>> coding_problem_17('dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext' +
... '\ndir2\n\tsubdir1\n\tsubdir2\n\t\tsubsubdir1\n\t\t\tsubsubsubdir3\n\t\t\t\tfile3.ext')
47
"""
if not path_str:
return 0
dirs, max_len = [None], 0
for token in path_str.split('\n'):
tabs = 0
while token[tabs] == '\t':
tabs += 1
if tabs > len(dirs):
raise RuntimeError('Malformed path string: nesting more than one level at a time.')
if tabs == len(dirs): # go one level deeper
if '.' in dirs[-1]: # container is a file
raise RuntimeError('Malformed path string: a file cannot contain something else.')
dirs.append(None) # make room for the new path item
else: # tabs < level, ascend
dirs = dirs[:tabs + 1]
dirs[-1] = str.strip(token)
if '.' in dirs[-1]: # path ends with a file
max_len = max(max_len, len('/'.join(dirs)))
return max_len
if __name__ == '__main__':
import doctest
doctest.testmod(verbose=True)