Freecodecampの課題#185より。
##Palindromeとは
逆さに読んでも同じ単語。
word, line, verse, number, sentence, etc., reading the same backward as forward, as Madam, I'm Adam or Poor Dan is in a droop.
cited: dictionary.com
課題はこちら:
/*
Return true if the given string is a palindrome. Otherwise, return false.
A palindrome is a word or sentence that's spelled the same way both forward and backward, ignoring punctuation, case, and spacing.
You'll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything lower case in order to check for palindromes.
We'll pass strings with varying formats, such as "racecar", "RaceCar", and "race CAR" among others.
*/
function palindrome(str) {
// Good luck!
return true;
}
palindrome("eye");
ユーザーインプットを引数とした探してくれる逆さ文字判定をしてくれる関数を作ってください、というところでしょうか。
##流れ
上のガイドも参考にして恐らくこんな感じでやるのかと。
-
replace(/\W/g, '')
でアルファベットだけに (ref: Remove not alphanumeric characters from string...) -
.toLowerCase()
で小文字変換 (ref: JavaScript String toLowerCase() Method
) - ifで
(str === palindrome)
判定
まずは引数str
を後のif
で必要な形にしてあげてからif
でtrue/false
判定をかけてあげる感じでしょうか。ひとまずこんな感じで書いてみました。
function palindrome(str) {
// Good luck!
str = str.replace(/\W/g, '').toLowerCase();
if (str.split('').reverse().join('') === str) {
return true;
}
else {
return false;
}
}
palindrome("eye");
しかしこれだとpalindrome("0_0 (: /-\ :) 0-0")
をtrue
に返さないみたいです。ちょっと原因を探ってみます。
##追記
偶然にもまさにリアルタイムで質問している人を見つけたのでその人の答えを参考にすることにします。
率直に言うとアンダースコア_
を含めていなかったためにfalse
が出てしまったと分かりました。「/\W/g
は文字と数字以外という意味だから、その他全ての記号はこれで含まれるだろ!」と思っていたのが勘違い。
[a-zA-Z0-9_]
= \w
なので正確には文字、数字とアンダースコアーを含んでいます。今回のPalindrome checkerではアンダースコアーを除外したいので[\W_]
とする。まあアンダースコアーも\W
の仲間として入れてあげようってことでしょうか。
ここでも書いてありますが、ここではちゃんと括弧[]
の中にいれてあげる必要があります。
function palindrome(str) {
// Good luck!
str = str.replace(/[\W_]/g, '').toLowerCase();
if (str.split('').reverse().join('') === str) {
return true;
}
else {
return false;
}
}
palindrome("eye");
palindrome("0_0 (: /-\ :) 0-0")
再度実行すると、