RUPC2018 参加記

今年も参加しました

1日目

自己紹介フェーズではうくさんの生なりきりを見ることが出来て感動しました
チーム分けではdiv1,div2,div3という3つのクラスで参加者を分類してて、去年より細かくていい感じ 結果的に次のようなチームになりました

btkさんに認識されていてちょっと嬉しかった。 チーム名は「オンサイトチームはチーム名に rupc という接頭辞を付けて下さい」という運営のアナウンスが流れた瞬間に、btkさんがチーム名を回文にしようと提案したため

コンテスト

B問題を担当する事になったのでB問題を読みました。しかし何度読んでも題意が頭に入ってこなくて困ったので、btkさんにサブミットデバッグすることを伝え、40分後ぐらいにACしました。その瞬間に題意がわかり、問題本文をもう一度読むと確かにACしたコードと辻褄が合っていました。すごい
B問題に手こずっている間にbtkさんがF問題のFAとD問題を通していて完全にプロでした。
G問題はbtkさんとペアプログラミングをしました。ずっと「最悪〜」と言いながらコーディングしている割にはバグなくスッとACをしていて暖色コーダーとの差を感じました。
最終的にF問題を通すことが出来ず、6完14位でした。

懇親会

去年と同じく生協で立食パーティーでした。フォロワーだけど会ったことがない人々と初めましてなどをしていました。

2日目

寝坊+満員でバスを逃したせいでチーム分けをTLEしそうになりました。結果的に人数調整の関係で4人チームになりました。

コンテスト

C問題を担当しました。見るからに貪欲でチームメンバーに相談してもそれで問題ないということで、実装→ACしました。これは証明のない貪欲で、解説陣に良くないよと後の解説で怒られました。
コンテストの終盤はnaanさんとI問題を考えていました。半径を二分探索すればいいという話は出ていて、判定部分は乱択で誤魔化せば通りそう?という方針だったんですが、サンプル2以降が一致せず、時間を溶かし続けてコンテストが終了しました。
チームとしては4完でした。E問題は想定解に近いアルゴリズムを実装している途中だったこと、I問題で文字列ソートを高速化する必要がある時にSAの話をちゃんと詰められなかったこと、I問題のバグなど、うまくいけば+1,2完はできたかなあという感じでした。

懇親会

焼肉食べ放題でした。どうして人はしんどくなるまでご飯を食べ続けてしまうんでしょうね。めっちゃしんどくなりました。

3日目

コンテスト

B問題を担当しました。数式中の s_i がどこにあるかわからなくてしばらく問題の意味がわかりませんでした。何回か問題を読み返して理解して、実装してACしました。
C問題までACし終えた後、D問題はチーム全員で考えてました。どんな解法でも素数判定は必要だなということで、エラトステネスの篩を空き時間に実装して、A問題に提出しました。最終的にこたつがめさんが2つ前まで見るDPを思いついて実装してACしました。
次の問題には多くのチームがACしているからという理由でF問題を考えることになりました。僕が嘘解法を生やすたびに即座に反例を挙げられて強い人は強いなあと思うなどしました。こたつがめさんが最小カット解を思いつき、きくちさんが最短経路に寄与している辺を簡単に見つける方法を提案し、僕が最大フローのライブラリをコピペしました。この問題はチームプレー感があってよかったです。
チームとしては、5完で25位でした。

全体の感想

ここ1年ぐらいは競プロで離れ気味で参加するか迷いましたが、チーム戦ならではのペアプロとか相談し合う雰囲気などを味わえて参加してよかったと思いました。

運営の方々ありがとうございました

2017年振り返り

自分もやりたくなりました

1月

  • 期末テストとか年次大会に出す原稿を書いてた
  • mixi git challengeに参加した

2月

  • 進学か就職か悩んでいたので就活をちょっとしていた
  • cookpadの画像認識にコンペに参加した
    • 最終的に14位

3月

  • 言語処理学会年次大会に参加した
  • 内定を得たが,年次大会が楽しくてもうちょっと研究をしていたいという気持ちになる
  • RUPC
  • ポケモンの画像認識をするwebアプリを開発した
  • ハッカソンに参加する

