名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

2018 TCO Marathon Round 3 振り返り

色々会ってマラソンマッチでることになったのでやったこととか学びとかをまとめる。

問題のURL

http://community.topcoder.com/longcontest/?module=ViewProblemStatement&rd=17203&pm=14959

問題の概要

投資家にお金を投資する問題。最大でも40万絵までしか賭けられない。

投資家の予測値、投資家の前回結果、現在の所持金、計算残り時間、残りのターン数が渡されてくるので、それらを上手く用いて適当にお金をかける。

予測値はプラス・マイナス100%の範囲で増えそうとかそういう情報が渡される。前回結果も一緒。

賭けることに関して、裏側のパラメーターとして投資家の正答率、正答した場合の分散が存在している。そのあたりが若干掛け金を変える要素になりうる・・・ のかも。

自分がやったこと

  • 最初適当にかけるプログラムを出した
  • 正答率に応じて掛け金を変えようとする
    • 前回結果の活用とか
    • なるべく高い人に賭けるようなロジックを組んだつもり
    • 階段のように高い方になるべくかけられるように組んだつもり

この結果80万点をちょっと超えるくらいで止まり、105位という結果に終わった。

自分のコード

Gistに上げてみた。

gist.github.com

ツイッターを見ていて学んだこととか、いろいろ教えてもらったこととか

  • もっと極端な貪欲でよかったらしい(高い順で賭けていく)
    • その時点で自分の点数を超えるらしい… まじかよ
    • もっとサンプル出力と、問題を読み込んで単純な解放を試してみないとね
  • ベイズ推定を使う典型的な問題らしい
    • ベイズ推定、正直言葉レベルでしか覚えてないなあ
    • ロジックとプログラムを実際書いてみて学ばねば

このマラソン中に学んだこととか

  • C++でstaticな値を保つ方法
    • 実はまともに理解していなかった
    • クラスの外側に定義しておくと使えるっぽかった
    • 今回途中でやめたけどクラス変数的な扱い方も学んだ
    • こことか見た https://bituse.info/cp/17
  • Javaテスターをいじる
    • 途中経過をデバッグプリントした
    • パラメーターを変化させて結果を見て、どうすれば良くなるのかを観察していた
    • これまでテスター読むの結構長いししんどいなーとか思ってたけど、実は大したことなかった
    • これからもデバッグ時のプリントしたいときに活用する… かも

これから学ばないといけないこと

  • ベイズ推定のロジック
    • 知らないからね
  • C++の書き方的なところ
    • 正直staticでどう書くとかに時間かけるの無駄だしなあ
    • とは言えPythonで書くには計算時間がじわじわ効いてくるので、どうなんだろうね
  • 他の人の回答を読む
    • 全員が同じコードを書いていないので、どこで差がついたんだろうかとか、考察をしたい

まとめ

一番マトモにマラソンやった回でいろいろハマりどころとか、落とし穴とか感じたけど、大きく学ぶことはあった感じ。

ICFPCに実は出ていたんですが、そういうところでも生かしていけることが見つかれはばいいかなーと思う。

これまで割と敬遠気味であったけど、最大1日+αで合計16時間くらい時間取れるならまた参加したいなーとか思いました。(今回はたまたま三連休に被っていたので出来たという経緯もある)

次も参加できるかはわかりませんが、正直白からは上げたいなと思ってるので、マラソンも青目指してのんびり歩いていきたいです。

終わり。