日々drdrする人のメモ

今日もdrdr、明日もdrdr

Surprise Language Round #8

気が向いたので、コドフォで行われてたSurprise Language Round #8というコンテストに出てみた。
(コドフォのコンテスト最後に出てから1年以上経ってた)

codeforces.com
このコンテストは、直前まで何の言語で解くのかが分からないコンテストである。

この形式のコンテスト出るのは、Friday the 13th, Programmers Day以来だった。
この時はAda使ったコンテストで、PCにコンパイラが用意できずにideoneでデバッグしてたら入出力部分でハマって0完したのを覚えている。
おまけに、この時はロ技研の合宿でみんなで集まってやってた。
codeforces.com


今回はKotlinで、Javaに似ていてJVM上で動く言語だった。
kotlinlang.org


以下、コンテスト中の流れ

コンテスト開始まで

使用言語がKotlinだと分かって、PCで実行できる環境をビルド構築しようとgithubからソースコードを引っ張ってくる。
しかし、引っ張って来るのに時間かかったりして、ビルド処理の途中で開始時間へ。

$ ant -f update_dependencies.xml
開始以降

数分してビルドが終わって次のビルドを実行したらエラーが出てつらくなる。

$ ant -f build.xml
Buildfile: <path>/kotlin/build.xml
  [typedef] Could not load definitions from resource org/jetbrains/kotlin/ant/antlib.xml. It could not be found.

BUILD FAILED
<path>/kotlin/build.xml:81: taskdef class com.intellij.ant.Javac2 cannot be found
 using the classloader AntClassLoader[]

Total time: 0 seconds

少し調べるもよく分からず困り果てたので、結局、コドフォ上で提供されてたバイナリの方を使う。これはうまく動いた。(ここまでで14分くらいだったと思う)

実行できる環境ができたので、Aから順番に解いていった。
問題の難易度はそこまでない感じだった。

KotlinはJavaとは違ってNullに厳しい言語らしくて、Null許容型(例えばString?)を非Null型(例えばString)に突っ込もうとしてめっちゃ怒られてた。
例えば、以下のような感じ

fun main(args: Array<String>) {
  val n = 10
  val arr:Array<String?> = arrayOfNulls(n)
  val el:String = arr[0] // この場合はarr[0]!!で非Null型に変換(Nullの時、例外)
  println(el)
}

(これはKotlinのNULL安全らしい。)

一番苦労したのがBで、(Int, String)の組をソートする問題で、Pair<Int, String>でソートすればいいか → 実装中にPairはComparableではないということに気づいて、あーって感じになって困った。
(KotlinはJavaに似てるからJavaのような感じで記述すればよさそうだったけど、基本Java書かないので機能分からんマンだった)
ComparableなPair<Int, String>の記述方法を調べる余裕がなくてあたふたしてたら、結局自力でマージソートしたほうが早そうという結論になって実装して通した。
これで40分くらい溶けた。

あと地味にE問題も解法ミスってハマって2WAしてしまった。

以下、ACした自分のsubmit
A: http://codeforces.com/contest/683/submission/18524876
B: http://codeforces.com/contest/683/submission/18526551
C: http://codeforces.com/contest/683/submission/18527345
D: http://codeforces.com/contest/683/submission/18527649
E: http://codeforces.com/contest/683/submission/18528663
F: http://codeforces.com/contest/683/submission/18529102

とりあえず6完。
20位以内に入ればTシャツらしかったけど、95位なのでもらえなかった。
でも、3完以上のランダム10名の方に選ばれてて、Tシャツをもらえることになった。

その他

Kotlinのビルドがうまくいかなかったのは、update_dependencies.xmlの実行が終わった時点で、必要なファイルをきちんと落とせていなかったのが原因で、全てのファイルをきちんと取得するとうまくビルドできた。
(Ctrl+Cとかして、ファイルの取得を途中でやめるとそのファイルはダウンロード済みと認識されてダメになるっぽい)

追記 (2016/08/27)

Tシャツが届いた