Easy to read palindrome checker The Next CEO of Stack OverflowPalindrome CheckerLargest Palindrome CheckerPalindrome Checker AlgorithmNumber palindrome checkerPalindrome Checker in JavaFinding palindromes in C#Python palindrome checkerTest if a string is a palindromeFinding an equilibrium index in an int arrayPython 3 palindrome checker

Is it "common practice in Fourier transform spectroscopy to multiply the measured interferogram by an apodizing function"? If so, why?

Is it a bad idea to plug the other end of ESD strap to wall ground?

Is the 21st century's idea of "freedom of speech" based on precedent?

How can I prove that a state of equilibrium is unstable?

What is the difference between 'contrib' and 'non-free' packages repositories?

Calculate the Mean mean of two numbers

Is it correct to say moon starry nights?

Is a distribution that is normal, but highly skewed, considered Gaussian?

Why do we say “un seul M” and not “une seule M” even though M is a “consonne”?

How does a dynamic QR code work?

How badly should I try to prevent a user from XSSing themselves?

Mathematica command that allows it to read my intentions

Is the offspring between a demon and a celestial possible? If so what is it called and is it in a book somewhere?

Prodigo = pro + ago?

A hang glider, sudden unexpected lift to 25,000 feet altitude, what could do this?

Does Germany produce more waste than the US?

Was the Stack Exchange "Happy April Fools" page fitting with the 90s code?

Calculating discount not working

Man transported from Alternate World into ours by a Neutrino Detector

Why did early computer designers eschew integers?

Find a path from s to t using as few red nodes as possible

How did scripture get the name bible?

MT "will strike" & LXX "will watch carefully" (Gen 3:15)?

Is this a new Fibonacci Identity?



Easy to read palindrome checker



The Next CEO of Stack OverflowPalindrome CheckerLargest Palindrome CheckerPalindrome Checker AlgorithmNumber palindrome checkerPalindrome Checker in JavaFinding palindromes in C#Python palindrome checkerTest if a string is a palindromeFinding an equilibrium index in an int arrayPython 3 palindrome checker










11












$begingroup$


I made a palindrome checker that's supposed to be designed to be simple and easy to read. Please let me know what you think. I believe the time complexity is $mathcalO(n)$ but I'm not too sure about that:



Challenge: You'll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything into the same case (lower or upper case) in order to check for palindromes.



function reverseString(str)

