http://stackoverflow.com/questions/2553522/interview-question-check-if-one-string-is-a-rotation-of-other-string

I created a solution, but I don't want D to look bad, so I won't post it. It's a bit for loop heavy... At least it's shorter than the c example, but I don't know about speed or readability..

Suggestions for D-ifying the code is welcome.

import std.range;

bool isRotated(T)(T[] s, T[] d) {
        if( s.length != d.length )
                return false;

        auto cycled = cycle(s);
for(int loopIdx, matchIdx; loopIdx < d.length || matchIdx > 0; ++loopIdx && cycled.popFront()) {
                if( cycled.front == d[matchIdx] )
                        ++matchIdx;
                else
                        matchIdx = 0;

                if( matchIdx == d.length )
                        return true;
        }

        return false;
}
unittest
{
        auto a = "rotato";
        assert(isRotated(a, "rotato"));
        assert(isRotated(a, "otator"));
        assert(isRotated(a, "tatoro"));
        assert(isRotated(a, "atorot"));
        assert(isRotated(a, "torota"));
        assert(isRotated(a, "orotat"));

        assert(!isRotated(a, "rotator"));
        assert(!isRotated(a, "rotat"));
        assert(!isRotated(a, "rotata"));
}

Reply via email to