commit
7fd1b6a704
10 changed files with 298 additions and 0 deletions
@ -0,0 +1,30 @@ |
|||||
|
#! /usr/bin/env python3 |
||||
|
|
||||
|
# breadth first traversal of a binary tree |
||||
|
|
||||
|
from collections import deque |
||||
|
|
||||
|
class Branch: |
||||
|
def __init__(self, v, left, right): |
||||
|
self.v = v |
||||
|
self.left = left |
||||
|
self.right = right |
||||
|
|
||||
|
def bfs(tree, process): |
||||
|
nodes = deque([tree]) |
||||
|
current_node = None |
||||
|
while nodes: |
||||
|
current_nodes = list(nodes) |
||||
|
for node in current_nodes: |
||||
|
current_node = node |
||||
|
process(current_node.v) |
||||
|
nodes.popleft() |
||||
|
if not current_node.left is None: |
||||
|
nodes.appendleft(current_node.left) |
||||
|
if not node.right is None: |
||||
|
nodes.appendleft(current_node.right) |
||||
|
|
||||
|
test = Branch(1, Branch(2, Branch(3, None, None), Branch(4, None, None)), |
||||
|
Branch(5, None, None)) |
||||
|
|
||||
|
bfs(test, print) |
@ -0,0 +1,48 @@ |
|||||
|
#! /usr/bin/env python2 |
||||
|
|
||||
|
from random import randint |
||||
|
from pprint import PrettyPrinter |
||||
|
|
||||
|
# Construct a binary search tree |
||||
|
# Also create a function to search it |
||||
|
|
||||
|
pp = PrettyPrinter(indent=4) |
||||
|
|
||||
|
class Branch: |
||||
|
def __init__(self, left, value, right): |
||||
|
self.value = value |
||||
|
self.left = left |
||||
|
self.right = right |
||||
|
|
||||
|
def __repr__(self): |
||||
|
return "(%s) %s (%s)" % (repr(self.left), self.value, repr(self.right)) |
||||
|
|
||||
|
def split(xs): |
||||
|
l = len(xs) / 2 |
||||
|
return (xs[0:l], xs[l], xs[l+1:]) |
||||
|
|
||||
|
def bst(xs): |
||||
|
if not xs: |
||||
|
return None |
||||
|
left, middle, right = split(xs) |
||||
|
return Branch(bst(left), middle, bst(right)) |
||||
|
|
||||
|
def makeBST(xs): |
||||
|
return bst(sorted(xs)) |
||||
|
|
||||
|
def findBST(tree, x): |
||||
|
if tree is None: |
||||
|
return None |
||||
|
print tree.value |
||||
|
if tree.value == x: |
||||
|
return tree |
||||
|
if x < tree.value: |
||||
|
return findBST(tree.left, x) |
||||
|
else: |
||||
|
return findBST(tree.right, x) |
||||
|
|
||||
|
test = [randint(1,50) for _ in range(20)] |
||||
|
|
||||
|
print test |
||||
|
print "finding %s" % test[4] |
||||
|
print findBST(makeBST(test), test[4]) |
@ -0,0 +1,16 @@ |
|||||
|
#! /usr/bin/env runghc |
||||
|
|
||||
|
-- get the nth fibonnaci number in linear time |
||||
|
|
||||
|
import qualified Data.List as L |
||||
|
|
||||
|
fibs = L.unfoldr |
||||
|
(\(prev, cur) -> Just (prev, (cur, prev+cur))) |
||||
|
(0, 1) |
||||
|
|
||||
|
getNthFib n = fibs !! n |
||||
|
|
||||
|
main = do |
||||
|
print $ getNthFib 1 |
||||
|
print $ getNthFib 7 |
||||
|
print $ getNthFib 100 |
@ -0,0 +1,23 @@ |
|||||
|
#! /usr/bin/env python2 |
||||
|
|
||||
|
# find the intersection of two lists including duplicate values |
||||
|
|
||||
|
from collections import defaultdict |
||||
|
|
||||
|
def frequencies(xs): |
||||
|
freqs = defaultdict(int) |
||||
|
for x in xs: |
||||
|
freqs[x] += 1 |
||||
|
return freqs |
||||
|
|
||||
|
def intersection(fs1, fs2): |
||||
|
xs = [] |
||||
|
for k, v in fs1.iteritems(): |
||||
|
n = min(v, fs2[k]) |
||||
|
xs.extend([k for _ in xrange(n)]) |
||||
|
return xs |
||||
|
|
||||
|
fs1 = frequencies([1,4,2,6,10,4,4]) |
||||
|
fs2 = frequencies([7,4,9,10,20,4,10]) |
||||
|
|
||||
|
print intersection(fs1, fs2) |
@ -0,0 +1,19 @@ |
|||||
|
#! /usr/bin/env python2 |
||||
|
|
||||
|
# check if a word is palindromic without reversing it |
||||
|
|
||||
|
def isPalindrome(word): |
||||
|
end = len(word) |
||||
|
start = 0 |
||||
|
foo = True |
||||
|
while start < end+1: |
||||
|
left = word[start] |
||||
|
right = word[end-1] |
||||
|
if left != right: |
||||
|
foo = False |
||||
|
break |
||||
|
start += 1 |
||||
|
end -= 1 |
||||
|
return foo |
||||
|
|
||||
|
print isPalindrome("wwaabbaawwz") |
@ -0,0 +1,10 @@ |
|||||
|
module Main where |
||||
|
|
||||
|
-- find the rows of pascal's triangle |
||||
|
|
||||
|
choose n 0 = 1 |
||||
|
choose n k = (choose n (k-1)) * (n-k) `div` k |
||||
|
|
||||
|
pascal n = [choose n i | i <- [0..n-1]] |
||||
|
|
||||
|
main = mapM_ print $ map pascal [1..100] |
@ -0,0 +1,14 @@ |
|||||
|
#! /usr/bin/env python2 |
||||
|
|
||||
|
# find the rows of pascal's triangle |
||||
|
|
||||
|
def choose(n, k): |
||||
|
if k == 0: |
||||
|
return 1 |
||||
|
return choose(n, k-1) * (n-k) / k |
||||
|
|
||||
|
def pascal(n): |
||||
|
return [choose(n, i) for i in xrange(0, n)] |
||||
|
|
||||
|
for i in xrange(1, 11): |
||||
|
print pascal(i) |
@ -0,0 +1,37 @@ |
|||||
|
#! /usr/bin/env python2 |
||||
|
|
||||
|
# find all possible permutations of a sequence of phone pad digits (other than 1 and 0) |
||||
|
|
||||
|
from itertools import chain |
||||
|
|
||||
|
mappings = { |
||||
|
2 : "ABC", |
||||
|
3 : "DEF", |
||||
|
4 : "GHI", |
||||
|
5 : "JKL", |
||||
|
6 : "MNO", |
||||
|
7 : "PQRS", |
||||
|
8 : "TUV", |
||||
|
9 : "WXYZ" |
||||
|
} |
||||
|
|
||||
|
def generate(letter, letters): |
||||
|
return [letter + c for c in letters] |
||||
|
|
||||
|
def genWords(one, two): |
||||
|
return list(chain.from_iterable([generate(c, two) for c in one])) |
||||
|
|
||||
|
def genAll(lettersets): |
||||
|
if len(lettersets) == 1: |
||||
|
return lettersets |
||||
|
|
||||
|
first = lettersets[0] |
||||
|
rest = lettersets[1:] |
||||
|
return [genWords(first, ls) for ls in genAll(rest)] |
||||
|
|
||||
|
def numToWords(num): |
||||
|
lettersets = [mappings[int(n)] for n in num] |
||||
|
return genAll(lettersets)[0] |
||||
|
|
||||
|
for num in numToWords("353346"): |
||||
|
print num |
@ -0,0 +1,62 @@ |
|||||
|
#! /usr/bin/env python2 |
||||
|
|
||||
|
# counts the number of regions in a matrix |
||||
|
# vertically and horizontally connected |
||||
|
# e.g. |
||||
|
# [1, 0, 1, 1] |
||||
|
# [0, 1, 0, 0] |
||||
|
# [1, 1, 0, 1] |
||||
|
# has 4 regions |
||||
|
|
||||
|
class Patch(object): |
||||
|
def __init__(self, visited, value): |
||||
|
self.visited = visited |
||||
|
self.value = value |
||||
|
|
||||
|
def __repr__(self): |
||||
|
return "visited = %s, value = %s" % (self.visited, self.value) |
||||
|
|
||||
|
def initialize(region): |
||||
|
for row in region: |
||||
|
yield [Patch(visited=False, value=field) for field in row] |
||||
|
|
||||
|
testregion = list(initialize([ |
||||
|
[True, False, True, True], |
||||
|
[False, True, False, False], |
||||
|
[True, True, False, True] |
||||
|
])) |
||||
|
|
||||
|
columns = len(testregion[0]) |
||||
|
rows = len(testregion) |
||||
|
|
||||
|
def exploreField(region, x, y): |
||||
|
|
||||
|
# check if we've reached the edge of the matrix |
||||
|
if (x < 0 or y < 0): |
||||
|
return True |
||||
|
try: |
||||
|
if region[y][x].visited or not region[y][x].value: |
||||
|
return True |
||||
|
except IndexError: |
||||
|
return True |
||||
|
|
||||
|
region[y][x].visited = True |
||||
|
|
||||
|
exploreField(region, y+1, x) |
||||
|
exploreField(region, y-1, x) |
||||
|
exploreField(region, y, x+1) |
||||
|
exploreField(region, y, x-1) |
||||
|
|
||||
|
count = 0 |
||||
|
|
||||
|
for y, row in enumerate(testregion): |
||||
|
for x, patch in enumerate(row): |
||||
|
|
||||
|
# if a patch is both unvisited and true |
||||
|
# this means exploreField will eliminate it |
||||
|
# so it counts as one region |
||||
|
if not patch.visited and patch.value: |
||||
|
count += 1 |
||||
|
exploreField(testregion, x, y) |
||||
|
|
||||
|
print count |
@ -0,0 +1,39 @@ |
|||||
|
#! /usr/bin/env python3 |
||||
|
|
||||
|
# reverse a linked list |
||||
|
|
||||
|
class LinkedList: |
||||
|
def __init__(self, head, tail): |
||||
|
self.head = head |
||||
|
self.tail = tail |
||||
|
|
||||
|
def __repr__(self): |
||||
|
return "%s%s" % (self.head, "" if self.tail is None else ",%s" % repr(self.tail)) |
||||
|
|
||||
|
def cons(x, xs): |
||||
|
return LinkedList(x, xs) |
||||
|
|
||||
|
xs = cons(1, cons(2, cons(3, cons(4, cons(5, None))))) |
||||
|
|
||||
|
def push(x, xs): |
||||
|
prev = xs.head |
||||
|
xs.head = x |
||||
|
xs.tail = cons(prev, xs.tail) |
||||
|
|
||||
|
def reverseLinkedList(xs): |
||||
|
current = xs.head |
||||
|
rest = xs.tail |
||||
|
revd = None |
||||
|
while True: |
||||
|
if revd is None: |
||||
|
revd = cons(current, None) |
||||
|
else: |
||||
|
push(current, revd) |
||||
|
if rest is None: |
||||
|
break |
||||
|
current = rest.head |
||||
|
rest = rest.tail |
||||
|
|
||||
|
return revd |
||||
|
|
||||
|
print(reverseLinkedList(xs)) |
Loading…
Reference in new issue