Codewars(コードウォーズ)が楽しいお話

皆さんは楽しくプログラミングできていますか?
私はプログラミングが大好きなのですが、それでもやはりマンネリズムを感じることは多々あります。
そんな時におすすめなのがこのCodewarsです!
https://www.codewars.com/

問題があり、それをプログラムで解決する学習用サイトなのですが、これが非常に面白い!
全て英語なので、英語の勉強にもなって一石二鳥です。

自分の得意な言語で戦うことができます。

Codewarsでは問題のことを”Kata(型)”と呼び、ランクのことを”4kyu(4級)”のように表現されます。他にも同じ処理をする互いのコードを戦わせる”Kumite(組手)”などがあります。
私は”Kata”しかやったことがありませんので”Kumite”の方はようわかりません。

ダッシュボードはこんな感じ。
私はjavascript4kyuまでたどり着きましたが、ここから先の問題はめちゃくちゃ難しいです。
英語なもんですから問題文を理解するまでに時間がめちゃくちゃかかります。

せっかくだし簡単なやつを何か一問見てみましょう!

Kata(6kyu): Make the Deadfish swim

Write a simple parser that will parse and run Deadfish.

Deadfish has 4 commands, each 1 character long:

  • i increments the value (initially 0)
  • d decrements the value
  • s squares the value
  • o outputs the value into the return array

Invalid characters should be ignored.

parse("iiisdoso") => [ 8, 64 ]

まずは問題文を理解してみる

まず”Deadfish”って何やねんって感じでしょ?
Deadfishってのは4つのコマンドを持つジョークプログラミング言語なんです。

初期値を0として

  • i 現在の値に1足す
  • d 現在の値から1引く
  • s 現在の値を2乗する
  • o 現在の値を配列に追加

っていう処理をするプログラミング言語です。
つまり与えられたDeadfishコードである"iiisdoso"を読み解くと

  1. 初期値0
  2. i => 1
  3. i => 2
  4. i => 3
  5. s => 9
  6. d => 8
  7. o => [8]
  8. s => 64
  9. o => [8, 64]

ってことで、このDeadfishコードは8と64の入った配列を示しています。
この”Kata”はDeadfishコードをパースして正しい値を出力するプログラムを書けと言っているわけです。
“Deadfishを泳がせる”とはよく言ったものです。

解の例

function parse( data )
{
  let ret = []
  let v = 0
  for (let i = 0, l = data.length; i < l; i++) {
    switch (data.charAt(i)) {
      case "i":
        v++
      break
      case "d":
        v--
      break
      case "s":
        v*=v
      break
      case "o":
        ret.push(v)
      break
    }
  }
  return ret
}

シンプルに1文字ずつ確認して演算していけばクリアできます。

“Kata”をクリアすると、こんな画面に飛びます。

この画面では他の人の解法をみることができ、めちゃくちゃ勉強になりますよ!
やっぱりだいたい私と同じやり方をしている人が多いですね。
難しい問題になってくるとここが本当に様々でして、ここ見ながら3時間くらいはお酒飲めますね。

簡単な問題であれば、1ライナーを極めてる人がいたりしてそれも面白いです。

スタッツを確認

ユーザーページ的なところでスタッツの確認ができます。
有料プランに登録するともっと色々なことができるのかもしれません。

有料プランにしてみた

5ドル払ってみました。
そうしたら”Streaks”っていうのが表示されるようになりましたね。
あと言語ごとのクリア回数なども表示されるようにもなりました。
他にも広告の非表示、”Kata”の回答コード実行時間の短縮(タイムアウトしづらくなる)などがあるようです。

上位の問題になってくると実行時間の短縮が命です。
アルゴリズムを考えてみたり、コードの最適化をしてみたりと試行錯誤するわけですが、お金を払って実行時間の短縮が可能になるとは…

でもまぁこれで快適なCodewarsライフが送れるのは間違いありません。

実はAtCoderも楽しい

競技プログラミングで有名なAtCoderですが、私は競技に参加せず過去問をひたすら解いてます。これがまた楽しいんだ。
こっちは日本語ですので、問題文の理解に苦労することはないでしょう。
久しぶりにパーミュテーションとかコンビネーションとかやりましたよ。

ということで皆さんも日々のプログラムにマンネリズムを感じたら、パズル感覚でCodewarsやAtCoderの問題に手を出してみてはいかがでしょう?
熱中しすぎると1日とか一瞬で過ぎ去るのでお気をつけを!

それではまた来週!お身体に気をつけてくださいねー!