Codilityの練習問題を解きました。(FrogJmp)あと、Codilityを使う上での注意点も書きました


問題について

問題文はそのままここに書いてはいけない、(英文でした)自分なりの日本語を書います。
Q.カエルはとある場所に行きたい。カエルは現在X地点にいて、Y以上の地点に行きたい。カエルはジャンプ(移動)するたびにD動く。

初めてのCodilityで苦戦したこと

問題はすぐに理解できたので自分の開発環境でプログラムを書いて無事正しい答えにたどり着いたのですが、なぜかCodilityでの環境では異なる値が出力されるので何時間も悩んだ。

自分の環境ではまずループ使った方法でやってみたんですけど、Codilityでの環境ではなぜかSolution関数が1度しか呼ばれないのが自分の開発環境とCodilityで出力される値が異なる原因だった。

何故か関数が一度しか呼ばれないので、多分パフォーマンスの観点から呼び出し回数が制限がされているのだろうと予想して、やっぱり関数を何度も呼び出すのはパフォーマンス的にまずいのかと思って、指定されているSolution関数の呼び出しを一回だけにしてその中でループさせると無事に正しい値が出力されたが、新たに問題が発生した。

パフォーマンステストの存在

ループを使ったプログラムを提出すると、スコアは44%でした。
詳細を見ると、Correctness testsに関しては全問正解。
しかし、Performance testsに関しては「TIMEOUT ERROR 」
という結果が出ていました。
やっぱりループ使うのはパフォーマンス的にまずかったなぁ、、、って思って、再チャレンジしました。

答えはここには書きませんが、ループしないで答えを出す書き方をしました。計算の部分は一行のプログラムでできました。

結果

出力結果とパフォーマンスで100点出ました。
点数の仕組みを見たら、様々な値を自分が書いたプログラムに代入して、どのパターンでも正しい値が出力されるプログラムかどうかで点数は変わるので、どの値を入れられても正しい出力が出るようなプログラムを書いて、パフォーマンスの良いプログラムを書ければ100点になると思います。

ちなみに、他にも提出をストップされる原因がありました。

余計な部分を無くさなくてはならない


ようやく正しい値が出力されて喜んだのだが、また赤い文字が。
「codility Producing output might cause your solution to fail performance tests. You should remove code that produces output before you submit your solution.」
Google翻訳使ったら、
「出力を生成すると、ソリューションがパフォーマンステストを失敗させる可能性があります。ソリューションを提出する前に、出力を生成するコードを削除する必要があります。」

System.out.printlnなどの余計な出力がある時に表示されました。

感想

このテストで求められていることは、
1.正しい値の出力
2.パフォーマンス
この二つを満たしているプログラムを頑張って書く必要があるので、もっと難しい問題がいっぱいあるそうなので、自分にはもっと勉強が必要だと感じました。