Skip to content

Instantly share code, notes, and snippets.

@malloc47 malloc47/embedly.py
Created Feb 11, 2012

Embed
What would you like to do?
embedly challenge
# Problem 1
fact = lambda n: reduce(lambda x,y: x*y, range(1, n+1), 1)
convert = lambda n: sum(map(int,str(n)))
def p1gen():
i = 0
while True:
yield (i,convert(fact(i)))
i+=1
p = p1gen()
result = (0,0)
while result[1] != 8001:
result = p.next()
print("Problem 1: "+str(result[0])) # 787
# or
l = [ x for x in range(0,1000) if convert(fact(x))==8001 ]
print("Problem 1: "+str(min(l))) # 787
# Problem 2
from HTMLParser import HTMLParser
import numpy as np
class P2Parser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.pdepths = []
self.depth = -3 # account for head/body
def handle_starttag(self, tag, attrs):
# print(str(tag)+" "+str(self.depth))
self.depth += 1
if(tag=="p"):
self.pdepths.append(self.depth)
def handle_endtag(self, tag):
self.depth -= 1
parser = P2Parser()
parser.feed(open("2.html", 'r').read())
print("Problem 2: "+str(np.std(parser.pdepths))) # 1.411...
# Problem 3
from itertools import *
s=2520.0
l = [s/x for x in range(1,901)]
half_of_words = sum(l)/2.0
# ugly, but I only had < 1 hr to work on these problems...
print("Problem 3: "+str(len(list(takewhile(lambda x: x < half_of_words,
np.cumsum(l))))+1)) # 22
@yassersouri

This comment has been minimized.

Copy link

yassersouri commented Feb 12, 2012

Problem 3

I think your implementation is not correct.

>>> s=2520.0
>>> l = [s/x for x in range(1,900)]
>>> len(l)
899

length of l must be 900, as the problem states "Given that the text has 900 unique words".

@malloc47

This comment has been minimized.

Copy link
Owner Author

malloc47 commented Feb 12, 2012

Very possibly--there was some ambiguity as to whether the question wanted to overshoot or undershoot (by 1) the halfway point so I just picked the one that went over (and didn't thoroughly examine the consequences--since it only makes a difference of ~3 words, it's not surprising it still gives the same answer).

@yassersouri

This comment has been minimized.

Copy link

yassersouri commented Feb 12, 2012

I wonder what is that +1 you are adding at the end?

print("Problem 3: "+str(len(list(takewhile(lambda x: x < half_of_words, np.cumsum(l))))+1)) # 22

@malloc47

This comment has been minimized.

Copy link
Owner Author

malloc47 commented Feb 12, 2012

I made the assumption that the problem wanted to overshoot the halfway point (i.e. the first element > half_of_words) rather than undershoot (and when I checked the answer against the webapp, this is indeed what was wanted). But, thanks to the lambda I passed to takewhile, it will return all the elements except the last element that puts the number of elements over the halfway point. So I added this final element. If itertools had a "takeuntil" function, I would have used that instead, but as I was coding for speed, I just used what was in the libraries.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.