失敗は一時の恥

パッケージソフト開発をしているプログラマが気の赴くままに何かを投稿するブログ.

codewars で遊んでみた

codewars で遊んでみた

f:id:snobutaka:20180204151152p:plain
codewars

きっかけ

Qiita に投稿されていた紹介記事 を読んで面白そうだと思った.

サービスの内容

プログラミングの問題を解いてランクアップを目指していく.

問題は「型 (Kata)」などと呼ばれているようで,難易度が「n 級」として設定されている.

対応しているプログラミング言語は,C, C++, C#, Java, Python, Ruby, Haskell, Swift, ... を始め数多く用意されている.

問題の内容は,(今のところ) 数行から数十行で回答できるような, ちょっとしたユーティティを実装したり,計算問題を解いたりといったものが出題されている.

ブラウザ上でコードを書いて提出すると,すぐにユニットテストが走ってフィードバックが得られるのがとても良い.

f:id:snobutaka:20180204150854p:plain
コーディングとテスト

現時点での取り組み内容

JavaRuby で問題を解いている.

たしか最初は 9 級から始まり, 11 個くらい問題を解いて 6 級になっている.

感想

ちょっとしたパズル感覚で挑戦できて楽しいし, 他の人の解答から学びが得られて面白い.

例えば,「入力された数字の各桁を n 乗した和をとる (695 という入力に対して 6^2 + 9^3 + 5^4 を計算する)」という処理を含む問題に,自分はこんな回答をした:

public static long digPow(int n, int p) {
    String nStr = Integer.toString(n);
    long value = 0;
    for (int i = 0; i < nStr.length(); i++) {
        int d = (int)nStr.charAt(i) - (int)'1' + 1;
        value += Math.pow(d, p + i);
    }
    if (value % n ==0) {
        return value / n;
    } else {
        return -1;
    }
}

他の人の回答を見ると,もっとスマートなものが見つかったりする:

public static long digPow(int n, int p) {
    String intString = String.valueOf(n);
    long sum = 0;
    for (int i = 0; i < intString.length(); ++i, ++p)
      sum += Math.pow(Character.getNumericValue(intString.charAt(i)), p);
    return (sum % n == 0) ? sum / n : -1;
  }

これを見て,Character#getnumericValue(char) なんていうメソッドが使えることを知らなかったなぁと思い知らされたりする.

他にも,ふだん仕事で Java を書くときはいまだに Java SE 7 を使っている (2018 年 2 月時点) のもあり, ラムダやストリーム API を使ったエレガントな回答を見ると, もっと新しい書き方に慣れないとなぁという危機感を感じたりもする (汗)

それなりに慣れているはずの Java でも気づきが得られるし, 趣味でちょっと書いている Ruby なんかはもっと色々な学びが得られている.

まとめ

codewars は無料で始められて,すぐにブラウザ上で快適にコーディングとテストができる.

使い始めてばかりの言語はもちろん,それなりに慣れている言語でも学べることがあると思うので, 興味があるならちょっとやってみるのがおすすめ.