はじめに
個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。
週1くらいのペースで、全10回を目指す予定。
オススメ問題
問題
書式の変換問題です。エンジニアには馴染み深い問題ですね。
今回は、ケバブケース
・スネークケース
から キャメルケース
に変換します。
"the-stealth-warrior" -> "theStealthWarrior"
"The_Stealth_Warrior" -> "TheStealthWarrior"
"The_Stealth-Warrior" -> "TheStealthWarrior"
難易度
分類は 6kyu です。
アルゴリズム問題に慣れてきた方にオススメです。
オススメの回答
「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。
・・・今回は、私の解答を紹介させていただきます。
解答のポイント
主に2つのアルゴリズムが必要です。
-
-``_
を取り除く - 大文字にする
また「大文字にする」アプローチは以下の2種あります。
- 単語の塊ごとに分けて、先頭を大文字にする
-
-``_
に続く1文字を大文字にする
直感的なのは「単語の塊ごとに分けて、先頭を大文字にする」のように見えます。
しかし、「単語の塊に分けた内、最初の塊は大文字化しない」という例外があり、「単語ごとに分ける」という処理もひとつ挟まるため、結果として長いコードになると言えます。
どちらを取るかは、フィロソフィーによると思います。私はコードが短いほうが好きです。
単語の塊ごとに分ける
const toCamelCase = (str) => {
return str
.split(/[-_]/)
.map((e, i) => {
return i === 0 ? e : e.replace(/^[a-z]/, w => w.toUpperCase())
})
.join('')
}
単語ごとに分け(split(/[-_]/)
)、最初の塊以外の先頭を大文字化(map(~)
)、最後につなげる(join
)
-_に続く1文字を大文字化する
const toCamelCase = str => str.replace(/[-_]./g, w => w[1].toUpperCase())
1行で書いてみました。
正規表現/[-_]./g
は、「-
もしくは_
に続く1文字」にマッチします。
これを、2文字目(w[1]
)の大文字化したもの(toUpperCase
)に置き換えreplace
します。
"the-stealth-warrior"
であれば、-s
と-w
にマッチするわけですね。
その後、-s
をS
、-w
をW
に置き換えます。
結果として"theStealthWarrior"
を返します。
工程が少なく、私は好みです。
おわりに
以上、CodeWarsオススメ問題でした。
オススメ問題・解法など、ぜひコメントお待ちしております!
参考記事