3 ms·
I've always wondered -- is the reason people can't do fizzbuzz because a lack of understanding of modulus or because they can't comprehend the problem? I know
by SHOwnsYou 16y ago
I've always wondered -- is the reason people can't do fizzbuzz because a lack of understanding of modulus or because they can't comprehend the problem?
I know modulus isn't necessary, but I can see someone not doing the problem if the solution they are turning in is in a less elegant way.
- patio11 16y agoFizzBuzz comes from a game for six to eight year olds, who also don't understand modulus. That's part of the reason it is such a great problem: they fact that you realize "Hey, this is a whole lot easier with modulus" demonstrates that you can reason abstractly. You certainly don't need a mod operator to make it work -- if you're capable of writing a function, you can write divides_evenly_by_3(int number) using facts that every fourth grader knows. If you prefer, you can substitute a similar problem which doesn't require even fourth grade math. Here's one: write a program which calculates the sum of all numbers between 1 and 1,000 whose digits sum up to 7. Or write a program which takes this post as input and tells me what the 3rd most common letter used was.
- PakG1 16y agoThat's true enough. But fact is, if someone's ignorant of modulus, I'd say that's scary. Knowing modulus doesn't necessarily demonstrate you have a great grasp of programming. But I think not knowing modulus demonstrates that there's a higher probability you know very little. And fact is, FizzBuzz also filters out all the people who know modulus, but can't figure it out anyway. You definitely don't want those people.
- paulnelligan 16y agoI didn't realise that some programmers didn't know modulus ... really??
- BrandonM 16y ago> write a program which calculates the sum of all numbers between 1 and 1,000 whose digits sum up to 7 My Python answer: sum(x for x in xrange(2, 1000) if sum(int(y) for y in str(x)) == 7) # 9324 Anyone have improvements on that? (I used the range (1, 1000) as opposed to [1, 1000], but it doesn't make a difference since the edge values don't have digits that sum to 7.)
- kenjackson 16y agoThere are a lot of micro improvements you can do to this. For example, after you find sum() == 7, you can increment x by 9 (since the largest digit in the ones column can be 7, and this takes a deficit of two digits to get back to the rollover -- and then 7 more to get a sum of 7 again). And frankly I'm not sure if its faster to convert to string and back to int, or if it would be better to just use modulo arithmitic to get the values associated with the ones/tens/hundreds. In any case, what you have is certainly readable though.
- BrandonM 16y agoI mainly meant "improve" in terms of conciseness and readability. I didn't see any need for optimization because the snippet runs instantly: $ time python -c "print sum(x for x in xrange(2, 1000) if sum(int(y) for y in str(x)) == 7)" 9324 real 0m0.138s user 0m0.012s sys 0m0.012s
- BioGeek 16y agoMy Python answer for the second question, where `post` is patrio11's post as input: from collections import defaultdict from string import ascii_letters d= collections.defaultdict(int) for letter in post: d[letter] += 1 print [letter for letter in sorted(d, key=d.get, reverse=True) if letter in ascii_letters][2] Any comments on improvement for readability or conciseness?
- follower 16y agoAh, your use of the collections module prompted me to read the docs for it (who would've guessed :) ) which leads to a revision of my other response: import string, collections s = "your text here" print collections.Counter([i for i in s.lower() if i in string.letters]).most_common(3)[-1]
- follower 16y ago> Or write a program which takes this post as input and tells me what the 3rd most common letter used was. I'm going for 'a'. And, according to http://en.wikipedia.org/wiki/File:English_letter_frequency_(frequency).svg http://en.wikipedia.org/wiki/File:English_letter_frequency_(... (via http://en.wikipedia.org/wiki/Letter_frequency http://en.wikipedia.org/wiki/Letter_frequency) your four most frequently used letters match the table for English. Tested in Python 2.7: s = "your text here" import string d = {} for i in list(s.lower()): if i in string.letters: d[i] = d.setdefault(i, 0) + 1 print sorted(d.keys(), cmp = lambda x, y : cmp(d[x], d[y]), reverse = True)[2] Edit: See my later response for something using the 'collections' module.
- ciupicri 16y agoYou don't need to do `list(s.lower())`, you can already iterate over a string. Also, instead of converting the whole string to a new lowercase one, which means allocating "a lot" of memory, you can convert each character separately as needed.