4月

  • 院試対策の勉強やTOEICを受けていた
  • サークルで新入生向けにC++講習会をやることになり,毎週スライドを作るのがしんどかった

5月

  • 院試に必要な小論文を書いていた(はず)
  • ↑の企業からの内定を承諾するか保留していたが,最終的に承諾しないことにした
  • JSAIの全国大会に参加する(たのしい)

6月

  • ユニクロの画像認識コンペに参加した
    • 9位で8月末に表彰された
  • ICPC国内予選に落ちる

7月

  • 院試に落ちる

8月

  • 就活を再開する

9月

  • 就活を継続するが内定を得られず困る
  • こどふぇすに落ちる
    • 競プロ全然やってなかったのでそれはそう

10月

  • ISUCON予選に参加するが落ちる
  • 就活が終わらず,研究熱が出て来る

11月

  • 色々あってある研究所に長期インターン的な感じで出入りできるようになる
  • そこでネタを考えては実験をするを繰り返していた
  • ずっと研究していた

12月

  • ようやく内定を得る
  • 研究の原稿を書く作業がつらくなる

まとめ

  • 院試に落ちたのはほんときつかった
  • 今年は研究会なりYANSなりで発表したいと思っていたが,結局今年も年次大会だけ(国際会議はネタ的に通る気がしない
  • 国内のコンペだけど機械学習コンペに参加するようになった
    • 来年はkaggleも
  • 学生も終わりで悲しい(もうちょっと色々したかった)

競プロサークルの話

この記事は「競プロ!!」 競技プログラミング Advent Calendar 2017の8日目の記事です.投稿が遅れて申し訳ありません

adventar.org

この記事では弊学の競プロサークルで行っている活動について書きたいと思います.

新入生勧誘

2年前までは所謂新歓期にサークル員の勧誘は行っておらず,プログラミングや数学が得意そうな学生を直接スカウトする仕組みでした.しかし競プロサークルがあまり認知されていない*1こともあって,中々新しい人は入っていきませんでした.実際自分の1年下の学年は僕が2年生になるまで誰一人いませんでした.
そこで弊学で4月の新歓期にブースを構えてチラシを配布することにしました.これまでチラシ作りに関するノウハウがなかったので苦労しましたが以下のようなチラシを作って配布しました*2.100枚印刷していましたが,50枚も配布できなかったのでもっと少なくていいと思います.配布枚数とサークル員のコミュ力には正の相関があると思うので来年以降は見定めてください.

この効果もあって2016年度は10人以上,2017年度は7人ぐらいが興味を示してくれました.2016年度当初の2年生以上のサークル員の数は5人だったので急に増えて驚きました.このことが前期の活動内容に大きく影響します.

前期

前に書いた通りたくさんの1年生が入ってくれました.その1年生の殆どはプログラミングについて知らず,サークルとしてプログラミングとはなんぞやということを教える必要に迫られました.しかしこれまでは,優秀そうな学生をスカウトするという方針だったため,チラシ同様にプログラミングを教えるというノウハウがありませんでした.
2016年度は幸いにも自分の同期が,他の部活で1年生にC言語を教えていた経験があり彼に頼むことにしました.内容としてはC言語の基本的な文法などを抑えた後,C++の便利な機能を紹介するというものでした.人数が多くなったためパソコンの数も足りなくなり部室*3で活動を行うことを諦めて,大学の演習室を借りて行いました.
2017年度は自分がC++を1年生に教えました.1人で毎週勉強会用のパワポを1から作るのは大変だったので,なんとかして分業する or 手を抜く方法を考えたほうがいいです.日程は以下の通りでした. f:id:odan3240:20171213232158p:plain

1回の勉強会の流れは,その日扱うトピックについて紹介→バチャコンでそのトピックに関する問題を解いてもらうでした.バチャコンを使うことで誰がどの問題にハマってるか確認しやすかったです.バチャコンに使う問題はRiPProの方からABCのAB問題に対して,C++のどの文法の知識を使えばいいかタグ付けされた問題リストを頂いていたので,それを参照して選びました.
一応ACM-ICPCの国内予選のA問題は解けるようになって欲しいと思っていましたが,1年生に国内予選の感想を聞くと難しかったようです*4.どうすればプログラミング未経験者を数ヶ月でA問題を解けるようになってもらうかも今後の課題です.
C++勉強会用に作ったスライドはクオリティの高いものではないので,一般公開する予定はないのですが,同じようにサークルで1年生向けに勉強会を開く時に使いたいという人がいれば差し上げます.

これまでは週1の活動だったので,1年生向けにプログラミングの講習会を開くと自分たちの勉強会が消えてしまいました.そこで上級生向けの勉強会を別の日に行うことにしました.この勉強会はバチャコンを開催し問題に取り組み,その後問題をどう解いたかを話し合う形式です.

後期

まず,前期にたくさんいた1年生はほとんど来なくなりました.これはある程度は仕方ないと考えています.

2016年度より後期は週ごとにアルゴリズムかデータ構造と担当を決めて,輪講形式の勉強会を開きました.これはせっかく集団で競プロをやっているので何かしらの知見を共有したいとの理由で始めました.2017年度のスケジュールは以下の通りです.

f:id:odan3240:20171213233738p:plain

しかしこれも難しいなあと感じます.

それと前期同様に皆で集まってバチャコンの問題を解く勉強会も別の日にやっています.

最近

もうちょっとサークルらしくしようという声が上がり,その一つとしてロゴを作りました.作成には Build a Website - Squarespace を使いました.

f:id:odan3240:20171213234424p:plain

このアイコンは皆でコンペした結果wheson氏が作ったものが採用されました.

twitter.com

他にもロゴのステッカーも作る話や,外部向けのサークル紹介サイトを作る話が挙がっています.続報があればここに追記するかもしれません.

おわりに

弊学の競プロサークルの活動についての紹介をしました.自分が認識している問題点とはしては以下の通りです.

  • 数ヶ月でICPC国内予選A問題を解けるようになるには
  • 1年生から4年生まで全ての人が嬉しい輪講形式の勉強会の方法

いつか改善されてほしいですね.

ここまで書いていてあれですが,実は弊学には競技プログラミングサークルはありません.どういうことかというと,自分の所属している競技プログラミングをする団体はサークルや部活ではなく,学生プロジェクトというものに分類されているため厳密にはサークルとは異なります.やってる内容自体はサークルと変わりないのですが,部費がタダだったりRUPC,JAG夏合宿などに参加するために大学から金銭的な援助が得られるので色々お得だなあと思いながら活動しています.ただ,他の人に紹介する時に手間なのでいつもサークルだと言い張っています.

*1:大学の掲示板にチラシが貼ってあるだけ

*2:2017年度版,2016年度のはどっかいった

*3:厳密には違う

*4:それはそう

bashからzshに乗り換えた話

この記事は、 OIT Advent Calendar 2017の2日目の記事です。

前置き

元々OIT Advent Calendarに弊学の梅田キャンパスを「がっこうたんけんした話」を書くつもりでしたが外が寒くてダメでした.何か記事を書くネタを考えたところ最近zshを使い始めたのでそのことを書くことにしました(偶然にも2日連続シェル環境の記事になった).

dotfiles

最初に貼っておくとdotfilesは以下にあります

github.com

Docker

また以下のコマンド群をコピペするだけで僕のzshを試せます!

docker run --rm -it odanado/zsh zsh
./install.sh && ./deploy.sh
source ~/.zshenv && source ~/.zshrc

動機

周りに影響されてfishを触ってみたところ,デフォルトで入っているauto suggestion機能がとても便利に感じました.ほぼ何もカスタマイズされてないbashで作業をするのは目に見えない時間を失っているようで嫌だったので,bashを辞めることを決意しました.
乗り換えるshellを選ぶ上で前から気になっていたzshと,周りの人が使っているfishで悩みましたが,zshの方が色々カスタマイズできてネット上に情報が多そうだったので,zshを選びました.

プラグインマネージャ

まず最初にプラグインマネージャを選びました. Preztooh-my-zshAntigen などもありましたが, zplug がいいとの情報が多かったので zplug を選択しました.後述しますが実際使ってみて最高でした

インストールしたプラグイン

zsh-users系

目についたやつを入れていきました

peco

pecoはリアルタイムgrepみたいなコマンドです.GO言語で実装されていて厳密にはzshプラグインというわけではないんですが, zplug だとこういったものも zplug "peco/peco", as:command, from:gh-r でインストールすることが可能です.この柔軟性が最高だと思いました.

ghq

これまでは ~/git 以下にひたすらgit cloneしたリポジトリを集めてましたが,ghqを使えば管理が楽になります.これも zplug を使って zplug "motemen/ghq", as:command, from:gh-r でインストールできます.

anyframe

pecoと連携するためのプラグインです.ほしい関数が用意されているので使うのにキーバインドやaliasを設定するだけで使えるようになって便利.

powerline

ターミナルのステータスバー?をかっこよくするやつ. zplug は他人のzshファイルを読み込むこともできて, zplug "powerline/powerline", use:"powerline/bindings/zsh/powerline.zsh" でインストール可能です(ほんと最高). デフォルトのconfigだとかっこいい三角形を表示するためにpowerline用のフォントをインストールする必要があります.しかし三角形を表示するためにフォントをインストールのは大げさだと思い,configで"default_top_theme": "ascii" としています.他にも設定を弄って最終的にこんな表示になりました. f:id:odan3240:20171202222956p:plain

その他設定

ヒストリ

どうやらデフォルトではヒストリを保存しないぽいので設定しました

export HISTFILE=${HOME}/.zsh_history
export HISTSIZE=1000
export SAVEHIST=500000
setopt hist_ignore_all_dups # 同じコマンドをヒストリに保存しない
setopt hist_reduce_blanks # 無駄なスペースを消してヒストリに保存する
setopt share_history # ヒストリを共有

ssh-agent関係

tmux内でもssh-agentが使えるように以下の記事の設定をコピペしました

qiita.com

CIとか

TravisCIとDockerを使ってgithubにpushされるたびに,zplugでのプラグインのインストールが成功することと,zshenv及びzshrcの読み込みが成功することをテストするようにしました.本当はちゃんど動作するところまでテストしたいと思っていましたが方法がわからず,ないよりマシの精神でインストールとロードまでをテストしています.この辺の知識がある方がいれば教えていただきたいです(あとneovimの起動もテストしたい).

おわりに

bashからzshに乗り換えてインストールしたプラグインや設定を紹介しました.今回zshに乗り換えたことでシェル環境の快適度が増して個人的にとても満足しています. zshにはこんな便利なプラグインがあるよ!とかこの設定書くと便利だよ!などの情報をお持ちの方はぜひ教えてください.

SIMD-oriented Fast Mersenne Twisterのpythonラッパーを書いた

SIMD-oriented Fast Mersenne Twister とは

SIMD命令を使うように設計されたMersenne Twisterのこと.普通のMersenne Twisterより高速に動作する.3DSのあるゲームソフトで擬似乱数を生成するために使われていたりする

動機

SFMT(SIMD-oriented Fast Mersenne Twister) を使う時はいつもCでプログラムを実装して,それをpythonからsubprocessで呼び出していた.この方法だと使える言語に制限があるAWS Lambda など使えない.
そう思って作ったがこの記事を書くにあたって改めて調べるとバイナリも一緒にアップロードすれば使えるらしい.まあ,バイナリを作ってアップロードするという手間が省けると思うことにする.

すでに作ってる人はいたが sfmt_genrand_real1 しか実装されておらず, sfmt_genrand_uint64 を使いたい自分の要望にはマッチしていなかった. GitHub - mochizuki-ichiro/pysfmt: SIMD-oriented Fast Mersenne Twister for Python Cythonの勉強も兼ねて自分で実装することにした.

コード

github.com

pypiにもアップロードしたので pip install pysfmt でインストール出来る

問題点

coverageを計測したかったけど何故かできていない http://cython.readthedocs.io/en/latest/src/tutorial/profiling_tutorial.html#enabling-coverage-analysis にあるように .coveragerc に設定を書いたけどダメだった

condaをパッケージマネージャとしてインストールする

動機

conda コマンドは便利だけどシステムのpythonは上書きしてほしくない. python-venv ぐらいのノリで conda コマンドを使いたい
pytorchはcondaコマンドでインストールすることを推奨してるので,こっちでインストールしたい

方法

実はPyPIにcondaコマンドは登録されていてこれをインストールすればよい.
ただ単純に pip install conda でインストールするだけでは以下のように condaにpip経由でインストールしたことを怒られる

ERROR: The install method you used for conda--probably either `pip install conda`
or `easy_install conda`--is not compatible with using conda as an application.
If your intention is to install conda as a standalone application, currently
supported install methods include the Anaconda installer and the miniconda
installer.  You can download the miniconda installer from
https://conda.io/miniconda.html.

しかしこれは4.3系からの仕様なのか,4.2系を入れると特に怒られずにcondaコマンドを使える.つまり pip install conda==4.2.7 でインストールすれば良い

とりあえずこれで conda installconda create が使えているので良しとする

ICPC国内予選2017参加記

お疲れ様でした

f:id:odan3240:20170715103746p:plain

チーム

コンテストの様子

問題文を印刷する.模擬国内予選と同様にA問題も印刷してしまう.
最初のABCはチームメンバーそれぞれが担当することになっていたので,自分はC問題を読む.実装がちょっとつらそうだけど去年と同様に簡単なC問題なので,やはり4完しないとアジア予選には参加できないなと思う.

00:12 A問題 AC

B問題を解いている後輩がちょっと詰まっているみたいなので,A問題を解いた同期に様子を見てもらって,C問題を実装し始める.微妙にどこかバグってるなあ頭悪いなあとつらくなっていたら,B問題が実装できそうとのことなので,ソースコードを印刷してパソコンを交代する.

00:49 B問題 AC

印刷したソースコードを眺めていたら,頭の付いていない箇所を見つけたので修正する.それでもサンプルが一致しなくてデバッグしていると,外側の最小値を2回掛けていることがわかり悲しくなる.修正するとサンプルが一致したので提出した.

01:10 C問題 AC

個人的にいいペースで3完でき,何とかして次の問題を解きたいぞとなる.
E問題は実装を頑張れば通りそうだし,しっかり考察をすれば実装が軽くなる系の問題な気がしたが,順位表はD問題を通しているチームが圧倒的に多かったのでD問題を解くことに決める.
レシピと材料で2部グラフを作りフローを流せば解ける気がしてしまう.考察してる間に後輩にライブラリを写経してもらう.全部のレシピを試したことにして,材料が偶数個になるように辻褄を合わせるために消すレシピを最小化すれば,元の問題が解けることに気付く.この最小化の部分を最小費用流で解けそうだと感じて実装するがサンプルが一致しない.このまま時間切れで終了.

コンテストの感想

D問題はnの大きさで場合分けだったらしい.最初問題を読んだ時にsqrt(500)の値は計算していたのに気づかないのは悲しかった.考察の最中に愚直にbitDPすれば2**500だからつらいよねーとか嘘を言っていた悲しい.
やっぱ4完の壁は大きいと感じた.

解いたC問題のソースコード

gist.github.com

ICPCの感想

色々あって恐らく今年で引退になりました.ICPCは高校から競プロをやっていた関係もあって1年の頃から参加してきました.戦績はこんな感じです.

学年 解いた問題数 順位
1 2完 83位
2 3完 54位
3 3完 73位
4 3完 66位

今年うちの大学からICPCに参加した人のほとんどは来年も参加可能だし,日常的にAtcoderなどのコンテストに参加する人が出現し始めたので,来年以降に期待したいなと思います.
進路が確定したらJAG入りするのかなあ.

何はともあれお疲れ様でした.アジア予選進出された方は引き続き頑張ってください.