On Wednesday, 26 June 2013 at 20:51:35 UTC, Gary Willoughby wrote:
Just for a bit of fun, I saw this question posted on reddit the other day and wondered how *you* would solve this in D?

http://stackoverflow.com/questions/731832/interview-question-ffn-n

The question is ambiguous as to what they mean by -n. Do they mean the result of negation on the 32bit signed int, or do they mean the negative of the number represented by that int. this matters because -int.min evaluates to int.min due to wraparound.

So.. If we assume we want the proper mathematical negation:

Taking note that although the spec specifies n as a 32bit integer it says nothing about the signature of the function or the type of the result, we can just use implicit int->long

byte s(long n)
{
        return (n & 0x8000000000000000) ? -1 : 1;
}

long f(long x)
{
        if(x == 0)      return 0;
        if(x % 2)       return x + s(x);
        return s(x) - x;
}

unittest
{
        foreach(int n; int.min + 1 .. int.max)
        {
                assert(f(f(n)) == -n);
        }
        assert(f(f(int.max)) == -int.max);
}

Reply via email to