0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CodeWars オススメ問題 #5

Last updated at Posted at 2024-10-02

はじめに

個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。

週1くらいのペースで、全10回を目指す予定。

CodeWarsはいいぞ!の紹介はこちら

CodeWarsの始め方はこちら

オススメ問題

問題

書式の変換問題です。エンジニアには馴染み深い問題ですね。
今回は、ケバブケーススネークケース から キャメルケース に変換します。

"the-stealth-warrior" -> "theStealthWarrior"

"The_Stealth_Warrior" -> "TheStealthWarrior"

"The_Stealth-Warrior" -> "TheStealthWarrior"

難易度

分類は 6kyu です。
アルゴリズム問題に慣れてきた方にオススメです。

オススメの回答

「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。
・・・今回は、私の解答を紹介させていただきます。

解答のポイント

主に2つのアルゴリズムが必要です。

  1. -``_を取り除く
  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())

スクリーンショット 2024-10-02 20.07.01.png

1行で書いてみました。
正規表現/[-_]./gは、「-もしくは_に続く1文字」にマッチします。

これを、2文字目(w[1])の大文字化したもの(toUpperCase)に置き換えreplaceします。

"the-stealth-warrior"であれば、-s-wにマッチするわけですね。
その後、-sS-wWに置き換えます。

結果として"theStealthWarrior"を返します。

工程が少なく、私は好みです。

おわりに

以上、CodeWarsオススメ問題でした。

オススメ問題・解法など、ぜひコメントお待ちしております!

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?