前の記事で紹介した、CodinGame内のコンテンツClash of Codeにハマっています。
今日もいくつかやりました。初めての1位も獲得しました!嬉しいですね。参加人数は最大で8人ですが、レベルが高くて刺激になります。小さい問題を速く解くことが重視されているので、Javascriptやpythonの人が多めに思います(僕はJava)。
さて、今回出た中でいくつかひっかかり、調べながら解いた問題があったので、自分用のメモも兼ねて書きます。
↓CodinGameについては前の記事をご参照ください。
frfrfrfr.hatenablog.com
Javaでの座標の表現(極座標⇒直交座標)
出た問題は「極座標として中心角θ°と半径rが与えられるので、直交座標x,yに直しなさい」という問題でした。
つまり、
θ = 30°, r = 5
のときに、
x = r * cos(θ), y = r * sin(θ)
と答える、という問題です(ちなみに、この問題でClash of Code初の1位を獲得しました)。
まず初めに、単純に
x = r * Math.cos(theta)
//theta は θ を表す変数です
と書くも、全然違う数値が出てきてしまいます。
なぜかと思って考えてたら、非常に懐かしい言葉、「ラジアン」が出てきました。
つまりは、"Math.cos"は、引数としてラジアン表記を取るのでした。
ということで、今回の問題での正しい表現はコチラ。
x = r * Math.cos(Math.toRadians(theta))
//theta は θ を表す変数です
このようなやり方で解答を書いたら、無事クリアとなりました。よかった!
※参考にしたのはこちらのサイト。お世話になりました。
sin/cos/tan/asin/acos/atanメソッド | Javaコード入門
10進数から2進数への変換
出た問題は、「書いてある10進数を2進数に変換せよ」というとてもシンプルなものです。
2⇒10
9⇒1001
みたいな感じですね。
これって、2で割っていって・・・みたいなコードを書くのかなと思いつつ調べてみたら、一発で書くやり方がありました。
こんな感じです。入力をNとした場合、
int N = in.nextInt();
String bin = Integer.toBinaryString(N);
System.out.println(bin);
とっても簡単ですね!
Stringとして1行で変換できるのは知りませんでした。便利!!!
※参考にしたのはこちらのサイト。お世話になりました。
Javaで進数変換を行う方法
以上のように、小さな問題を解く中で、Javaの知識が深まっていきます。言語によって出来ること・出来ないことあるでしょうが、それを知っていきたいですね。
そして理想としては、複数言語を扱えるようになって問題に応じて使い分けていきたいです。
CodinGameで使える言語で使ってみたい言語としてはLuaあたりですかね。AtCoderのような大きい問題を解く必要もある場合では使いにくいような言語も使えるのは面白いですね。
ガンガンやっていくぜー。以上です。