水底

ScalaとかC#とかネットワークとか

Scalaで競技プログラミングに入門したかった感想

ただの感想です. 小技集的なのはそのうち別記事でまとめる予定.

(追記: まとめた)

amaya382.hatenablog.jp

最近アルゴリズムの自習のため読み始めた蟻本, 某paizaの10万円キャンペーンやしうかつと, 触れる機会が多くなってきたので周辺環境をまとめたメモ. C++の方が競技人口が多く情報が多い・競プロで使えそうなツールがSTLに多い・単純に速い, といった理由からたまに触るにはC++を使っていたのですが, C++よりはScalaの方が書けるはず (はず) なのでScalaでチャレンジしてみました.

ぶち当たった壁とか

そもそもScala使えないのでは?

意外と対応しているところは多いようで. とりあえず目についたAtCoderとAOJが対応していたので個人的には問題なし. あ, 某paizaのScala実行環境はくっそ遅いので辛い, 謎の0.7secオーバーヘッドとか勘弁してください.

標準で使えるIOが遅い

某paizaのような「アルゴリズムは簡単だけれどカリカリチューニングを求められる場合」はほぼIOがボトルネックになりました. ということで Javaで競技プログラミングをするときの罠とテク - Qiita この辺りを参考にしながらScalaに翻訳しました. 入力も出力も工夫が必須な世界 (とはいえ事前に自作しておけば無問題).

break / continue がキビシイ

や, 普段はまっっったく使わないんですけどね, 競プロ的なものになると個人的に欲しくなります. Scalabreak の仕様は お察しください という代物なのでやっぱり使いたくない… とりあえず辿り着いた結論としては break が出てくるようなコードは再帰で書いてます. 慣れれば大体問題なく書けるし多少はね (?)

ライブラリ

Java標準ライブラリに加えてScala標準ライブラリを使えるので大抵のことはできます, が, 微妙に使いづらいが部分あるので少しは自作が必要そう. 特にScala標準ライブラリはmutable向けAPIが貧弱 (普段はそれがいいんですけどね). とはいえ競プロ初心者目線だと何が足りないのかまだよく分かってないですが, ちまちま増やしていこうかと.

Scalaでやる意味

制限時間に追われてどうしてもmutableだらけのコードになってしまうので, 「Scalaでやる意味とは?」と言われてしまうと言葉に詰まります. 安定したコードを素早く書けるようになりたい. まぁ普段よりコレクションの選択とかをちゃんとやらないといけなくなるので確認兼頭の体操にはちょうどいいんじゃないでしょうか (?)

結果的にできたテンプレートリポジトリがこれ

github.com

結論

C++でよくない?

おわり