Adds some of the code I generated while studying for a role transfer at Google using the fantastic resource, InterviewCake.com. This work predates the mono-repo. I should think of ways to DRY up this code and the code in crack_the_coding_interview, but I'm afraid I'm creating unnecessary work for myself that way.
		
			
				
	
	
		
			48 lines
		
	
	
	
		
			999 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
	
		
			999 B
		
	
	
	
		
			Python
		
	
	
	
	
	
from collections import deque
 | 
						|
from heapq import heappush, heappop
 | 
						|
from fixtures import weighted_graph
 | 
						|
 | 
						|
 | 
						|
def put(t, x, xs):
 | 
						|
    if t == 'stack':
 | 
						|
        return xs.append(x)
 | 
						|
    if t == 'queue':
 | 
						|
        return xs.append(x)
 | 
						|
    if t == 'priority':
 | 
						|
        return heappush(xs, x)
 | 
						|
 | 
						|
 | 
						|
def pop(t, xs):
 | 
						|
    if t == 'stack':
 | 
						|
        return xs.pop()
 | 
						|
    if t == 'queue':
 | 
						|
        return xs.popleft()
 | 
						|
    if t == 'priority':
 | 
						|
        return heappop(xs)
 | 
						|
 | 
						|
 | 
						|
# shortest_path :: Vertex -> Vertex -> Graph -> [Vertex]
 | 
						|
def shortest_path(a, b, g):
 | 
						|
    """Returns the shortest path from vertex a to vertex b in graph g."""
 | 
						|
    t = 'priority'
 | 
						|
    xs = []
 | 
						|
    seen = set()
 | 
						|
    # Map(Weight, [Vertex])
 | 
						|
    m = {}
 | 
						|
 | 
						|
    put(t, (0, [a], a), xs)
 | 
						|
 | 
						|
    while xs:
 | 
						|
        w0, path, v = pop(t, xs)
 | 
						|
 | 
						|
        seen.add(v)
 | 
						|
        if v == b:
 | 
						|
            m[w0] = path
 | 
						|
        for w1, x in g.get(v):
 | 
						|
            if x not in seen:
 | 
						|
                put(t, (w0 + w1, path + [x], x), xs)
 | 
						|
 | 
						|
    return m
 | 
						|
 | 
						|
 | 
						|
print(shortest_path('a', 'f', graph_a))
 |