Reflections on isPalindrome

"Nordlöw" via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Oct 24 14:56:18 PDT 2014


I would appreciate comments on my palindrome predicate function

bool isPalindrome(R)(in R range) @safe pure
     if (isBidirectionalRange!(R))
{
     import std.range: retro, take;
     import std.algorithm: equal;
     static if (hasLength!R)
     {
         const mid = range.length/2; // too long for string
         return equal(range.retro.take(mid),
                      range.take(mid));
     }
     else
     {
         return range.retro.equal(range);
     }
}
unittest
{
     assert("dallassallad".isPalindrome);
     assert(!"ab".isPalindrome);
     assert("a".isPalindrome);
     assert("åäå".isPalindrome);
     assert("".isPalindrome);
     assert([1, 2, 2, 1].isPalindrome);
}
alias isSymmetrical = isPalindrome;

also defined here

https://github.com/nordlow/justd/blob/master/algorithm_ex.d#L773

Specifically I wonder what to do with

     const mid = range.length/2; // TODO too long for string

when R is a string.

Further, I would like to extend isPalindrome() with a minimum 
length argument minLength that for string and wstring does

import std.uni: byDchar;
range.byDchar.array.length >= minLength.

AFAIK this will however prevent my algorithm from being 
single-pass right?


More information about the Digitalmars-d-learn mailing list