はじめに
個人的に好きなアルゴリズム学習サイト「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オススメ問題でした。
オススメ問題・解法など、ぜひコメントお待ちしております!
参考記事
