I had a spare fifteen minutes and decided that I should tidy up my monorepo. The work of tidying up is not finished; this is a small step in the right direction. TL;DR - Created a tools directory - Created a scratch directory (see README.md for more information) - Added README.md to third_party - Renamed delete_dotfile_symlinks -> symlinkManager - Packaged symlinkManager as an executable symlink-mgr using buildGo
		
			
				
	
	
		
			63 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import unittest
 | 
						|
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Solution
 | 
						|
################################################################################
 | 
						|
# is_valid :: String -> Boolean
 | 
						|
def is_valid(xs):
 | 
						|
    s = []
 | 
						|
    seeking = {
 | 
						|
        '}': '{',
 | 
						|
        ']': '[',
 | 
						|
        ')': '(',
 | 
						|
    }
 | 
						|
    openers = seeking.values()
 | 
						|
    closers = seeking.keys()
 | 
						|
    for c in xs:
 | 
						|
        if c in openers:
 | 
						|
            s.append(c)
 | 
						|
        elif c in closers:
 | 
						|
            if not s:
 | 
						|
                return False
 | 
						|
            elif s[-1] != seeking.get(c):
 | 
						|
                return False
 | 
						|
            else:
 | 
						|
                s.pop()
 | 
						|
    return len(s) == 0
 | 
						|
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Tests
 | 
						|
################################################################################
 | 
						|
class Test(unittest.TestCase):
 | 
						|
    def test_valid_short_code(self):
 | 
						|
        result = is_valid('()')
 | 
						|
        self.assertTrue(result)
 | 
						|
 | 
						|
    def test_valid_longer_code(self):
 | 
						|
        result = is_valid('([]{[]})[]{{}()}')
 | 
						|
        self.assertTrue(result)
 | 
						|
 | 
						|
    def test_interleaved_openers_and_closers(self):
 | 
						|
        result = is_valid('([)]')
 | 
						|
        self.assertFalse(result)
 | 
						|
 | 
						|
    def test_mismatched_opener_and_closer(self):
 | 
						|
        result = is_valid('([][]}')
 | 
						|
        self.assertFalse(result)
 | 
						|
 | 
						|
    def test_missing_closer(self):
 | 
						|
        result = is_valid('[[]()')
 | 
						|
        self.assertFalse(result)
 | 
						|
 | 
						|
    def test_extra_closer(self):
 | 
						|
        result = is_valid('[[]]())')
 | 
						|
        self.assertFalse(result)
 | 
						|
 | 
						|
    def test_empty_string(self):
 | 
						|
        result = is_valid('')
 | 
						|
        self.assertTrue(result)
 | 
						|
 | 
						|
 | 
						|
unittest.main(verbosity=2)
 |