Created
July 24, 2012 18:19
-
-
Save prasincs/3171626 to your computer and use it in GitHub Desktop.
with Explanations
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Newbie programmer | |
# Exp: -> first exercise in recursion | |
def factorial(x): | |
if x == 0: | |
return 1 | |
else: | |
return x * factorial(x - 1) | |
print factorial(6) | |
#First year programmer, studied Pascal | |
# Exp: -> You declare vars at the top of program/function in pascal (also you use i:= i+1 type syntax to avoid confusing with equality) | |
# -> Notice iterative solution | |
def factorial(x): | |
result = 1 | |
i = 2 | |
while i <= x: | |
result = result * i | |
i = i + 1 | |
return result | |
print factorial(6) | |
#First year programmer, studied C | |
# Exp: -> Note the braces | |
# >>> from __future__ import braces | |
# File "<stdin>", line 1 | |
# SyntaxError: not a chance | |
# -> C assignment syntax | |
def fact(x): #{ | |
result = i = 1; | |
while (i <= x): #{ | |
result *= i; | |
i += 1; | |
#} | |
return result; | |
#} | |
print(fact(6)) | |
#First year programmer, SICP | |
#Exp: -> @<thing> is a decorator - applies a function to a function (pretty dope stuff) | |
# -> seems like the programmer just learned about tail calls in a Lisp class (Hence SICP reference - Structure and Interpretation of Computer Programs - great book) | |
@tailcall | |
def fact(x, acc=1): | |
if (x > 1): return (fact((x - 1), (acc * x))) | |
else: return acc | |
print(fact(6)) | |
#First year programmer, Python | |
#Exp: -> xrange is generator - meaning it "emits/yields" a value when asked to instead of storing all the items(like list) - slightly more optimized but overkill | |
def Factorial(x): | |
res = 1 | |
for i in xrange(2, x + 1): | |
res *= i | |
return res | |
print Factorial(6) | |
#Lazy Python programmer | |
# Exp: -> nicer syntax - x>1 and x*fact(x-1) only evaluates true when x>1 (slightly silly but works) | |
# -> also helped by the fact that 1 = True in python unlike Ruby | |
def fact(x): | |
return x > 1 and x * fact(x - 1) or 1 | |
print fact(6) | |
#Lazier Python programmer | |
# Exp: -> why name a function when you can use anonymous functions? (lambda) | |
f = lambda x: x and x * f(x - 1) or 1 | |
print f(6) | |
#Python expert programmer | |
#Exp: -> slightly fancier library functions, overkill here but extremely useful for a lot of projects | |
import operator as op | |
import functional as f | |
fact = lambda x: f.foldl(op.mul, 1, xrange(2, x + 1)) | |
print fact(6) | |
#Python hacker | |
#Exp: -> Python allows operator overloading via __sub__ and __mul__ methods, a lot of abuse of those things here | |
import sys | |
@tailcall | |
def fact(x, acc=1): | |
if x: return fact(x.__sub__(1), acc.__mul__(x)) | |
return acc | |
sys.stdout.write(str(fact(6)) + '\n') | |
#EXPERT PROGRAMMER | |
#Exp: Using the optimized C library instead | |
import c_math | |
fact = c_math.fact | |
print fact(6) | |
#ENGLISH EXPERT PROGRAMMER | |
# Exp: making fun of english/british people and their insistence on proper grammar - even in programming | |
import c_maths | |
fact = c_maths.fact | |
print fact(6) | |
#Web designer | |
#Exp -> copy pasted, too much comment, n00b | |
def factorial(x): | |
#------------------------------------------------- | |
#--- Code snippet from The Math Vault --- | |
#--- Calculate factorial (C) Arthur Smith 1999 --- | |
#------------------------------------------------- | |
result = str(1) | |
i = 1 #Thanks Adam | |
while i <= x: | |
#result = result * i #It's faster to use *= | |
#result = str(result * result + i) | |
#result = int(result *= i) #?????? | |
result str(int(result) * i) | |
#result = int(str(result) * i) | |
i = i + 1 | |
return result | |
print factorial(6) | |
#Unix programmer | |
#Exp: -> writes a shell script (most likely in Perl), puts in system path and calls that instead | |
import os | |
def fact(x): | |
os.system('factorial ' + str(x)) | |
fact(6) | |
#Windows programmer | |
#Exp:-> Uses way too many windows system calls | |
NULL = None | |
def CalculateAndPrintFactorialEx(dwNumber, | |
hOutputDevice, | |
lpLparam, | |
lpWparam, | |
lpsscSecurity, | |
*dwReserved): | |
if lpsscSecurity != NULL: | |
return NULL #Not implemented | |
dwResult = dwCounter = 1 | |
while dwCounter <= dwNumber: | |
dwResult *= dwCounter | |
dwCounter += 1 | |
hOutputDevice.write(str(dwResult)) | |
hOutputDevice.write('\n') | |
return 1 | |
import sys | |
CalculateAndPrintFactorialEx(6, sys.stdout, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) | |
#Enterprise programmer | |
# Exp:-> too many classes, even when the problem is really solvable in two lines | |
def new(cls, *args, **kwargs): | |
return cls(*args, **kwargs) | |
class Number(object): | |
pass | |
class IntegralNumber(int, Number): | |
def toInt(self): | |
return new (int, self) | |
class InternalBase(object): | |
def __init__(self, base): | |
self.base = base.toInt() | |
def getBase(self): | |
return new (IntegralNumber, self.base) | |
class MathematicsSystem(object): | |
def __init__(self, ibase): | |
Abstract | |
@classmethod | |
def getInstance(cls, ibase): | |
try: | |
cls.__instance | |
except AttributeError: | |
cls.__instance = new (cls, ibase) | |
return cls.__instance | |
class StandardMathematicsSystem(MathematicsSystem): | |
def __init__(self, ibase): | |
if ibase.getBase() != new (IntegralNumber, 2): | |
raise NotImplementedError | |
self.base = ibase.getBase() | |
def calculateFactorial(self, target): | |
result = new (IntegralNumber, 1) | |
i = new (IntegralNumber, 2) | |
while i <= target: | |
result = result * i | |
i = i + new (IntegralNumber, 1) | |
return result | |
print StandardMathematicsSystem.getInstance(new (InternalBase, new (IntegralNumber, 2))).calculateFactorial(new (IntegralNumber, 6)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment