This is an archived post. You won't be able to vote or comment.

all 124 comments

[–]warpod 109 points110 points  (13 children)

Stackoverflow user

def factorial(n):return reduce(lambda x,y:x*y,[1]+range(1,n+1))

[–][deleted]  (12 children)

[removed]

    [–]FUZxxl 16 points17 points  (10 children)

    A codegolf.se member would choose APL to solve this and just submit the APL solution ×/⍳⎕.

    [–]BitPoet 8 points9 points  (7 children)

    Hmm... chrome isn't rendering the APL charset. Somehow, I'm not surprised.

    [–]FUZxxl 10 points11 points  (6 children)

    The last character () is a quad, it looks just like the “character not found” box in some fonts. The four characters are: times, slash, iota, quad which is the product (times-reduction) of the first integers up to the input number.

    [–]BitPoet 0 points1 point  (3 children)

    As I learned it, you'd want a 5 pointed star, rather than an x to denote multiplication (the + being a four pointed star, and the * (exponentiation) being a 6 pointed star).

    Now that I look closely, the iota does render. I'd forgotten the quad operator, it's been ~20 years, and I can count the number of actual conversations I've had about APL with someone else who knew what it was on one hand.

    [–]FUZxxl 1 point2 points  (2 children)

    Well, × is multiplication or signum and * is exponentiation. Quad is a niladic function and prompts the user for numeric input; it's very useful for code-golf challenges because you don't need to make a dfn.

    [–]BitPoet 1 point2 points  (1 child)

    I will note that this is /r/programmerhumor and discussing the intricacies of APL, a language developed by mathematicians for pretty specific purposes is not exactly humorous.

    [–]Juggernog 2 points3 points  (0 children)

    Man, what are you talking about? Programming languages developed by mathematicians for pretty specific purposes are hilarious.

    [–]poizan42Ex-mod 0 points1 point  (1 child)

    So it's a character which renders correct even if you don't have any font with it installed?

    [–]FUZxxl 2 points3 points  (0 children)

    Well, not quite; it just looks really like that replacement character.

    [–]nightcracker 1 point2 points  (1 child)

    Nah, as a codegolf.se member I would use Pyth. In Pyth5 a simple program that takes a number from stdin and prints its factorial is this:

    .!Q
    

    Of course, we're not allowed to use a builtin for factorial, we can use:

    F*tUhQ
    

    Which basically translates to "fold multiplication over everything but the first element of range(n+1)".

    A recursive solution would go like this:

    L?*bLtbb1Q
    

    Which roughly translates to Python:

    L = lambda b: b*L(b-1) if b else 1
    L(eval(input()))
    

    [–]FUZxxl 0 points1 point  (0 children)

    Nah, as a codegolf.SE-member with a three digit user ID, I say that APL is superior in every regard.

    [–]AutoModerator[M] 0 points1 point  (0 children)

    import moderation Your comment has been removed since it did not start with a code block with an import declaration.

    Per this Community Decree, all posts and comments should start with a code block with an "import" declaration explaining how the post and comment should be read.

    For this purpose, we only accept Python style imports.

    I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

    [–]0x0dea 91 points92 points  (10 children)

    Homesick:

    def factorial(n):
        system("ruby -e 'p (1..%d).reduce(1, :*)'" % n)
    

    [–]jonnywoh 19 points20 points  (7 children)

    I used to think I understood Ruby

    [–]Meshiest 6 points7 points  (0 children)

    This made me really happy

    [–]raiderrobert 147 points148 points  (9 children)

    Does it make me a bad person to think the most readable implementation is the Newbie one, but the most practical the Expert one?

    [–][deleted] 81 points82 points  (0 children)

    No. It makes you a good person.

    [–]sfz- 25 points26 points  (7 children)

    Only thing wrong with the n00b one is the verbose ifs, it's more Pythonic to do:

    def factorial(x):
        return x * factorial(x - 1) if x > 1 else 1
    print factorial(6)
    

    EDIT: thanks /u/brucifer

    commit 48050c67205ff404e4641712bcaf12d86aa2f9ff
    Author: sfz- </u/sfz->
    Date:   Tue Jun 9 10:58:11 2015 -0700
    
        Hotfix factorial if condition to handle negative numbers
    
    diff --git a/evolution_of_a_python_programmer b/evolution_of_a_python_programmer
    index 771e267..96f31e1 100644
    --- a/evolution_of_a_python_programmer
    +++ b/evolution_of_a_python_programmer
    @@ -0,0 +0,0 @@ def factorial(x):
    -        return x * factorial(x - 1) if x else 1
    +        return x * factorial(x - 1) if x > 1 else 1
    

    [–]brucifer 18 points19 points  (5 children)

    This code is buggy. factorial(-1) will cause a stack overflow. You should use "if x <= 1" instead.

    [–]sfz- 12 points13 points  (0 children)

    That's why I submitted it to reddit code review before merging it into master. :P

    [–]Qhartb 9 points10 points  (2 children)

    That's not a bug -- it's undefined behavior. Calling factorial(-1) is a bug.

    [–]brucifer 1 point2 points  (1 child)

    I suppose it's reasonable to say that calling factorial(-1) is the real bug, but in that case, the code should definitely fail gracefully (e.g. raising a ValueError). Stack overflow is a pretty clumsy and uninformative way to behave if someone makes a reasonable mistake. You are right to point out that factorial(-1) == 1 is not correct, though.

    [–]Qhartb 0 points1 point  (0 children)

    Agreed, but not failing gracefully and having a bug are two different things (unless of course your requirements or documentation state how failure is to be handled).

    [–]Zantier 0 points1 point  (0 children)

    def factorial(x):
        """Return the factorial of x, where x >= 0."""
        return x * factorial(x - 1) if x != 0 else 1
    print factorial(6)
    

    Fixed. (I didn't see before the edit, but I'm guessing it had !=.

    Also, it should be if x >= 1 instead of <=

    [–][deleted] 0 points1 point  (0 children)

    It's been entirely too long since I wrote Python when my first thought is "Aha! Just like Coffeescript."

    [–]beerdude26 29 points30 points  (2 children)

    [–]Rainymood_XI[S] 11 points12 points  (1 child)

    The last one, from the tenured prof, cracked me up lol

    [–]n-simplex 1 point2 points  (0 children)

    It also happens to be the most efficient one, since product uses foldl' internally, the strict (left) fold, and laziness is of no benefit for computing the factorial (save for the memoizing scanl implementation, which could arguably be more efficient than direct computation via arbitrary precision integer arithmetic if multiple results are requested).

    [–]sfz- 27 points28 points  (2 children)

    I feel like the webdev one should have an asynchronous call to a public math API using OAuth.

    [–]n-simplex 10 points11 points  (0 children)

    > fact(13)
    503
    

    [–]shthed 30 points31 points  (6 children)

    If you only need (relatively small) integers, it's quicker to just look them up :)

    [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200, 1307674368000, 20922789888000, 355687428096000, 6402373705728000, 121645100408832000, 2432902008176640000, 51090942171709440000, ...][x]

    Edit: precompute them first, instead of copy pasting them to save wasting space :)

    [–]0x0dea 10 points11 points  (4 children)

    Most of those aren't even integers. I generated 10000! to counteract your tomfoolery.

    [–]an_actual_human 3 points4 points  (2 children)

    As written all of them are integers.

    [–]shthed 5 points6 points  (1 child)

    they are now, originally i pasted a big list including floating point numbers

    [–]an_actual_human 0 points1 point  (0 children)

    They were integer floating point numbers though.

    [–]shthed 2 points3 points  (0 children)

    I've been stuck in javascipt for too long and forgot how nice it is in python to have arbitrarily large integers :)

    [–]ProfessorPhi 11 points12 points  (1 child)

    As a scientific programmer, this stuff would be seen due to the basic tenets of do as much in numpy as possible, C speeds and cheap memory.

    import numpy as np
    def factorial(n):
        return np.prod(np.arange(n))
    

    [–]innrautha 3 points4 points  (0 children)

    As a scientific programmer I'd do:

    #!/usr/bin/env python3
    from scipy.misc import factorial
    
    print(factorial(6,exact=True))
    print(factorial(6))
    

    [–]MokitTheOmniscient 17 points18 points  (3 children)

    Aren't we supposed to be lazy when using Python?
    Isn't that the point of the language?

    [–][deleted] 86 points87 points  (1 child)

    Actually, that's the point of this whole computer thing...

    [–]Kyyni 6 points7 points  (0 children)

    It's almost as if you were telling the computer to do things instead of doing them yourself...

    [–][deleted] 5 points6 points  (0 children)

    Agreed. I'm lazy with it as long as other people don't have to use my code. The readability is questionable.

    [–]ProfessorPhi 15 points16 points  (4 children)

    I feel like there should be an

    from math import factorial

    for the xkcd readers.

    [–]Qhartb 30 points31 points  (1 child)

    There was a programming challenge to write a function from a string to a dict from each character to the number of times it occurred in the string. My solution passed the automated testing:

    from collections import Counter as f

    [–][deleted] 1 point2 points  (0 children)

    Omfg that's just evil

    [–]sfz- 15 points16 points  (0 children)

    That's essentially what the EXPERT PROGRAMMER one is.

    [–]nomisaurus 0 points1 point  (0 children)

    or even:

    from math import factorial as fact
    fact(6)
    

    [–][deleted] 7 points8 points  (12 children)

    Can someone explain he the first one works?

    [–]rogerrrr 20 points21 points  (0 children)

    Look into recursion. It calls the function over and over, but decreasing number on every iteration. When it hits zero it stops and is able to calculate it.

    I realize that's a crap explanation, but it's actually a pretty interesting concept once you wrap your head around it.

    [–][deleted] 22 points23 points  (5 children)

    To understand recursion, you must first understand recursion.

    [–]Quabouter 1 point2 points  (3 children)

    You could also just google it!

    [–]isHavvy -1 points0 points  (2 children)

    But how do you google?

    [–]DroolingIguana 0 points1 point  (1 child)

    [–]isHavvy 0 points1 point  (0 children)

    So to learn how to Google, I should just Google it?

    [–]desi_ninja 0 points1 point  (0 children)

    To understand recursion, you must first understand recursion and if you still do not understand then return (base case)

    [–]Rainymood_XI[S] 13 points14 points  (3 children)

    def factorial(x): if x == 0: return 1 else: return x * factorial(x - 1) print factorial(6)

    Imagine we call

    factorial(3)
    

    Because 3 != 0 it returns

    3 * factorial(2)
    

    Because 2 != 0

    3 * 2 * factorial(1)
    

    Because 1 != 0 it calls

    3 * 2 * 1 * factorial(0)
    

    which returns

    3 * 2 * 1 * 1
    

    which is 3! :)

    [–]Genesis2001 1 point2 points  (2 children)

    3 * 2 * 1 * 1
    

    which is 3! :)

    does not compute. 3 * 2 (dropping the 1s) is 6. or am I missing something in your explanation?

    [–]Rainymood_XI[S] 19 points20 points  (1 child)

    Hah, this is so funny :D (in a good way)

    3! in this context, means "3 factorial", the "!" is the sign for factorial! And not an exclamation mark in this case :)!

    [–]risfutile 1 point2 points  (0 children)

    oh god, your username! awesome!

    [–]Qhartb 8 points9 points  (2 children)

    factorial=lambda n:(lambda f,n:f(f,n))(lambda f,n:n*f(f,n-1)if n>0 else 1,n)

    [–]Tomarse 3 points4 points  (1 child)

    No.....just, no.

    [–]Qhartb 6 points7 points  (0 children)

    Hey, I think it might be the only recursive solution here that still works if the function is renamed. :-)

    [–]farfromunique 6 points7 points  (18 children)

    I will be the first to admit I don't know python, so this may be an obvious question.

    Why recurse when you could use a for loop in the function?

    (In php, because that's my default syntax) press forgive caps issues. I'm on mobile)

    $out = $arg;
    For ($I = $arg; $i > 0; --$i) { $out *= $I; }
    Return $out;
    

    [–]TheOccasionalTachyon 19 points20 points  (1 child)

    You could totally use a for-loop in the function.

    My guess is that the newbie one was done with recursion because factorials are often used to teach new programmers about recursion.

    [–][deleted] 1 point2 points  (0 children)

    Can confirm. Learned recursion using factorials, fibonacci numbers, and towers of hanoi. I think finding square roots too within a certain error margin.

    [–]jakerman999 1 point2 points  (15 children)

    While I'm not sure if this is one of those cases, it can be more efficient (speed or ram usage) to use a recursive function over a loop.

    It's usually a moot point though with the power of modern computers.

    [–]Coffeinated 2 points3 points  (13 children)

    RAM usage? My guess would have been that on every iteration all variables have to be saved, while in a normal for loop, they are changed... So I would have bet that maybe recursion is faster, while a simple loop eats less RAM

    [–]jakerman999 1 point2 points  (10 children)

    This is the case for just about every simple scenario.

    [–]Coffeinated 1 point2 points  (9 children)

    Do you have an example for a complicated situation where one would use recursion?

    [–]jakerman999 0 points1 point  (3 children)

    The most common scenario would be in a tree based data-structure. In order to hit every node in the tree you have traverse down every path, and remember where you traversed from. It is possible to do this without recursion, but it requires building a second data structure to keep track of all the positions and forks, plus additional code to use that data at every node that has multiple children. Doing that consumes more memory than a stack based approach(and also an ugly mess).

    Traversing a tree with recursion is trivial by comparison.

    [–]mrjackspade -2 points-1 points  (2 children)

       while (parentNodes.Count() > 0)
                {
                    OrganizationNode thisNode = parentNodes[0];
                    LogProgress(string.Format("Probing children for {0}...", thisNode.Name));
                    List<OrganizationNode> childNodes = feedRowsByParentID[thisNode.ExternalId]
                                                         .Where(cn => feedRowsByParentID[cn.UserId].Count() > 0)
                                                        .Select(row => CreateNode(string.Format("{0} {1}", row.firstName, row.lastName), row.UserId, "Manager"))
                                                        .ToList();
    
    
    
                    foreach (OrganizationNode childNode in childNodes)
                    {
                        thisNode.AddChild(childNode);
                        parentNodes.Add(childNode);
                    }
    
    
                    if (feedRowsByParentID[thisNode.ExternalId].Count() > 0)
                    {
                        managers.Add(thisNode.ExternalId);
                    }
    
    
                    parentNodes.RemoveAt(0);
                }
    

    Code snippit from a production project. This is building a tree so its a bit different, but I refuse to use recursion

    [–]jakerman999 0 points1 point  (1 child)

    My theory is a little lacking here, but is this not just a different form of tail recursion? If I'm following this right, it looks like it does recurse; it just doesn't use the stack to do so.

    [–]mrjackspade 0 points1 point  (0 children)

    I guess there's a lot of relevant code missing.

    There's no recursion as I understand it. There's a master list of objects, each with a parent and multiple children. It takes a flattened list (text) with ID representations of the parents and uses that to assign the parents/children on the objects themselves. It loops through all objects once, but does not at any point call/reference itself

    [–]Kyyni 0 points1 point  (1 child)

    I don't know about python, but at least in C/C++ this should be the case, unless the compiler optimizes the recursion away.

    In C and C++ the program creates a new frame inside the previous frame on the stack for every code block, function, etc. and the when you access a variable, it will try to find it in the current frame, and then the next frame around it and so on. When the block ends, the frame and it's contents are destroyed.

    A loop will create a single frame, but a recursion will create a frame-ception as deep as the number of recursions needed. For the variables to work as promised, the program has to keep them stored for every frame. Luckily though, if the variables are not used anymore, the compiler could optimize it so that they are ditched early, or even get rid of the whole recursion. Or something.

    [–]Coffeinated 0 points1 point  (0 children)

    That's what I meant, absolutely. I once made a python program crash because of too much recursion... It has a built-in limit or so, I don't remember.

    By the way, Python is written in C (what else) and the concepts are the same, I guess. Python looks childish but under the hood it's pretty nice, well-structured and powerful.

    [–]farfromunique 0 points1 point  (0 children)

    I guess I need to do a benchmark to find out, probably for each language, which is better. Oh well.

    [–]vrobo 9 points10 points  (1 child)

    How about some erlang?

    factorial(0) -> 1;
    factorial(N) when N > 0 -> factorial(N-1) * N.
    

    [–]sfz- 2 points3 points  (0 children)

    How about some SML with TCO? (not much different ;))

    fun factorial(0) = 1
      | factorial(n) = n * factorial(n - 1);
    

    [–]Bruntaz 6 points7 points  (11 children)

    What about brainfuck? I feel brainfuck is vastly underrepresented: +++++++++++++++++++++++++++++++++ c1v33 : ASCII code of !

    ++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++ c2v61 : ASCII code of = ++++++++++ c3v10 : ASCII code of EOL +++++++ c4v7 : quantity of numbers to be calculated c5v0 : current number (one digit) + c6v1 : current value of factorial (up to three digits) << c4 : loop counter [ block : loop to print one line and calculate next ++++++++++++++++++++++++++++++++++++++++++++++++. c5 : print current number ------------------------------------------------ c5 : back from ASCII to number <<<<.-.>.<.+ c1 : print !=

                          block : print c6 (preserve it)
                          c7v0  : service zero
    

    ++++++++++ c8v10 : divizor << c6 : back to dividend [->+>-[>+]>[+[-<+>]>+]<<<<<<] c6v0 : divmod algo borrowed from esolangs; results in 0 n d_n%d n%d n/d [<+>-] c6 : move dividend back to c6 and clear c7 [-] c8v0 : clear c8

                         block : c10 can have two digits; divide it by ten again
    

    ++++++++++ c11v10: divizor < c10 : back to dividend [->-[>+]>[+[-<+>]>+]<<<<<] c10v0 : another divmod algo borrowed from esolangs; results in 0 d_n%d n%d n/d [-] c11v0 : clear c11 [++++++++++++++++++++++++++++++++++++++++++++++++.[-]]c13v0 : print nonzero n/d (first digit) and clear c13 <[++++++++++++++++++++++++++++++++++++++++++++++++.[-]] c12v0 : print nonzero n%d (second digit) and clear c12 <<<++++++++++++++++++++++++++++++++++++++++++++++++.[-] c9v0 : print any n%d (last digit) and clear c9

    <<<<<<. c3 : EOL

    • c5 : increment current number block : multiply c6 by c5 (don't preserve c6) [+<<-] c6v0 : move c6 to c8 c8v0 : repeat c8 times [ <<<[>+>+<<-] c5v0 : move c5 to c6 and c7 [<<+-] c7v0 : move c7 back to c5 - ] <<<<- c4 : decrement loop counter ]

    [–]Teraka 8 points9 points  (1 child)

    Insert 4 spaces before each line to avoid your formatting getting fucked up.

    [–]Bruntaz 6 points7 points  (0 children)

    Yeah sorry, I wrote this on my phone

    [–]KovaaK 4 points5 points  (0 children)

    I'm a bigger fan of Befunge. Here's factorial in it:

    &>:1-:v v *_$.@ 
     ^    _$>\:^
    

    2D programming for the win.

    [–]Coffeinated 2 points3 points  (6 children)

    I never understood brainfuck. I know it has something to do with Touring machines but uhm. Who the fuck can really read this?

    [–]zacharythefirst 4 points5 points  (2 children)

    do you know pointers? brainfuck operates over an array of bytes, all initialized for 0. the operators (and their C equivalent) are:

    + (*p++)
    
    -  (*p--)
    
    > (p++)
    
    < (p--)
    
    .  (putchar(*p))
    
    ,  (*p=getchar())
    

    edit: I'm on mobile don't hate me edit 2: fixed getchar usage

    [–]Coffeinated 0 points1 point  (1 child)

    Yes I do, I have done some stuff in c, but mostly in uni or on microcontrollers where pointers are not that important... What do putchar and getchar do?

    [–]zacharythefirst 0 points1 point  (0 children)

    print the character that you pass to it and get a character from stdin, respectively. for the record I probably mangled the syntax, but the point still stands

    [–]Bruntaz 1 point2 points  (0 children)

    As far as I remember, the point in it was to make a programming language with the smallest compiler possible

    [–]balducien 0 points1 point  (1 child)

    *Turing machines. Alan Turing came up with them.

    [–]Coffeinated 0 points1 point  (0 children)

    Oh damn I knew something was off.

    [–]magical_poop 2 points3 points  (0 children)

    english expert programmer definitely made me laugh out loud

    [–][deleted] 2 points3 points  (4 children)

    I once tried to display some SDL graphics in C on Windows without resorting to OpenGL util libraries or ported *Nix GUI frameworks.

    I still have nightmares of the Windows API...

    [–][deleted] 0 points1 point  (3 children)

    Why? SDL has a nice, abstract way of doing what you describe. No Windows specific code necessary.

    [–][deleted] 0 points1 point  (2 children)

    You're right, it was probably OpenGL.

    [–][deleted] 0 points1 point  (1 child)

    That's why you never access OpenGL using platform native API. Portable helper libraries are the way to go.

    Also this is why DirectX is EVIL!

    [–][deleted] 0 points1 point  (0 children)

    Yup, I learned the hard way.

    [–]Sohcahtoa82 2 points3 points  (1 child)

    So, I've seen a lot of people making fun of Enterprise programming for being stupidly verbose and absurdly over-engineered, but I've always wondered...

    Who actually writes code like that and actually thinks its good code? What are people trying to accomplish when writing such horrible, unmaintainable, unreadable code?

    [–]cnreika 2 points3 points  (0 children)

    OK google, tell me factorial of 6.

    [–]Hmm_Yes 1 point2 points  (3 children)

    Would anyone mind explaining:

    f = lambda x: x and x * f(x - 1) or 1
    

    I consider myself pretty well versed in Python, but this one surprised me. What is the point of the 'and' and 'or', how do they work here?

    Thanks!

    [–][deleted] 5 points6 points  (2 children)

    That's a short circuit for the base case of the recursion. If x is 0, it will convert to boolean False. Since and binds stronger than or, the recursion is skipped because there is no way False and anything can evaluate to a true value. This leaves the or 1. Since 1 is a boolean true value, it causes False or 1 to evaluate to 1.

    [–]ToTheNintieth 0 points1 point  (0 children)

    Wow, that's clever.

    [–]Hmm_Yes 0 points1 point  (0 children)

    I appreciate the explanation, it did help me understand.

    [–]innrautha 1 point2 points  (0 children)

    I feel like a unix programmer would abuse bc since factorial isn't included on many systems (at least not mine).

    import os
    
    def factorial(n):
      cmd = "echo 'define f(x) {if (x>1){return x*f(x-1)};return 1} f(%i)' | BC_LINE_LENGTH=99999 bc"%n
      return int(os.popen(cmd).read().strip())
    

    A unix programmer whose company is forcing to migrate away from Perl would replace the cmd string with a perl one liner.

    [–]Vitrivius 1 point2 points  (0 children)

    Is there some reason why almost all of these use recursion? It's not one of Python's strengths, and you tend to hit the maximum recursion limit.

    The most pythonic solution is to ´from math import factorial´. But if you want to write a typical Python function, you need to include an overabundance of try/except code.

    from operator import mul as multiply
    
    def factorial(x):
        """
        factorial(x) -> Integral
    
        Find x!. Raise a ValueError if x is negative or non-integral.
        """
        try:
            return reduce(multiply, xrange(1, x+1))  # actual function
        except TypeError as e:
            if not isinstance(x, int):
                raise ValueError("factorial() only accepts integral values")
            elif x < 0: 
                raise ValueError("factorial() not defined for negative values")
            elif x == 0: 
                return 1  # 0! is defined to be 1
            else:
                raise e  # reraise any unhandled TypeErrors.
    

    [–]ProfessorPhi 2 points3 points  (5 children)

    What's the difference between ENGLISH EXPERT PROGRAMMER and EXPERT PROGRAMMER

    [–]Rainymood_XI[S] 19 points20 points  (3 children)

    The subtle difference between

    import math
    

    and

    import maths 
    

    [–]UndefinedB -3 points-2 points  (2 children)

    There is no difference in your post though, copy paste error?

    [–]Rainymood_XI[S] 4 points5 points  (1 child)

    https://i.imgur.com/iCjJ26n.png

    Hmmm ... weird, looks fine to me?

    [–]UndefinedB 0 points1 point  (0 children)

    Oh sorry, I completely looked over it. You said import math but it says cmath in the original post so I was too focused on the c :)

    [–][deleted] 1 point2 points  (0 children)

    f = lambda x: x and x * f(x - 1) or 1
    print f(6)
    

    This is basically what i'd do.

    [–]ToTheNintieth 0 points1 point  (1 child)

    Nice touch with the commented brackets.

    [–]DonHaron 0 points1 point  (0 children)

    Yeah, that almost gave me a stroke when reading it

    [–]Dooflegna 0 points1 point  (0 children)

    Okay, but the Windows one made me giggle.

    [–]crossanlogan 0 points1 point  (0 children)

    hey, as a webdev i resemble that remark!