str = str.replace(/[^ws]


reverseString("My age is 0, 0 si ega ym.");

function palindrome(str)
str = str.replace(/[^ws]









share|improve this question











$endgroup$











  • $begingroup$
    Are you sure this is working as intended?
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    The test reverseString("My age is 0, 0 si ega ym."); should at least be something like console.log(palindrome(reverseString("My age is 0, 0 si ega ym.")));, and does your challenge ignore spaces? Because if they don't, your example string should return false while it doesn't. Please clarify the exact challenge.
    $endgroup$
    – Mast
    2 days ago















11












$begingroup$


I made a palindrome checker that's supposed to be designed to be simple and easy to read. Please let me know what you think. I believe the time complexity is $mathcalO(n)$ but I'm not too sure about that:



Challenge: You'll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything into the same case (lower or upper case) in order to check for palindromes.



function reverseString(str)

str = str.replace(/[^ws]


reverseString("My age is 0, 0 si ega ym.");

function palindrome(str)
str = str.replace(/[^ws]









share|improve this question











$endgroup$











  • $begingroup$
    Are you sure this is working as intended?
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    The test reverseString("My age is 0, 0 si ega ym."); should at least be something like console.log(palindrome(reverseString("My age is 0, 0 si ega ym.")));, and does your challenge ignore spaces? Because if they don't, your example string should return false while it doesn't. Please clarify the exact challenge.
    $endgroup$
    – Mast
    2 days ago













11












11








11


1



$begingroup$


I made a palindrome checker that's supposed to be designed to be simple and easy to read. Please let me know what you think. I believe the time complexity is $mathcalO(n)$ but I'm not too sure about that:



Challenge: You'll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything into the same case (lower or upper case) in order to check for palindromes.



function reverseString(str)

str = str.replace(/[^ws]


reverseString("My age is 0, 0 si ega ym.");

function palindrome(str)
str = str.replace(/[^ws]









share|improve this question











$endgroup$




I made a palindrome checker that's supposed to be designed to be simple and easy to read. Please let me know what you think. I believe the time complexity is $mathcalO(n)$ but I'm not too sure about that:



Challenge: You'll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything into the same case (lower or upper case) in order to check for palindromes.



function reverseString(str)

str = str.replace(/[^ws]


reverseString("My age is 0, 0 si ega ym.");

function palindrome(str)
str = str.replace(/[^ws]






javascript algorithm programming-challenge array palindrome






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 days ago









200_success

131k17156422




131k17156422










asked 2 days ago









DreamVision2017DreamVision2017

835




835











  • $begingroup$
    Are you sure this is working as intended?
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    The test reverseString("My age is 0, 0 si ega ym."); should at least be something like console.log(palindrome(reverseString("My age is 0, 0 si ega ym.")));, and does your challenge ignore spaces? Because if they don't, your example string should return false while it doesn't. Please clarify the exact challenge.
    $endgroup$
    – Mast
    2 days ago
















  • $begingroup$
    Are you sure this is working as intended?
    $endgroup$
    – Mast
    2 days ago










  • $begingroup$
    The test reverseString("My age is 0, 0 si ega ym."); should at least be something like console.log(palindrome(reverseString("My age is 0, 0 si ega ym.")));, and does your challenge ignore spaces? Because if they don't, your example string should return false while it doesn't. Please clarify the exact challenge.
    $endgroup$
    – Mast
    2 days ago















$begingroup$
Are you sure this is working as intended?
$endgroup$
– Mast
2 days ago




$begingroup$
Are you sure this is working as intended?
$endgroup$
– Mast
2 days ago












$begingroup$
The test reverseString("My age is 0, 0 si ega ym."); should at least be something like console.log(palindrome(reverseString("My age is 0, 0 si ega ym.")));, and does your challenge ignore spaces? Because if they don't, your example string should return false while it doesn't. Please clarify the exact challenge.
$endgroup$
– Mast
2 days ago




$begingroup$
The test reverseString("My age is 0, 0 si ega ym."); should at least be something like console.log(palindrome(reverseString("My age is 0, 0 si ega ym.")));, and does your challenge ignore spaces? Because if they don't, your example string should return false while it doesn't. Please clarify the exact challenge.
$endgroup$
– Mast
2 days ago










5 Answers
5






active

oldest

votes


















12












$begingroup$

Time complexity



Your time complexity is linear but you can save a few traversals over the string and lower the constant factor as you improve readability. Checking whether a string is a palindrome can be done in one pass with two pointers at each end of the string (plus some conditionals for your special characters), but this gains speed at the expense of readability; I'd encourage a round of clean-up before going for optimizations.



Repeated code



Repeated code harms maintainability and readability. Notice that the line



str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");


appears in two places in the code. If you decide to change one to accept a different regex but forget to change the other one, you've introduced a potentially subtle bug into your program. Move this to its own function to avoid duplication.



Use accurate function names and use builtins



reverseString is a confusing function: it does more than reversing a string as advertised: it also strips whitespace and punctuation, which would be very surprising if I called this function as a user of your library without knowing its internals. All functions should operate as black boxes that perform the task they claim to, nothing more or less.



The array prototype already has a reverse() function, so there's no need to write this out by hand.



Avoid unnecessary verbosity



The code:



 if(str === reverseString(str))

return true;

else

return false;



is clearer written as return str === reverseString(str);, which says "return the logical result of comparing str and its reversal".



Improve the regex to match your specification



Including spaces in your regex substitution to "" is easier than .split(" ").join(""). If you wish to remove all non-alphanumeric characters, a regex like /[^a-zd]/gi reflects your written specification accurately (or use W if you don't mind including underscores).



Style remarks



  • JS uses K&R braces instead of Allman by convention.

  • Add a blank line above for and if blocks to ease vertical congestion.

  • Add a space around keywords and operators like for( and >=0, which are clearer as for ( and >= 0.

  • No need for parentheses around a return value.


  • array.push(str[i]) is missing a semicolon.

  • CodeReview's snippet autoformatter will automatically do most of this for you.

Rewrite 1






const palindrome = str => 
str = str.replace(/[^a-zd]/gi, "").toLowerCase();
return str === str.split("").reverse().join("");
;

console.log(palindrome("My age is 0, 0 si ega ym."));





Rewrite 2: uglier, but faster



Benchmark






const palindrome = str => 
str = str.replace(/[^a-zd]/gi, "").toLowerCase();
let left = 0;
let right = str.length;

while (left < right)
if (str[left++] !== str[--right])
return false;



return true;
;

[
"",
"a",
"aba",
"racecar",
"racecar ",
" racecar",
" race car",
" r r a c e c a rr ",
".a .. r . ... . .9f08e988-1e35-4dc6-a24a-5c7e03bce5ba$ $!ace ca r3 a",
].forEach(test => console.log(palindrome(test)));

console.log();
[
"ab",
"abc",
"racecars",
"racescar",
" ra scecar",
" r sace car",
"a r r a c e c a rr ",
" r r a c e c a rr a",
".a .. r . ... . .$$$ $!aces ca r a",
].forEach(test => console.log(palindrome(test)));








share|improve this answer











$endgroup$












  • $begingroup$
    Good points, just to make sure is the time complexity O(n) because the reverse function traverses through each element of the array?
    $endgroup$
    – DreamVision2017
    2 days ago











  • $begingroup$
    Your code makes ~11 trips over the n-sized input, which is why I mention the high constant factor. If you do the replacement and lowercasing one time, you can get away with about 6 trips through the input. I count any array function, loop or === as one trip over the input. This is a pretty minor concern relative to the other points, though, and addressing the style points accidentally improves your performance along the way.
    $endgroup$
    – ggorlen
    2 days ago






  • 1




    $begingroup$
    Small optimization for your rewrite, lowercase the string first and avoid the additional cost of a case-insensitive regex. There are larger optimizations that could also be done, but that make the code more complicated.
    $endgroup$
    – cbojar
    2 days ago






  • 1




    $begingroup$
    @Feathercrown ==/=== doesn't work on arrays, unfortunately, but good thought.
    $endgroup$
    – ggorlen
    2 days ago







  • 2




    $begingroup$
    Of course, the goal is to get an "easy to read" palindrome checker. Frankly, I doubt that the improvements to the efficiency of the method, impressive though they are, outweigh the looming disaster that would be maintaining or reading them.
    $endgroup$
    – Feathercrown
    2 days ago


















3












$begingroup$

Too much code.



  • You can return a boolean

Note that the positions of and



 if(str === reverseString(str)) 
return true;
else
return false;



Becomes



 return str === reverseString(str);


  • You can remove whites spaces and commas etc with regExp /W/g


  • Array has a reverse function which you can use rather than do it manually.


  • You should reverse the string in the function.


  • Strings are iterate-able so you can convert a string to an array with [...str]


Example



function isPalindrome(str) 
str = str.replace(/W/g,"").toLowerCase();
return str === [...str].reverse().join("");






share|improve this answer









$endgroup$












  • $begingroup$
    Ah I see, btw I tried to code from scratch as much as possible to get better at problem solving/ programming. Although you are right that there are many JS methods that would make it easier to implement a solution.
    $endgroup$
    – DreamVision2017
    2 days ago


















1












$begingroup$

The line to scrub punctuation and spaces could be simplified from:



str = str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");



to:



str = str.replace(/[^w]|_/g, "").toLowerCase();



Essentially, your original regex marks spaces as legal characters, which you're then going and later scrubbing out with .split(" ").join(""). By excluding the s in your regex, you cause the regex to match spaces in the string, which would then be replaced along with the punctuation in the str.replace method. See this regex101.



I'd also ask you to consider what it means to be a palindrome. Words like racecar. The way you're currently doing it is by reversing the string, and then checking equality. I suggest it could be half (worst case) or O(1) (best case) the complexity if you'd think about how you could check the front and the back of the string at the same time. I won't give you the code how to do this, but I'll outline the algorithm. Consider the word Urithiru, a faster way to check palindrome-ness would to be doing something like this: Take the first and last letters, compare them, if true, then grab the next in sequence (next from the start; next from reverse). Essentially the program would evaluate it in these steps:




  1. u == u: true


  2. r == r: true


  3. i == i: true


  4. t == h: false

Words like Urithiru and palindromes have the worst complexity cases for the algorithm because every letter must be checked to prove it's a palidrome. However, if you checked a work like supercalifragilisticexpialidocious, it'd only take two iterations, and then most words in the English language (the ones that don't start and end with the same letters), would be an O(1) result. For instance, English would fail after the first comparison.






share|improve this answer









$endgroup$




















    1












    $begingroup$

    I would suggest separating out the code to remove punctuation and convert to lowercase into a separate function (normalizeString), and make the reverseString and isPalindrome functions "purer". (This follows the Single Responsibility Principle.)



    function reverseString(str) 
    var array = [];

    for(var i = str.length - 1; i >= 0; --i)
    array.push(str[i]);


    return(array.join(""));


    function isPalindrome(str)
    let left = 0;
    let right = str.length;

    while (left < right)
    if (str[left++] !== str[--right])
    return false;



    return true;
    ;

    function normalizeString(str) _/g, "").toLowerCase().split(" ").join("");


    // reverseString(normalizeString(...));
    // isPalindrome(normalizeString(...));





    share|improve this answer









    $endgroup$












    • $begingroup$
      Ok, but I'm a little confused on why you used the while loop on your palindrome function, when you can use the reverseString or array.reverse() to compare both strings? It's actually why I created that function.
      $endgroup$
      – DreamVision2017
      yesterday











    • $begingroup$
      @DreamVision2017 For efficiency: this isPalindrome implementation can stop as soon as it finds a pair of characters that don't match.
      $endgroup$
      – Solomon Ucko
      yesterday


















    0












    $begingroup$

    The main contribution of this answer is to use toLowerCase() before the regex, so the regex does less work. Note that I don't know if that would benefit performance at all - profile it if you are curious.



    // private implementation - separated for ease of testing
    const _isPalindrome = x => x===[...x].reverse().join('');
    const _alphanum = x => x.toLowerCase().replace(/[^a-zs]/g, '');

    // public interface - combined for ease of use
    const isPalindrome = x => _isPalindrome(_alphanum(x));


    This may be unpopular, but I prefer terse/abstract argument names x and y over longer, more specific names. It's similar to using i as a loop variable - it makes it easier to see the structure of the code.






    share|improve this answer









    $endgroup$













      Your Answer





      StackExchange.ifUsing("editor", function ()
      return StackExchange.using("mathjaxEditing", function ()
      StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
      StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
      );
      );
      , "mathjax-editing");

      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "196"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













      draft saved

      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216534%2feasy-to-read-palindrome-checker%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      5 Answers
      5






      active

      oldest

      votes








      5 Answers
      5






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      12












      $begingroup$

      Time complexity



      Your time complexity is linear but you can save a few traversals over the string and lower the constant factor as you improve readability. Checking whether a string is a palindrome can be done in one pass with two pointers at each end of the string (plus some conditionals for your special characters), but this gains speed at the expense of readability; I'd encourage a round of clean-up before going for optimizations.



      Repeated code



      Repeated code harms maintainability and readability. Notice that the line



      str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");


      appears in two places in the code. If you decide to change one to accept a different regex but forget to change the other one, you've introduced a potentially subtle bug into your program. Move this to its own function to avoid duplication.



      Use accurate function names and use builtins



      reverseString is a confusing function: it does more than reversing a string as advertised: it also strips whitespace and punctuation, which would be very surprising if I called this function as a user of your library without knowing its internals. All functions should operate as black boxes that perform the task they claim to, nothing more or less.



      The array prototype already has a reverse() function, so there's no need to write this out by hand.



      Avoid unnecessary verbosity



      The code:



       if(str === reverseString(str))

      return true;

      else

      return false;



      is clearer written as return str === reverseString(str);, which says "return the logical result of comparing str and its reversal".



      Improve the regex to match your specification



      Including spaces in your regex substitution to "" is easier than .split(" ").join(""). If you wish to remove all non-alphanumeric characters, a regex like /[^a-zd]/gi reflects your written specification accurately (or use W if you don't mind including underscores).



      Style remarks



      • JS uses K&R braces instead of Allman by convention.

      • Add a blank line above for and if blocks to ease vertical congestion.

      • Add a space around keywords and operators like for( and >=0, which are clearer as for ( and >= 0.

      • No need for parentheses around a return value.


      • array.push(str[i]) is missing a semicolon.

      • CodeReview's snippet autoformatter will automatically do most of this for you.

      Rewrite 1






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      return str === str.split("").reverse().join("");
      ;

      console.log(palindrome("My age is 0, 0 si ega ym."));





      Rewrite 2: uglier, but faster



      Benchmark






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      let left = 0;
      let right = str.length;

      while (left < right)
      if (str[left++] !== str[--right])
      return false;



      return true;
      ;

      [
      "",
      "a",
      "aba",
      "racecar",
      "racecar ",
      " racecar",
      " race car",
      " r r a c e c a rr ",
      ".a .. r . ... . .9f08e988-1e35-4dc6-a24a-5c7e03bce5ba$ $!ace ca r3 a",
      ].forEach(test => console.log(palindrome(test)));

      console.log();
      [
      "ab",
      "abc",
      "racecars",
      "racescar",
      " ra scecar",
      " r sace car",
      "a r r a c e c a rr ",
      " r r a c e c a rr a",
      ".a .. r . ... . .$$$ $!aces ca r a",
      ].forEach(test => console.log(palindrome(test)));








      share|improve this answer











      $endgroup$












      • $begingroup$
        Good points, just to make sure is the time complexity O(n) because the reverse function traverses through each element of the array?
        $endgroup$
        – DreamVision2017
        2 days ago











      • $begingroup$
        Your code makes ~11 trips over the n-sized input, which is why I mention the high constant factor. If you do the replacement and lowercasing one time, you can get away with about 6 trips through the input. I count any array function, loop or === as one trip over the input. This is a pretty minor concern relative to the other points, though, and addressing the style points accidentally improves your performance along the way.
        $endgroup$
        – ggorlen
        2 days ago






      • 1




        $begingroup$
        Small optimization for your rewrite, lowercase the string first and avoid the additional cost of a case-insensitive regex. There are larger optimizations that could also be done, but that make the code more complicated.
        $endgroup$
        – cbojar
        2 days ago






      • 1




        $begingroup$
        @Feathercrown ==/=== doesn't work on arrays, unfortunately, but good thought.
        $endgroup$
        – ggorlen
        2 days ago







      • 2




        $begingroup$
        Of course, the goal is to get an "easy to read" palindrome checker. Frankly, I doubt that the improvements to the efficiency of the method, impressive though they are, outweigh the looming disaster that would be maintaining or reading them.
        $endgroup$
        – Feathercrown
        2 days ago















      12












      $begingroup$

      Time complexity



      Your time complexity is linear but you can save a few traversals over the string and lower the constant factor as you improve readability. Checking whether a string is a palindrome can be done in one pass with two pointers at each end of the string (plus some conditionals for your special characters), but this gains speed at the expense of readability; I'd encourage a round of clean-up before going for optimizations.



      Repeated code



      Repeated code harms maintainability and readability. Notice that the line



      str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");


      appears in two places in the code. If you decide to change one to accept a different regex but forget to change the other one, you've introduced a potentially subtle bug into your program. Move this to its own function to avoid duplication.



      Use accurate function names and use builtins



      reverseString is a confusing function: it does more than reversing a string as advertised: it also strips whitespace and punctuation, which would be very surprising if I called this function as a user of your library without knowing its internals. All functions should operate as black boxes that perform the task they claim to, nothing more or less.



      The array prototype already has a reverse() function, so there's no need to write this out by hand.



      Avoid unnecessary verbosity



      The code:



       if(str === reverseString(str))

      return true;

      else

      return false;



      is clearer written as return str === reverseString(str);, which says "return the logical result of comparing str and its reversal".



      Improve the regex to match your specification



      Including spaces in your regex substitution to "" is easier than .split(" ").join(""). If you wish to remove all non-alphanumeric characters, a regex like /[^a-zd]/gi reflects your written specification accurately (or use W if you don't mind including underscores).



      Style remarks



      • JS uses K&R braces instead of Allman by convention.

      • Add a blank line above for and if blocks to ease vertical congestion.

      • Add a space around keywords and operators like for( and >=0, which are clearer as for ( and >= 0.

      • No need for parentheses around a return value.


      • array.push(str[i]) is missing a semicolon.

      • CodeReview's snippet autoformatter will automatically do most of this for you.

      Rewrite 1






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      return str === str.split("").reverse().join("");
      ;

      console.log(palindrome("My age is 0, 0 si ega ym."));





      Rewrite 2: uglier, but faster



      Benchmark






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      let left = 0;
      let right = str.length;

      while (left < right)
      if (str[left++] !== str[--right])
      return false;



      return true;
      ;

      [
      "",
      "a",
      "aba",
      "racecar",
      "racecar ",
      " racecar",
      " race car",
      " r r a c e c a rr ",
      ".a .. r . ... . .9f08e988-1e35-4dc6-a24a-5c7e03bce5ba$ $!ace ca r3 a",
      ].forEach(test => console.log(palindrome(test)));

      console.log();
      [
      "ab",
      "abc",
      "racecars",
      "racescar",
      " ra scecar",
      " r sace car",
      "a r r a c e c a rr ",
      " r r a c e c a rr a",
      ".a .. r . ... . .$$$ $!aces ca r a",
      ].forEach(test => console.log(palindrome(test)));








      share|improve this answer











      $endgroup$












      • $begingroup$
        Good points, just to make sure is the time complexity O(n) because the reverse function traverses through each element of the array?
        $endgroup$
        – DreamVision2017
        2 days ago











      • $begingroup$
        Your code makes ~11 trips over the n-sized input, which is why I mention the high constant factor. If you do the replacement and lowercasing one time, you can get away with about 6 trips through the input. I count any array function, loop or === as one trip over the input. This is a pretty minor concern relative to the other points, though, and addressing the style points accidentally improves your performance along the way.
        $endgroup$
        – ggorlen
        2 days ago






      • 1




        $begingroup$
        Small optimization for your rewrite, lowercase the string first and avoid the additional cost of a case-insensitive regex. There are larger optimizations that could also be done, but that make the code more complicated.
        $endgroup$
        – cbojar
        2 days ago






      • 1




        $begingroup$
        @Feathercrown ==/=== doesn't work on arrays, unfortunately, but good thought.
        $endgroup$
        – ggorlen
        2 days ago







      • 2




        $begingroup$
        Of course, the goal is to get an "easy to read" palindrome checker. Frankly, I doubt that the improvements to the efficiency of the method, impressive though they are, outweigh the looming disaster that would be maintaining or reading them.
        $endgroup$
        – Feathercrown
        2 days ago













      12












      12








      12





      $begingroup$

      Time complexity



      Your time complexity is linear but you can save a few traversals over the string and lower the constant factor as you improve readability. Checking whether a string is a palindrome can be done in one pass with two pointers at each end of the string (plus some conditionals for your special characters), but this gains speed at the expense of readability; I'd encourage a round of clean-up before going for optimizations.



      Repeated code



      Repeated code harms maintainability and readability. Notice that the line



      str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");


      appears in two places in the code. If you decide to change one to accept a different regex but forget to change the other one, you've introduced a potentially subtle bug into your program. Move this to its own function to avoid duplication.



      Use accurate function names and use builtins



      reverseString is a confusing function: it does more than reversing a string as advertised: it also strips whitespace and punctuation, which would be very surprising if I called this function as a user of your library without knowing its internals. All functions should operate as black boxes that perform the task they claim to, nothing more or less.



      The array prototype already has a reverse() function, so there's no need to write this out by hand.



      Avoid unnecessary verbosity



      The code:



       if(str === reverseString(str))

      return true;

      else

      return false;



      is clearer written as return str === reverseString(str);, which says "return the logical result of comparing str and its reversal".



      Improve the regex to match your specification



      Including spaces in your regex substitution to "" is easier than .split(" ").join(""). If you wish to remove all non-alphanumeric characters, a regex like /[^a-zd]/gi reflects your written specification accurately (or use W if you don't mind including underscores).



      Style remarks



      • JS uses K&R braces instead of Allman by convention.

      • Add a blank line above for and if blocks to ease vertical congestion.

      • Add a space around keywords and operators like for( and >=0, which are clearer as for ( and >= 0.

      • No need for parentheses around a return value.


      • array.push(str[i]) is missing a semicolon.

      • CodeReview's snippet autoformatter will automatically do most of this for you.

      Rewrite 1






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      return str === str.split("").reverse().join("");
      ;

      console.log(palindrome("My age is 0, 0 si ega ym."));





      Rewrite 2: uglier, but faster



      Benchmark






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      let left = 0;
      let right = str.length;

      while (left < right)
      if (str[left++] !== str[--right])
      return false;



      return true;
      ;

      [
      "",
      "a",
      "aba",
      "racecar",
      "racecar ",
      " racecar",
      " race car",
      " r r a c e c a rr ",
      ".a .. r . ... . .9f08e988-1e35-4dc6-a24a-5c7e03bce5ba$ $!ace ca r3 a",
      ].forEach(test => console.log(palindrome(test)));

      console.log();
      [
      "ab",
      "abc",
      "racecars",
      "racescar",
      " ra scecar",
      " r sace car",
      "a r r a c e c a rr ",
      " r r a c e c a rr a",
      ".a .. r . ... . .$$$ $!aces ca r a",
      ].forEach(test => console.log(palindrome(test)));








      share|improve this answer











      $endgroup$



      Time complexity



      Your time complexity is linear but you can save a few traversals over the string and lower the constant factor as you improve readability. Checking whether a string is a palindrome can be done in one pass with two pointers at each end of the string (plus some conditionals for your special characters), but this gains speed at the expense of readability; I'd encourage a round of clean-up before going for optimizations.



      Repeated code



      Repeated code harms maintainability and readability. Notice that the line



      str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");


      appears in two places in the code. If you decide to change one to accept a different regex but forget to change the other one, you've introduced a potentially subtle bug into your program. Move this to its own function to avoid duplication.



      Use accurate function names and use builtins



      reverseString is a confusing function: it does more than reversing a string as advertised: it also strips whitespace and punctuation, which would be very surprising if I called this function as a user of your library without knowing its internals. All functions should operate as black boxes that perform the task they claim to, nothing more or less.



      The array prototype already has a reverse() function, so there's no need to write this out by hand.



      Avoid unnecessary verbosity



      The code:



       if(str === reverseString(str))

      return true;

      else

      return false;



      is clearer written as return str === reverseString(str);, which says "return the logical result of comparing str and its reversal".



      Improve the regex to match your specification



      Including spaces in your regex substitution to "" is easier than .split(" ").join(""). If you wish to remove all non-alphanumeric characters, a regex like /[^a-zd]/gi reflects your written specification accurately (or use W if you don't mind including underscores).



      Style remarks



      • JS uses K&R braces instead of Allman by convention.

      • Add a blank line above for and if blocks to ease vertical congestion.

      • Add a space around keywords and operators like for( and >=0, which are clearer as for ( and >= 0.

      • No need for parentheses around a return value.


      • array.push(str[i]) is missing a semicolon.

      • CodeReview's snippet autoformatter will automatically do most of this for you.

      Rewrite 1






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      return str === str.split("").reverse().join("");
      ;

      console.log(palindrome("My age is 0, 0 si ega ym."));





      Rewrite 2: uglier, but faster



      Benchmark






      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      let left = 0;
      let right = str.length;

      while (left < right)
      if (str[left++] !== str[--right])
      return false;



      return true;
      ;

      [
      "",
      "a",
      "aba",
      "racecar",
      "racecar ",
      " racecar",
      " race car",
      " r r a c e c a rr ",
      ".a .. r . ... . .9f08e988-1e35-4dc6-a24a-5c7e03bce5ba$ $!ace ca r3 a",
      ].forEach(test => console.log(palindrome(test)));

      console.log();
      [
      "ab",
      "abc",
      "racecars",
      "racescar",
      " ra scecar",
      " r sace car",
      "a r r a c e c a rr ",
      " r r a c e c a rr a",
      ".a .. r . ... . .$$$ $!aces ca r a",
      ].forEach(test => console.log(palindrome(test)));








      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      return str === str.split("").reverse().join("");
      ;

      console.log(palindrome("My age is 0, 0 si ega ym."));





      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      return str === str.split("").reverse().join("");
      ;

      console.log(palindrome("My age is 0, 0 si ega ym."));





      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      let left = 0;
      let right = str.length;

      while (left < right)
      if (str[left++] !== str[--right])
      return false;



      return true;
      ;

      [
      "",
      "a",
      "aba",
      "racecar",
      "racecar ",
      " racecar",
      " race car",
      " r r a c e c a rr ",
      ".a .. r . ... . .9f08e988-1e35-4dc6-a24a-5c7e03bce5ba$ $!ace ca r3 a",
      ].forEach(test => console.log(palindrome(test)));

      console.log();
      [
      "ab",
      "abc",
      "racecars",
      "racescar",
      " ra scecar",
      " r sace car",
      "a r r a c e c a rr ",
      " r r a c e c a rr a",
      ".a .. r . ... . .$$$ $!aces ca r a",
      ].forEach(test => console.log(palindrome(test)));





      const palindrome = str => 
      str = str.replace(/[^a-zd]/gi, "").toLowerCase();
      let left = 0;
      let right = str.length;

      while (left < right)
      if (str[left++] !== str[--right])
      return false;



      return true;
      ;

      [
      "",
      "a",
      "aba",
      "racecar",
      "racecar ",
      " racecar",
      " race car",
      " r r a c e c a rr ",
      ".a .. r . ... . .9f08e988-1e35-4dc6-a24a-5c7e03bce5ba$ $!ace ca r3 a",
      ].forEach(test => console.log(palindrome(test)));

      console.log();
      [
      "ab",
      "abc",
      "racecars",
      "racescar",
      " ra scecar",
      " r sace car",
      "a r r a c e c a rr ",
      " r r a c e c a rr a",
      ".a .. r . ... . .$$$ $!aces ca r a",
      ].forEach(test => console.log(palindrome(test)));






      share|improve this answer














      share|improve this answer



      share|improve this answer








      edited 2 days ago

























      answered 2 days ago









      ggorlenggorlen

      526212




      526212











      • $begingroup$
        Good points, just to make sure is the time complexity O(n) because the reverse function traverses through each element of the array?
        $endgroup$
        – DreamVision2017
        2 days ago











      • $begingroup$
        Your code makes ~11 trips over the n-sized input, which is why I mention the high constant factor. If you do the replacement and lowercasing one time, you can get away with about 6 trips through the input. I count any array function, loop or === as one trip over the input. This is a pretty minor concern relative to the other points, though, and addressing the style points accidentally improves your performance along the way.
        $endgroup$
        – ggorlen
        2 days ago






      • 1




        $begingroup$
        Small optimization for your rewrite, lowercase the string first and avoid the additional cost of a case-insensitive regex. There are larger optimizations that could also be done, but that make the code more complicated.
        $endgroup$
        – cbojar
        2 days ago






      • 1




        $begingroup$
        @Feathercrown ==/=== doesn't work on arrays, unfortunately, but good thought.
        $endgroup$
        – ggorlen
        2 days ago







      • 2




        $begingroup$
        Of course, the goal is to get an "easy to read" palindrome checker. Frankly, I doubt that the improvements to the efficiency of the method, impressive though they are, outweigh the looming disaster that would be maintaining or reading them.
        $endgroup$
        – Feathercrown
        2 days ago
















      • $begingroup$
        Good points, just to make sure is the time complexity O(n) because the reverse function traverses through each element of the array?
        $endgroup$
        – DreamVision2017
        2 days ago











      • $begingroup$
        Your code makes ~11 trips over the n-sized input, which is why I mention the high constant factor. If you do the replacement and lowercasing one time, you can get away with about 6 trips through the input. I count any array function, loop or === as one trip over the input. This is a pretty minor concern relative to the other points, though, and addressing the style points accidentally improves your performance along the way.
        $endgroup$
        – ggorlen
        2 days ago






      • 1




        $begingroup$
        Small optimization for your rewrite, lowercase the string first and avoid the additional cost of a case-insensitive regex. There are larger optimizations that could also be done, but that make the code more complicated.
        $endgroup$
        – cbojar
        2 days ago






      • 1




        $begingroup$
        @Feathercrown ==/=== doesn't work on arrays, unfortunately, but good thought.
        $endgroup$
        – ggorlen
        2 days ago







      • 2




        $begingroup$
        Of course, the goal is to get an "easy to read" palindrome checker. Frankly, I doubt that the improvements to the efficiency of the method, impressive though they are, outweigh the looming disaster that would be maintaining or reading them.
        $endgroup$
        – Feathercrown
        2 days ago















      $begingroup$
      Good points, just to make sure is the time complexity O(n) because the reverse function traverses through each element of the array?
      $endgroup$
      – DreamVision2017
      2 days ago





      $begingroup$
      Good points, just to make sure is the time complexity O(n) because the reverse function traverses through each element of the array?
      $endgroup$
      – DreamVision2017
      2 days ago













      $begingroup$
      Your code makes ~11 trips over the n-sized input, which is why I mention the high constant factor. If you do the replacement and lowercasing one time, you can get away with about 6 trips through the input. I count any array function, loop or === as one trip over the input. This is a pretty minor concern relative to the other points, though, and addressing the style points accidentally improves your performance along the way.
      $endgroup$
      – ggorlen
      2 days ago




      $begingroup$
      Your code makes ~11 trips over the n-sized input, which is why I mention the high constant factor. If you do the replacement and lowercasing one time, you can get away with about 6 trips through the input. I count any array function, loop or === as one trip over the input. This is a pretty minor concern relative to the other points, though, and addressing the style points accidentally improves your performance along the way.
      $endgroup$
      – ggorlen
      2 days ago




      1




      1




      $begingroup$
      Small optimization for your rewrite, lowercase the string first and avoid the additional cost of a case-insensitive regex. There are larger optimizations that could also be done, but that make the code more complicated.
      $endgroup$
      – cbojar
      2 days ago




      $begingroup$
      Small optimization for your rewrite, lowercase the string first and avoid the additional cost of a case-insensitive regex. There are larger optimizations that could also be done, but that make the code more complicated.
      $endgroup$
      – cbojar
      2 days ago




      1




      1




      $begingroup$
      @Feathercrown ==/=== doesn't work on arrays, unfortunately, but good thought.
      $endgroup$
      – ggorlen
      2 days ago





      $begingroup$
      @Feathercrown ==/=== doesn't work on arrays, unfortunately, but good thought.
      $endgroup$
      – ggorlen
      2 days ago





      2




      2




      $begingroup$
      Of course, the goal is to get an "easy to read" palindrome checker. Frankly, I doubt that the improvements to the efficiency of the method, impressive though they are, outweigh the looming disaster that would be maintaining or reading them.
      $endgroup$
      – Feathercrown
      2 days ago




      $begingroup$
      Of course, the goal is to get an "easy to read" palindrome checker. Frankly, I doubt that the improvements to the efficiency of the method, impressive though they are, outweigh the looming disaster that would be maintaining or reading them.
      $endgroup$
      – Feathercrown
      2 days ago













      3












      $begingroup$

      Too much code.



      • You can return a boolean

      Note that the positions of and



       if(str === reverseString(str)) 
      return true;
      else
      return false;



      Becomes



       return str === reverseString(str);


      • You can remove whites spaces and commas etc with regExp /W/g


      • Array has a reverse function which you can use rather than do it manually.


      • You should reverse the string in the function.


      • Strings are iterate-able so you can convert a string to an array with [...str]


      Example



      function isPalindrome(str) 
      str = str.replace(/W/g,"").toLowerCase();
      return str === [...str].reverse().join("");






      share|improve this answer









      $endgroup$












      • $begingroup$
        Ah I see, btw I tried to code from scratch as much as possible to get better at problem solving/ programming. Although you are right that there are many JS methods that would make it easier to implement a solution.
        $endgroup$
        – DreamVision2017
        2 days ago















      3












      $begingroup$

      Too much code.



      • You can return a boolean

      Note that the positions of and



       if(str === reverseString(str)) 
      return true;
      else
      return false;



      Becomes



       return str === reverseString(str);


      • You can remove whites spaces and commas etc with regExp /W/g


      • Array has a reverse function which you can use rather than do it manually.


      • You should reverse the string in the function.


      • Strings are iterate-able so you can convert a string to an array with [...str]


      Example



      function isPalindrome(str) 
      str = str.replace(/W/g,"").toLowerCase();
      return str === [...str].reverse().join("");






      share|improve this answer









      $endgroup$












      • $begingroup$
        Ah I see, btw I tried to code from scratch as much as possible to get better at problem solving/ programming. Although you are right that there are many JS methods that would make it easier to implement a solution.
        $endgroup$
        – DreamVision2017
        2 days ago













      3












      3








      3





      $begingroup$

      Too much code.



      • You can return a boolean

      Note that the positions of and



       if(str === reverseString(str)) 
      return true;
      else
      return false;



      Becomes



       return str === reverseString(str);


      • You can remove whites spaces and commas etc with regExp /W/g


      • Array has a reverse function which you can use rather than do it manually.


      • You should reverse the string in the function.


      • Strings are iterate-able so you can convert a string to an array with [...str]


      Example



      function isPalindrome(str) 
      str = str.replace(/W/g,"").toLowerCase();
      return str === [...str].reverse().join("");






      share|improve this answer









      $endgroup$



      Too much code.



      • You can return a boolean

      Note that the positions of and



       if(str === reverseString(str)) 
      return true;
      else
      return false;



      Becomes



       return str === reverseString(str);


      • You can remove whites spaces and commas etc with regExp /W/g


      • Array has a reverse function which you can use rather than do it manually.


      • You should reverse the string in the function.


      • Strings are iterate-able so you can convert a string to an array with [...str]


      Example



      function isPalindrome(str) 
      str = str.replace(/W/g,"").toLowerCase();
      return str === [...str].reverse().join("");







      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered 2 days ago









      Blindman67Blindman67

      9,1351621




      9,1351621











      • $begingroup$
        Ah I see, btw I tried to code from scratch as much as possible to get better at problem solving/ programming. Although you are right that there are many JS methods that would make it easier to implement a solution.
        $endgroup$
        – DreamVision2017
        2 days ago
















      • $begingroup$
        Ah I see, btw I tried to code from scratch as much as possible to get better at problem solving/ programming. Although you are right that there are many JS methods that would make it easier to implement a solution.
        $endgroup$
        – DreamVision2017
        2 days ago















      $begingroup$
      Ah I see, btw I tried to code from scratch as much as possible to get better at problem solving/ programming. Although you are right that there are many JS methods that would make it easier to implement a solution.
      $endgroup$
      – DreamVision2017
      2 days ago




      $begingroup$
      Ah I see, btw I tried to code from scratch as much as possible to get better at problem solving/ programming. Although you are right that there are many JS methods that would make it easier to implement a solution.
      $endgroup$
      – DreamVision2017
      2 days ago











      1












      $begingroup$

      The line to scrub punctuation and spaces could be simplified from:



      str = str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");



      to:



      str = str.replace(/[^w]|_/g, "").toLowerCase();



      Essentially, your original regex marks spaces as legal characters, which you're then going and later scrubbing out with .split(" ").join(""). By excluding the s in your regex, you cause the regex to match spaces in the string, which would then be replaced along with the punctuation in the str.replace method. See this regex101.



      I'd also ask you to consider what it means to be a palindrome. Words like racecar. The way you're currently doing it is by reversing the string, and then checking equality. I suggest it could be half (worst case) or O(1) (best case) the complexity if you'd think about how you could check the front and the back of the string at the same time. I won't give you the code how to do this, but I'll outline the algorithm. Consider the word Urithiru, a faster way to check palindrome-ness would to be doing something like this: Take the first and last letters, compare them, if true, then grab the next in sequence (next from the start; next from reverse). Essentially the program would evaluate it in these steps:




      1. u == u: true


      2. r == r: true


      3. i == i: true


      4. t == h: false

      Words like Urithiru and palindromes have the worst complexity cases for the algorithm because every letter must be checked to prove it's a palidrome. However, if you checked a work like supercalifragilisticexpialidocious, it'd only take two iterations, and then most words in the English language (the ones that don't start and end with the same letters), would be an O(1) result. For instance, English would fail after the first comparison.






      share|improve this answer









      $endgroup$

















        1












        $begingroup$

        The line to scrub punctuation and spaces could be simplified from:



        str = str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");



        to:



        str = str.replace(/[^w]|_/g, "").toLowerCase();



        Essentially, your original regex marks spaces as legal characters, which you're then going and later scrubbing out with .split(" ").join(""). By excluding the s in your regex, you cause the regex to match spaces in the string, which would then be replaced along with the punctuation in the str.replace method. See this regex101.



        I'd also ask you to consider what it means to be a palindrome. Words like racecar. The way you're currently doing it is by reversing the string, and then checking equality. I suggest it could be half (worst case) or O(1) (best case) the complexity if you'd think about how you could check the front and the back of the string at the same time. I won't give you the code how to do this, but I'll outline the algorithm. Consider the word Urithiru, a faster way to check palindrome-ness would to be doing something like this: Take the first and last letters, compare them, if true, then grab the next in sequence (next from the start; next from reverse). Essentially the program would evaluate it in these steps:




        1. u == u: true


        2. r == r: true


        3. i == i: true


        4. t == h: false

        Words like Urithiru and palindromes have the worst complexity cases for the algorithm because every letter must be checked to prove it's a palidrome. However, if you checked a work like supercalifragilisticexpialidocious, it'd only take two iterations, and then most words in the English language (the ones that don't start and end with the same letters), would be an O(1) result. For instance, English would fail after the first comparison.






        share|improve this answer









        $endgroup$















          1












          1








          1





          $begingroup$

          The line to scrub punctuation and spaces could be simplified from:



          str = str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");



          to:



          str = str.replace(/[^w]|_/g, "").toLowerCase();



          Essentially, your original regex marks spaces as legal characters, which you're then going and later scrubbing out with .split(" ").join(""). By excluding the s in your regex, you cause the regex to match spaces in the string, which would then be replaced along with the punctuation in the str.replace method. See this regex101.



          I'd also ask you to consider what it means to be a palindrome. Words like racecar. The way you're currently doing it is by reversing the string, and then checking equality. I suggest it could be half (worst case) or O(1) (best case) the complexity if you'd think about how you could check the front and the back of the string at the same time. I won't give you the code how to do this, but I'll outline the algorithm. Consider the word Urithiru, a faster way to check palindrome-ness would to be doing something like this: Take the first and last letters, compare them, if true, then grab the next in sequence (next from the start; next from reverse). Essentially the program would evaluate it in these steps:




          1. u == u: true


          2. r == r: true


          3. i == i: true


          4. t == h: false

          Words like Urithiru and palindromes have the worst complexity cases for the algorithm because every letter must be checked to prove it's a palidrome. However, if you checked a work like supercalifragilisticexpialidocious, it'd only take two iterations, and then most words in the English language (the ones that don't start and end with the same letters), would be an O(1) result. For instance, English would fail after the first comparison.






          share|improve this answer









          $endgroup$



          The line to scrub punctuation and spaces could be simplified from:



          str = str.replace(/[^ws]|_/g, "").toLowerCase().split(" ").join("");



          to:



          str = str.replace(/[^w]|_/g, "").toLowerCase();



          Essentially, your original regex marks spaces as legal characters, which you're then going and later scrubbing out with .split(" ").join(""). By excluding the s in your regex, you cause the regex to match spaces in the string, which would then be replaced along with the punctuation in the str.replace method. See this regex101.



          I'd also ask you to consider what it means to be a palindrome. Words like racecar. The way you're currently doing it is by reversing the string, and then checking equality. I suggest it could be half (worst case) or O(1) (best case) the complexity if you'd think about how you could check the front and the back of the string at the same time. I won't give you the code how to do this, but I'll outline the algorithm. Consider the word Urithiru, a faster way to check palindrome-ness would to be doing something like this: Take the first and last letters, compare them, if true, then grab the next in sequence (next from the start; next from reverse). Essentially the program would evaluate it in these steps:




          1. u == u: true


          2. r == r: true


          3. i == i: true


          4. t == h: false

          Words like Urithiru and palindromes have the worst complexity cases for the algorithm because every letter must be checked to prove it's a palidrome. However, if you checked a work like supercalifragilisticexpialidocious, it'd only take two iterations, and then most words in the English language (the ones that don't start and end with the same letters), would be an O(1) result. For instance, English would fail after the first comparison.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 2 days ago









          user138741user138741

          1634




          1634





















              1












              $begingroup$

              I would suggest separating out the code to remove punctuation and convert to lowercase into a separate function (normalizeString), and make the reverseString and isPalindrome functions "purer". (This follows the Single Responsibility Principle.)



              function reverseString(str) 
              var array = [];

              for(var i = str.length - 1; i >= 0; --i)
              array.push(str[i]);


              return(array.join(""));


              function isPalindrome(str)
              let left = 0;
              let right = str.length;

              while (left < right)
              if (str[left++] !== str[--right])
              return false;



              return true;
              ;

              function normalizeString(str) _/g, "").toLowerCase().split(" ").join("");


              // reverseString(normalizeString(...));
              // isPalindrome(normalizeString(...));





              share|improve this answer









              $endgroup$












              • $begingroup$
                Ok, but I'm a little confused on why you used the while loop on your palindrome function, when you can use the reverseString or array.reverse() to compare both strings? It's actually why I created that function.
                $endgroup$
                – DreamVision2017
                yesterday











              • $begingroup$
                @DreamVision2017 For efficiency: this isPalindrome implementation can stop as soon as it finds a pair of characters that don't match.
                $endgroup$
                – Solomon Ucko
                yesterday















              1












              $begingroup$

              I would suggest separating out the code to remove punctuation and convert to lowercase into a separate function (normalizeString), and make the reverseString and isPalindrome functions "purer". (This follows the Single Responsibility Principle.)



              function reverseString(str) 
              var array = [];

              for(var i = str.length - 1; i >= 0; --i)
              array.push(str[i]);


              return(array.join(""));


              function isPalindrome(str)
              let left = 0;
              let right = str.length;

              while (left < right)
              if (str[left++] !== str[--right])
              return false;



              return true;
              ;

              function normalizeString(str) _/g, "").toLowerCase().split(" ").join("");


              // reverseString(normalizeString(...));
              // isPalindrome(normalizeString(...));





              share|improve this answer









              $endgroup$












              • $begingroup$
                Ok, but I'm a little confused on why you used the while loop on your palindrome function, when you can use the reverseString or array.reverse() to compare both strings? It's actually why I created that function.
                $endgroup$
                – DreamVision2017
                yesterday











              • $begingroup$
                @DreamVision2017 For efficiency: this isPalindrome implementation can stop as soon as it finds a pair of characters that don't match.
                $endgroup$
                – Solomon Ucko
                yesterday













              1












              1








              1





              $begingroup$

              I would suggest separating out the code to remove punctuation and convert to lowercase into a separate function (normalizeString), and make the reverseString and isPalindrome functions "purer". (This follows the Single Responsibility Principle.)



              function reverseString(str) 
              var array = [];

              for(var i = str.length - 1; i >= 0; --i)
              array.push(str[i]);


              return(array.join(""));


              function isPalindrome(str)
              let left = 0;
              let right = str.length;

              while (left < right)
              if (str[left++] !== str[--right])
              return false;



              return true;
              ;

              function normalizeString(str) _/g, "").toLowerCase().split(" ").join("");


              // reverseString(normalizeString(...));
              // isPalindrome(normalizeString(...));





              share|improve this answer









              $endgroup$



              I would suggest separating out the code to remove punctuation and convert to lowercase into a separate function (normalizeString), and make the reverseString and isPalindrome functions "purer". (This follows the Single Responsibility Principle.)



              function reverseString(str) 
              var array = [];

              for(var i = str.length - 1; i >= 0; --i)
              array.push(str[i]);


              return(array.join(""));


              function isPalindrome(str)
              let left = 0;
              let right = str.length;

              while (left < right)
              if (str[left++] !== str[--right])
              return false;



              return true;
              ;

              function normalizeString(str) _/g, "").toLowerCase().split(" ").join("");


              // reverseString(normalizeString(...));
              // isPalindrome(normalizeString(...));






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered yesterday









              Solomon UckoSolomon Ucko

              1,1851415




              1,1851415











              • $begingroup$
                Ok, but I'm a little confused on why you used the while loop on your palindrome function, when you can use the reverseString or array.reverse() to compare both strings? It's actually why I created that function.
                $endgroup$
                – DreamVision2017
                yesterday











              • $begingroup$
                @DreamVision2017 For efficiency: this isPalindrome implementation can stop as soon as it finds a pair of characters that don't match.
                $endgroup$
                – Solomon Ucko
                yesterday
















              • $begingroup$
                Ok, but I'm a little confused on why you used the while loop on your palindrome function, when you can use the reverseString or array.reverse() to compare both strings? It's actually why I created that function.
                $endgroup$
                – DreamVision2017
                yesterday











              • $begingroup$
                @DreamVision2017 For efficiency: this isPalindrome implementation can stop as soon as it finds a pair of characters that don't match.
                $endgroup$
                – Solomon Ucko
                yesterday















              $begingroup$
              Ok, but I'm a little confused on why you used the while loop on your palindrome function, when you can use the reverseString or array.reverse() to compare both strings? It's actually why I created that function.
              $endgroup$
              – DreamVision2017
              yesterday





              $begingroup$
              Ok, but I'm a little confused on why you used the while loop on your palindrome function, when you can use the reverseString or array.reverse() to compare both strings? It's actually why I created that function.
              $endgroup$
              – DreamVision2017
              yesterday













              $begingroup$
              @DreamVision2017 For efficiency: this isPalindrome implementation can stop as soon as it finds a pair of characters that don't match.
              $endgroup$
              – Solomon Ucko
              yesterday




              $begingroup$
              @DreamVision2017 For efficiency: this isPalindrome implementation can stop as soon as it finds a pair of characters that don't match.
              $endgroup$
              – Solomon Ucko
              yesterday











              0












              $begingroup$

              The main contribution of this answer is to use toLowerCase() before the regex, so the regex does less work. Note that I don't know if that would benefit performance at all - profile it if you are curious.



              // private implementation - separated for ease of testing
              const _isPalindrome = x => x===[...x].reverse().join('');
              const _alphanum = x => x.toLowerCase().replace(/[^a-zs]/g, '');

              // public interface - combined for ease of use
              const isPalindrome = x => _isPalindrome(_alphanum(x));


              This may be unpopular, but I prefer terse/abstract argument names x and y over longer, more specific names. It's similar to using i as a loop variable - it makes it easier to see the structure of the code.






              share|improve this answer









              $endgroup$

















                0












                $begingroup$

                The main contribution of this answer is to use toLowerCase() before the regex, so the regex does less work. Note that I don't know if that would benefit performance at all - profile it if you are curious.



                // private implementation - separated for ease of testing
                const _isPalindrome = x => x===[...x].reverse().join('');
                const _alphanum = x => x.toLowerCase().replace(/[^a-zs]/g, '');

                // public interface - combined for ease of use
                const isPalindrome = x => _isPalindrome(_alphanum(x));


                This may be unpopular, but I prefer terse/abstract argument names x and y over longer, more specific names. It's similar to using i as a loop variable - it makes it easier to see the structure of the code.






                share|improve this answer









                $endgroup$















                  0












                  0








                  0





                  $begingroup$

                  The main contribution of this answer is to use toLowerCase() before the regex, so the regex does less work. Note that I don't know if that would benefit performance at all - profile it if you are curious.



                  // private implementation - separated for ease of testing
                  const _isPalindrome = x => x===[...x].reverse().join('');
                  const _alphanum = x => x.toLowerCase().replace(/[^a-zs]/g, '');

                  // public interface - combined for ease of use
                  const isPalindrome = x => _isPalindrome(_alphanum(x));


                  This may be unpopular, but I prefer terse/abstract argument names x and y over longer, more specific names. It's similar to using i as a loop variable - it makes it easier to see the structure of the code.






                  share|improve this answer









                  $endgroup$



                  The main contribution of this answer is to use toLowerCase() before the regex, so the regex does less work. Note that I don't know if that would benefit performance at all - profile it if you are curious.



                  // private implementation - separated for ease of testing
                  const _isPalindrome = x => x===[...x].reverse().join('');
                  const _alphanum = x => x.toLowerCase().replace(/[^a-zs]/g, '');

                  // public interface - combined for ease of use
                  const isPalindrome = x => _isPalindrome(_alphanum(x));


                  This may be unpopular, but I prefer terse/abstract argument names x and y over longer, more specific names. It's similar to using i as a loop variable - it makes it easier to see the structure of the code.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered yesterday









                  hoosierEEhoosierEE

                  3521213




                  3521213



























                      draft saved

                      draft discarded
















































                      Thanks for contributing an answer to Code Review Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid


                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.

                      Use MathJax to format equations. MathJax reference.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f216534%2feasy-to-read-palindrome-checker%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      getting Checkpoint VPN SSL Network Extender working in the command lineHow to connect to CheckPoint VPN on Ubuntu 18.04LTS?Will the Linux ( red-hat ) Open VPNC Client connect to checkpoint or nortel VPN gateways?VPN client for linux machine + support checkpoint gatewayVPN SSL Network Extender in FirefoxLinux Checkpoint SNX tool configuration issuesCheck Point - Connect under Linux - snx + OTPSNX VPN Ububuntu 18.XXUsing Checkpoint VPN SSL Network Extender CLI with certificateVPN with network manager (nm-applet) is not workingWill the Linux ( red-hat ) Open VPNC Client connect to checkpoint or nortel VPN gateways?VPN client for linux machine + support checkpoint gatewayImport VPN config files to NetworkManager from command lineTrouble connecting to VPN using network-manager, while command line worksStart a VPN connection with PPTP protocol on command linestarting a docker service daemon breaks the vpn networkCan't connect to vpn with Network-managerVPN SSL Network Extender in FirefoxUsing Checkpoint VPN SSL Network Extender CLI with certificate

                      NetworkManager fails with “Could not find source connection”Trouble connecting to VPN using network-manager, while command line worksHow can I be notified about state changes to a VPN adapterBacktrack 5 R3 - Refuses to connect to VPNFeed all traffic through OpenVPN for a specific network namespace onlyRun daemon on startup in Debian once openvpn connection establishedpfsense tcp connection between openvpn and lan is brokenInternet connection problem with web browsers onlyWhy does NetworkManager explicitly support tun/tap devices?Browser issues with VPNTwo IP addresses assigned to the same network card - OpenVPN issues?Cannot connect to WiFi with nmcli, although secrets are provided

                      대한민국 목차 국명 지리 역사 정치 국방 경제 사회 문화 국제 순위 관련 항목 각주 외부 링크 둘러보기 메뉴북위 37° 34′ 08″ 동경 126° 58′ 36″ / 북위 37.568889° 동경 126.976667°  / 37.568889; 126.976667ehThe Korean Repository문단을 편집문단을 편집추가해Clarkson PLC 사Report for Selected Countries and Subjects-Korea“Human Development Index and its components: P.198”“http://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EA%B5%AD%EA%B8%B0%EB%B2%95”"한국은 국제법상 한반도 유일 합법정부 아니다" - 오마이뉴스 모바일Report for Selected Countries and Subjects: South Korea격동의 역사와 함께한 조선일보 90년 : 조선일보 인수해 혁신시킨 신석우, 임시정부 때는 '대한민국' 국호(國號) 정해《우리가 몰랐던 우리 역사: 나라 이름의 비밀을 찾아가는 역사 여행》“남북 공식호칭 ‘남한’‘북한’으로 쓴다”“Corea 대 Korea, 누가 이긴 거야?”국내기후자료 - 한국[김대중 前 대통령 서거] 과감한 구조개혁 'DJ노믹스'로 최단기간 환란극복 :: 네이버 뉴스“이라크 "韓-쿠르드 유전개발 MOU 승인 안해"(종합)”“해외 우리국민 추방사례 43%가 일본”차기전차 K2'흑표'의 세계 최고 전력 분석, 쿠키뉴스 엄기영, 2007-03-02두산인프라, 헬기잡는 장갑차 'K21'...내년부터 공급, 고뉴스 이대준, 2008-10-30과거 내용 찾기mk 뉴스 - 구매력 기준으로 보면 한국 1인당 소득 3만弗과거 내용 찾기"The N-11: More Than an Acronym"Archived조선일보 최우석, 2008-11-01Global 500 2008: Countries - South Korea“몇년째 '시한폭탄'... 가계부채, 올해는 터질까”가구당 부채 5000만원 처음 넘어서“‘빚’으로 내몰리는 사회.. 위기의 가계대출”“[경제365] 공공부문 부채 급증…800조 육박”“"소득 양극화 다소 완화...불평등은 여전"”“공정사회·공생발전 한참 멀었네”iSuppli,08年2QのDRAMシェア・ランキングを発表(08/8/11)South Korea dominates shipbuilding industry | Stock Market News & Stocks to Watch from StraightStocks한국 자동차 생산, 3년 연속 세계 5위자동차수출 '현대-삼성 웃고 기아-대우-쌍용은 울고' 과거 내용 찾기동반성장위 창립 1주년 맞아Archived"중기적합 3개업종 합의 무시한 채 선정"李대통령, 사업 무분별 확장 소상공인 생계 위협 질타삼성-LG, 서민업종인 빵·분식사업 잇따라 철수상생은 뒷전…SSM ‘몸집 불리기’ 혈안Archived“경부고속도에 '아시안하이웨이' 표지판”'철의 실크로드' 앞서 '말(言)의 실크로드'부터, 프레시안 정창현, 2008-10-01“'서울 지하철은 안전한가?'”“서울시 “올해 안에 모든 지하철역 스크린도어 설치””“부산지하철 1,2호선 승강장 안전펜스 설치 완료”“전교조, 정부 노조 통계서 처음 빠져”“[Weekly BIZ] 도요타 '제로 이사회'가 리콜 사태 불러들였다”“S Korea slams high tuition costs”““정치가 여론 양극화 부채질… 합리주의 절실””“〈"`촛불집회'는 민주주의의 질적 변화 상징"〉”““촛불집회가 민주주의 왜곡 초래””“국민 65%, "한국 노사관계 대립적"”“한국 국가경쟁력 27위‥노사관계 '꼴찌'”“제대로 형성되지 않은 대한민국 이념지형”“[신년기획-갈등의 시대] 갈등지수 OECD 4위…사회적 손실 GDP 27% 무려 300조”“2012 총선-대선의 키워드는 '국민과 소통'”“한국 삶의 질 27위, 2000년과 2008년 연속 하위권 머물러”“[해피 코리아] 행복점수 68점…해외 평가선 '낙제점'”“한국 어린이·청소년 행복지수 3년 연속 OECD ‘꼴찌’”“한국 이혼율 OECD중 8위”“[통계청] 한국 이혼율 OECD 4위”“오피니언 [이렇게 생각한다] `부부의 날` 에 돌아본 이혼율 1위 한국”“Suicide Rates by Country, Global Health Observatory Data Repository.”“1. 또 다른 차별”“오피니언 [편집자에게] '왕따'와 '패거리 정치' 심리는 닮은꼴”“[미래한국리포트] 무한경쟁에 빠진 대한민국”“대학생 98% "외모가 경쟁력이라는 말 동의"”“특급호텔 웨딩·200만원대 유모차… "남보다 더…" 호화病, 고질병 됐다”“[스트레스 공화국] ① 경쟁사회, 스트레스 쌓인다”““매일 30여명 자살 한국, 의사보다 무속인에…””“"자살 부르는 '우울증', 환자 중 85% 치료 안 받아"”“정신병원을 가다”“대한민국도 ‘묻지마 범죄’,안전지대 아니다”“유엔 "학생 '성적 지향'에 따른 차별 금지하라"”“유엔아동권리위원회 보고서 및 번역본 원문”“고졸 성공스토리 담은 '제빵왕 김탁구' 드라마 나온다”“‘빛 좋은 개살구’ 고졸 취업…실습 대신 착취”원본 문서“정신건강, 사회적 편견부터 고쳐드립니다”‘소통’과 ‘행복’에 목 마른 사회가 잠들어 있던 ‘심리학’ 깨웠다“[포토] 사유리-곽금주 교수의 유쾌한 심리상담”“"올해 한국인 평균 영화관람횟수 세계 1위"(종합)”“[게임연중기획] 게임은 문화다-여가활동 1순위 게임”“영화속 ‘영어 지상주의’ …“왠지 씁쓸한데””“2월 `신문 부수 인증기관` 지정..방송법 후속작업”“무료신문 성장동력 ‘차별성’과 ‘갈등해소’”대한민국 국회 법률지식정보시스템"Pew Research Center's Religion & Public Life Project: South Korea"“amp;vwcd=MT_ZTITLE&path=인구·가구%20>%20인구총조사%20>%20인구부문%20>%20 총조사인구(2005)%20>%20전수부문&oper_YN=Y&item=&keyword=종교별%20인구& amp;lang_mode=kor&list_id= 2005년 통계청 인구 총조사”원본 문서“한국인이 좋아하는 취미와 운동 (2004-2009)”“한국인이 좋아하는 취미와 운동 (2004-2014)”Archived“한국, `부분적 언론자유국' 강등〈프리덤하우스〉”“국경없는기자회 "한국, 인터넷감시 대상국"”“한국, 조선산업 1위 유지(S. Korea Stays Top Shipbuilding Nation) RZD-Partner Portal”원본 문서“한국, 4년 만에 ‘선박건조 1위’”“옛 마산시,인터넷속도 세계 1위”“"한국 초고속 인터넷망 세계1위"”“인터넷·휴대폰 요금, 외국보다 훨씬 비싸”“한국 관세행정 6년 연속 세계 '1위'”“한국 교통사고 사망자 수 OECD 회원국 중 2위”“결핵 후진국' 한국, 환자가 급증한 이유는”“수술은 신중해야… 자칫하면 생명 위협”대한민국분류대한민국의 지도대한민국 정부대표 다국어포털대한민국 전자정부대한민국 국회한국방송공사about korea and information korea브리태니커 백과사전(한국편)론리플래닛의 정보(한국편)CIA의 세계 정보(한국편)마리암 부디아 (Mariam Budia),『한국: 하늘이 내린 한 폭의 그림』, 서울: 트랜스라틴 19호 (2012년 3월)대한민국ehehehehehehehehehehehehehehWorldCat132441370n791268020000 0001 2308 81034078029-6026373548cb11863345f(데이터)00573706ge128495