【初心者向け🔰】CodeWars【学習サイト】

# はじめに

https://www.codewars.com/dashboard

Codewars というサイトをご存知でしょうか
いろんな言語のアルゴリズム問題を解くことができるサイトです。

類似するサイトで有名なものだと「AtCoder」や「Paizaラーニング」があります。

# Codewarsのオススメな点
個人的には、アルゴリズム問題サイトで一番オススメです。

## 時間制限がないから、学習に集中できる

:::note alert
PaizaラーニングやAtCoderは**時間が計測されます**。
また、Paizaラーニングでは**時間制限があります**。
:::

私的な話になりますが、時間が計測されていると集中ができません。

また、
- 「雑に書いても早くしたい」
- 「ミスの可能性とトレードオフに、スピードを求める」

ということが起こります。

これは学習とは真逆です。

また、実際の開発においても不要な考えだと思います。

この点、CodeWarsには**時間制限がない**ため、のびのびと学ぶことができます。

## トライ&エラーできて、学びの効率が良い

:::note alert
PaizaラーニングとAtCoderはどちらも**提出してからテストが入ります**。
提出してみないと正しいかどうかがわかりません。
:::
学習という面から見れば、非効率的です。

**「トライ&エラーのコストが低い」というのはプログラミングの良いところ**です。

Codewarsではテストコードが用意されており、いつでもテストをすることができます。

また、テストコードを書き足すこともできます。

**「間違いながら学ぶ」ことができる環境**です。

## 他ユーザーの回答から学べる

Codewarsでは他のユーザーの回答を見ることができます。
さらに、いわゆる「いいね」ボタンが2種類あります。

「`Best Practice`（実用的）」と「`Clever`（天才）」ボタンです。

![スクリーンショット 2024-07-02 18.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/6ba74741-c5c2-2e44-9479-c587a876bf3d.png)

例題です。

https://www.codewars.com/kata/576b93db1129fcf2200001e6/train/ruby

:::note warn
与えられた配列から「最大値」と「最小値」を除き、合計してください
ただし、「要素が一つだけ」「空の配列」や「`null`」の場合は`0`を返してください

**例**
```
{ 6, 2, 1, 8, 10 } => 16
{ 1, 1, 11, 2, 3 } => 6
```
:::

この問題、シンプルに解くと以下の形です

```rb
def sum_array(arr)
  return 0 if arr.nil? # nilの場合は0を返す
  return 0 if arr.empty? # emptyの場合は0を返す
  return 0 if arr.length <= 1 # 要素数が1以下なら0を返す

  min = arr.min
  max = arr.max

  arr.sum - (min + max) # 合計から最大値と最小値をマイナスする
end
```

では `Best Practice` / `Clever` の回答を見てみましょう

:::note
### `Best Practice`
```rb
def sum_array(arr)
  if arr.kind_of?(Array) and arr.length > 2
    arr.inject(:+) - arr.min - arr.max
  else
    0
  end
end
```
- `arr.kind_of?(Array)`
`arr.nil?` / `arr.empty?` の2つをスマートにまとめた上、意図が伝わりやすい
- 0を返すケースを個別に記述しないことで、スリムなコードになっている
:::

:::note
### `Clever`
```rb
def sum_array(arr)
  arr.nil? || arr.empty? ? 0 : arr.sort[1..-2].reduce(0, :+)
end
```
- わかりやすさを多少犠牲にしながらも、超スリム
- `sort`してから`1から-2`を指定することで、`0`番目と`last`（最大と最小）を除外
:::

**たくさんの点で発見があり、楽しく学ぶことができます**。

Paizaラーニングでは、他の回答を見ることができず、せっかく問題を解いても振り返りや学びができません。

## オススメ理由まとめ

:::note
- 時間制限がないから、学習に集中できる
- トライ&エラーできて、学びの効率が良い
- 他ユーザーの回答から学べる
:::

Paizaラーニングは **「スキルをアピールしたい就活者」と「事前にスキルを知りたい企業」をマッチングさせる面が強い**です。

**AtCoderは「競技プログラミング」の本場**であり、「学習」がメインではありません。

その点で、学習を主眼にするならCodewarsがオススメです。


# Codewarsの欠点

Codewarsにも欠点があります。

:::note alert
**ALL英語**
「プログラミング + 英語」のハードルが高いかなと思います。
やってみると、慣れ & 翻訳で気にならないレベルです。
:::
:::note alert
**チュートリアルが少ない / 使い方がわからない**
[この記事](https://qiita.com/javacommons/items/7c473cda7825ab99e08c)がオススメです。
:::

# 取り組むべき問題
:::note
**1kyu**（難しい）から**8kyu**（簡単）までの難易度があります。
:::
:::note
個人的には、**8kyu・7kyuでも十分**だと思います。

問題は簡単でも、他の回答から学べるものが多いです。
:::
:::note warn
**4kyu以上はバケモノ**の領域です。
**5kyuも人かどうか怪しい**です。
**頑張って6kyuで十分**だと思います。
:::

特に初学者の方は8kyuからやるのがオススメです。


:::note

できれば「人気なもの」から取り組むのがオススメです。

![スクリーンショット 2024-07-02 20.26.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/28c44b35-466d-002a-e9b4-02fbbd8487df.png)
（上記画像の各数字が大きいもの）
:::

# 最後に

https://qiita.com/javacommons/items/7c473cda7825ab99e08c

念の為、チュートリアル記事を改めて掲載しておきます。

アルゴリズムを実践的に学ぶならCodewarsがオススメです。

2024/07/04 追記
コメントにて「解けそうな4kyuもあるよ！」と教えていただきました。
記事も書きましたので、よければご覧ください。

https://qiita.com/kohki_takatama/items/c3c260f4268a3effdf2b