うにゅーん、って感じだ

だいたいのコンテストサイトで橙か赤です、よく C#を書きます。

東京工業大学プログラミングコンテスト2019 (TTPC2019) の運営

東京工業大学プログラミングコンテスト2019 (TTPC2019) がどのように運営されたかを書いていこうと思います。
atcoder.jp

メンバー

主犯

  • riantkb

Writer/Tester

カッコ内は今回のコンテストで使用された問題における writer/tester 数

  • rickytheta (3/2)
  • riantkb (3/11)
  • noshi91 (1/6)
  • goodbaton (2/1)
  • abc050 (3/1)
  • mikit (1/1)
  • kcvlex (0/7)
  • arkark (1/1)
  • ninja7 (1/2)

オンサイトお手伝い

  • Ashurnasirpal
  • monman53

テストプレイ (OB)

  • camypaper
  • tokoharu

体制

Writer 陣のレートが低くなかったため、基本的には原案者がそのまま作問までやる方針になりました。
各問題 Tester は最低でも 1 人、基本的には 2 人以上つくようにして、また少なくとも 1 人は橙以上が Writer または Tester に含まれるようにしました。

全ての問題のテストは Rime を使って行われ、かつ全ての問題に対し testlib.h を用いた generator/validator が用いられました。

github.com
rime.readthedocs.io

Rime, testlib に対する知見がかなり溜まったので、そのうち余裕があったら何か記事を書くかもしれません(一生書かなさそう)。

みんなレートは高いんですが作問経験がほぼなかったので(しいて言うと自分が yukicoder で 15 問くらい作ったことがあるのと別の場所で作問のおしごとをしたことがあるくらい)、基本的に自分が問題準備のやり方を整備してみんなに準備してもらい、細かい問題文の修正などについては全て自分がやるようにしました(これは自分に半角英数字の前後は必ず半角スペースを開けたい、みたいなこだわりが色々多かったのも理由にあります)。

オンサイトイベント

tsukammo さんに多大なご協力をいただき、オンサイトイベントを同時に開催できることになりました。本当にありがとうございました!!!

atnd.org

活用したサービス

TTPC2019 において活用されたのは主に以下のサービスです

Slack

主に以下のようなチャンネルが存在していました。

  • #general, #random
  • #problem_idea(問題案の投下)
  • #meeting-日付(Slack 上でのミーティング)
  • #nittei_chosei(ミーティングの日程調整)
  • #githubGitHub へのコミットやコメントなどが垂れ流される)
  • #ci(Travis CI のテスト結果が垂れ流される)
  • #ttpc2019_0831(当日の連絡用)
  • #jikkyo(コンテスト中の実況)

問題案については最終的には 30 問ちょいくらいありました。

Google スプレッドシート

色々な用途で使用されましたが、一番大きく使用されたのは問題案整理だと思います。

#problem_idea に書かれた問題案をシートに書いて、難易度や推薦度などの投票をしていました(結局この投票はそこまで意味を持たなかったですが…)

f:id:riantkb:20190902005907p:plain

あとはテスター進捗状況を管理したりするのに使われていました。

GitHub

問題準備には GitHub のプライベートリポジトリが使われました。

実際の使い方としては、問題を 1 問準備するときはその問題用のブランチを master から切ってその中で準備をし、ある程度完成したら master にプルリクを飛ばす、というようにしていました。
問題文や制約の修正提案などはプルリクのコメントで行われていたような気がします(ほんまか?)。
ちなみにマージされる条件は定義されておらず、コンテストが終わってこの記事を書いている現時点でもマージされていません。

各問題の作業ブランチが分離しているためわかりやすく作業もしやすい反面、generator/validator を書いているときに他の問題からコピーしてこようとするときや、実際にサーバーに問題をアップロードするときなどに面倒だったので一長一短だったような気もします。

Travis CI

rime test を CI で回していました。
どうせ GitHub にコミットする前に手元でテストをするのでそこまで必要感はなかったのですが、Tester の中で PC のスペックが異なるときの実行時間計測などにおいて一つの指標になった(有用かは置いておいて)のでまぁあってよかったかなという気持ちです。

Google スライド

解説を書くのに使いました。
各々で同時に編集ができるので、各問題で別々に作ってあとでマージする手間が省けて良いと思います。
数式が書けないのと PDF にエクスポートする時に微妙に崩れるのが難点。

所感

  • 問題案は集めまくって損することはないのでどんどん溜めたほうがよい
  • Java, C#, Python あたりをそこそこ自由に書ける人がいるとよい
  • きちんとスケジュールを立てて計画的に準備すべき(TTPC2019 では失敗しました)
  • 誰か 1 人はものぐさでなく、外部とちゃんと連絡を取ったり会議の調整とか進捗を煽ったりできる人間がいるとよい
    • しかし、それが 1 人だけだとその人に仕事の 95% くらいが集中して危険



おまけ(大まかな流れ)

2月初め

TTPC Slack, GitHub リポジトリが作られる

ゴールデンウィーク

作問合宿(大学に集まって問題アイデアを出しまくる会)が開かれる
確か N法陣、Inversion Numbers of Tree あたりはこの時に作られた気がします

7月中旬〜後半

日程が決まる
オンサイト会場も決まる
コンテスト時間は 4 時間のつもり
この頃から毎週末に Slack 上で meeting を始める
問題の準備の仕方が確立する(やっと!?)

8月初め

オンサイトの atnd を公開し、参加者の募集を始める
丸 1 日くらいで埋まってウケる
参加者に銀冠がいてウケる

8/18 あたり

大まかな採用問題が決まる
問題準備とテスターをがんばる

8/25 あたり

採用問題に嘘が見つかり冷える
制約を変更することで事なきを得る
採用問題が確定する
死ぬほど問題文を修正する
テストプレイをしてもらったら虐殺セットであることが判明した
とりあえずコンテスト時間を 5 時間にすることにした

8/30

銀冠に 3 時間で全完される恐怖に打ち勝ち、セットの中で一番難しい問題を抜いて Next TTPC(この日に思いついた)を入れた
問題の順序がずれたので死ぬ気で修正する
なぜか麻雀をした

8/31

本番
胃が痛い
なんとかなってよかった

レッドコーダーなので就活で俺TUEEEEをしようと思ったがそうもいかなかった件(タイトル募集中です)

はじめに

このタイトルは若干盛っています。すぐに出てきますが、自分がレッドコーダーなのは Codeforces というサイト(いま世界で一番参加人数が多いコンテストサイトですかね?)においてで、日本で有名な AtCoder では一つ下のランクであるオレンジコーダーです。

また、これも後述されますが、自分には他の競技プログラマにないディスアドバンテージを持っていたりするので、決して一般的な話でなくあくまでも一個人の話であることを念頭においてください。
例えば、この記事のせいで「この人が落ちたんだから自分なんて受かるわけないし諦めよう」とかなって企業に不利益が出たとか言われても困るし。
また、就活模様は毎年大きく変化すると思うので、今後就活がある人は本当にあくまでも参考という程度にしてください。


お前は誰

競技プログラミング

rian, riantkb, rian_tkb などの名前でコンテストなどに参加しています。

AtCoder

atcoder.jp
f:id:riantkb:20190703152522p:plain
レートは日本人の中で 50 番目くらい、日本人の学生の中で 30 番目くらい、同学年の中で 5 番目くらいに高いと思います。

Topcoder

www.topcoder.com
f:id:riantkb:20190703153423p:plain
統計情報はよく知りませんがまぁまぁ高い方だと思います(ほんまか?)。

Codeforces

codeforces.com
f:id:riantkb:20190703171057p:plain
レートは日本人の中で 30 番目くらい、日本人の学生の中で 15 番目くらいに高いです。

その他

ICPC2018(年に 1 度の 3 人 1 組の学生チーム戦)の国内予選で 2 位を取ったり、SnackDown2017(2 年に 1 度くらいの 2 人 1 組のチーム戦)で決勝まで進んでインドに行ったりしました。
コンテストの中には本戦に進出したり上位に入賞したりすると T シャツがもらえたりするものもあるのですが、そんな T シャツが家に 20~30 着ほどあります。

学歴

東京にある国立中高一貫男子校(もしかしてこれって一意ですか)に 6 年間通い、東工大に進学しました。大学院も東工大に進み、情報工学を専攻しています。研究は学部 4 年から、バイオインフォマティクス(生命情報解析)と呼ばれる分野に関する研究をしています。


面接でアピールした事柄たち

以下に書いたことはもちろん全てを一度の面接で言ったわけではなくて、全ての面接の和集合を取った感じです。

研究

すごく簡単に研究でどんなことをやっているかの説明をしました(機械学習など、技術としてわかりやすいことをやっているわけではない(強いて言うならば最適化)ので、どちらかと言うと、こういう理由でこういう需要があるため、こんなような問題を解いている、みたいなストーリーの方をわかりやすく説明することが多かったです)。
具体的な内容が気になる方は研究会発表のときのスライドを乗っけておくのでこちらを参照してください(後で出てきますが、自己紹介用のスライドを持っていくタイプの面接ではこれを 5 ページ程度にまとめて説明しました)。
github.com

業績はほとんどないんですが、一応国際論文の 3rd author に入ったり、国内の研究会で発表して(上のスライドのやつ)優秀プレゼンテーション賞をいただいたりしました。

インターン

修士1年の夏に、④社(この表記は後でわかるので今は気にしないでください)で 6週間のインターンをしました。
内容はガチガチのフロントエンド開発業務で、開発業務経験がないどころか JavaScript なんて 1 文字も書いたことない、MVC モデルって何、という状態から、ひいひい言いながら Spring, React, Redux などを使った開発をしていました。
一応期間中にデプロイできて、簡単なリアクションをいただくところまでいけたはずです。

インターンにいく前は自分がガチガチの開発業務をする将来なんてものは全然考えていなかったのですが、インターンでやってみてこういうのも全然面白いし、何より保守を考えてわかりやすく簡潔なコードを書いていくというのはわりと得意で向いてるかも、と思った記憶があります。

アプリ開発

大学院の授業の一貫で、Android アプリの開発をしていました。
2 回あって片方が半月ほどの個人開発(実際には計画性が虚無なので半日で作った)、もう片方は 1 年間のチーム開発でした。

個人開発の方だけ簡単に説明をしておくと、写真を撮るとそこから顔検出をして映った人の顔を福山雅治に置き換える、というアプリを作りました。
github.com


ウェブ開発 (TokyoTech Online Judge)

学部2年生向け向けの C 言語の実習の授業の TA をしていて、その授業で使用するオンラインジャッジシステムの保守運用、bug fix、および一部機能の開発をしていました(実際に開発したのは 2 つ上の先輩なんですが、すでにご卒業されていて大学にいないため)。
Ruby on Rails, Docker, MySQL あたりをひいこら言いながら触っていて、ずっと原因不明だったバグを解決したり新たに順位表機能やスコア問題機能を実装したりしました。

開発? (TSP Visualizer)

上の TA の関連で、TSP のビジュアライザを作ったりしました。kimiyuki さんのフレームワークをお借りして(魔改造して)作りました。
TypeScript を触るのは初めてでしたが、型があるっていいなぁとなった(適当)。
github.com
riantkb.github.io


ディスアドバンテージについて

これは書くかどうかけっこう迷ったんですが、この記事の内容をより正確に、客観的に評価してもらうには書く方が正しいと思ったので書きます。

吃音症

自分はけっこう重めの吃音症を患っています(障害と見なされるようになったらしいので患う、という表現はもしかしたら適切でないかもしれません)。
吃音症についての説明は wikipedia とかを参照してください。
ja.wikipedia.org

どんな感じかという説明はなかなか難しいのですが、一つの例を挙げるとすると、自分の場合は語頭の無声音が苦手で、自分の名字を吃らずに言うことができない、というのがあったりします。
また、相手にわかりやすく伝えるために抑揚をつけて喋るときや、緊張しているときに吃りやすくなるため、端的に言うと面接に死ぬほど向いていないです(ちなみに、べつに緊張していなくても吃るので家族や友達などと話すときも普通に吃ります)。
同様に研究発表も死ぬほど向いていなくて、普通の人が半分くらいの時間で発表し終わるような分量まで削って持っていくことが多いです(かなしい)。

このような背景があったのですが、これが直接的にディスアドバンテージになった(この人は吃音持ちだから取るのをやめよう)とかがあったかどうかは知りません。というかさすがにそれはないんじゃないなぁと思います(これは楽観しすぎですか?)。
ただ、やはり必ず間接的にはディスアドバンテージになっていると思う(吃ってしまい十分に自己アピールができなかった、等)ので、就活の参考にする際にはその点も踏まえるべきかもしれないです。


就活概要

就活の結果としては、7 社を受けて、内定をいただくことができたのは 2 社でした。
これらをおおよそ最終結果が出たのが早い順に ①社〜⑦社 と呼ぶことにします。

①社

①社は ICPC のスポンサーもしていてなるほどなぁ〜、と思ったので 3 月末くらいにエントリーをしました。
通常コースとスペシャリストコース的なのがあったと思うんですが、普通の方に申し込みました。

4 月中旬くらいに web テストを受けて(競プロちっくな問題だった気がします)、5 月中旬くらいに 1 次面接を受けてそこで落ちました。

1 次面接では面接官がフロントエンドのエンジニアの方だったので、基本的にインターンの話を聞かれました。
ただ、如何せん1年近く前のことで、かつそのときすでに TOJ を触っていたこともあり薄い記憶の彼方な話をしていた記憶があります。

また、会社内で競技プログラミングがあまり盛んでないらしく(面接官の方々もやっておらず、また周りでやっている人も知らないとのこと)、なんで ICPC のスポンサーやっているんだろうと思った記憶があります(それを実際に聞いたかどうかが記憶がない…)。

②社

②社は AtCoder でコンテストも開いており、競プロer で行っている人が多く、また楽しそうな雰囲気もすごく伝わってきていたので 5 月初めくらいにエントリーしました。
ここまでエントリーが遅くなった理由としては、正確には②社の中のあるグループ会社?に入りたかったんですが、②社が全社一括採用をしていてどうすればいいのかわからなかったというのがあります。そして、どうすればよかったのかは結局最後までわかりませんでした。

その後、5 月中旬くらいに web テストを受けて(これは競プロちっくな問題とそうでない問題が両方あった気がします)、その結果が返ってきませんでした(え?)

終わりです(え?)

③社

③社はまず去年の夏にインターンにエントリーをしていました。インターンに関しては通過したんですが結局④社の方に行ったので参加はせず、という感じでした。

その後、登録したメールアドレスに新卒採用に関するメールが来るようになって、暇だし web テストだけ受けておくか…、って言って 1 月中旬くらいに受けました(競プロちっくな問題だった気がします)。

すると通過となり、1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。
1 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。

……

そんなメールを 8 回くらいスルーしていたら、いきなり電話がかかってきて「お前来週のこの日空いてるか? 面接すっぞ」って言われました(もちろんこれは超意訳です)。
そうして 4 月初めくらいに 1 次面接を受けに行きました。

すると通過となり、2 次面接の日程を予約しろというメールがきました。しかしめんどくさいのでスルーします。

今度はすぐ電話がきました。2 次面接の日程が決まり、2 次面接をします。

そんなこんなで 4 月中に 3 回面接をしました。

ただ、その時点では他の企業の選考が本当に全く進んでいなかったので、5 月末にもう一回面接をすることになりました。
そこで 4 回目の面接をして、内定を頂きました。

④社

④社は実際にインターンに行ったところです。
人事さんと仲良くなったので、エントリーが始まったときに教えてもらい、3 月末くらいにエントリーをしました。

その後 web テスト(競プロ)と英語テスト(つらい)と適性検査(SPI と呼ばれるやつ?)を受けて、6 月初めくらいに 1 次面接を受けました。

面接の形式は 1 時間のコーディングインタビューで、自分の場合は日本語でした(人による?)。


朝一だったので頭が回っておらず任意のコーナーケースを踏みまくりましたが、まぁちゃんと最後まで行ったっぽいし大丈夫かな、と思っていたんですが落ちました(サイレントお祈りをされました)。かなしいね。

⑤社

⑤社も AtCoder でコンテストも開いている会社です。最近強い競プロer がモリモリ入っている印象で、また研究室の先輩で行っている人が多いという印象もありました。
競技プログラミングのレートが高いとあるコースに申し込めて、そのコースの人は初年度の年収が高くなる、という話があったので 4 月中旬くらいにそのコースでエントリーしました(AtCoder のレートはギリギリ足らなかったんですが、Codeforces のレートが足りていたため)。

その後、5 月初めくらいに 1 次面接を受けました(そのときに実は本来 1 次面接より前にある web テストが免除されていた、という話を聞いた気がします)。

1 次面接は通過となり、6 月中旬くらいに 2 次面接を受けました。
2 次面接は自分のやってきた技術分野とかの紹介スライドを持って行って 5 分程度プレゼンするという形式で、まぁ上に書いたことの一部を適当に持って行きました。わりと研究の話がウケていたような気がします。

その後 6 月末にもう一度面接があり、そこで内定を頂きました。
ただ、初年度の年収に関しては一般の修士卒の金額で、という話でした。理由としては、アルゴリズムなどの知識・経験などは十分だが web 系の経験はまだ十分とは言えないので、という説明をされました。

⑥社

⑥社は 3 月末くらいに ICPC に参加した学生向けのイベントがあり、そこでエントリーをしました。

その後 4 月中旬くらいに web テストがあり、5 月中旬くらいにオンライン面接(日本語)がありました。
このオンライン面接もコーディングインタビュー的な感じでした。問題が興味深かったんですが誰にも共有できないかなしみ。

その後、6 月中旬くらいに面接がありました。
その面接は 45 分のコーディングインタビュー が 4 セットで、自分の場合はそのうち 2 回が日本語でした。

英語自体はとても苦手なのですが、英語のコーディングインタビュー自体はインターンの面接のときにも経験していたのでそこまでめっちゃ不安というわけでもなかったのですが、なんか手応えはそこまで良くなく、実際落ちました。

⑦社

⑦社は AtCoder でコンテストを開いており、そのコンテストの本選に進出したことで最終面接より前の面接をスキップできる権利を持っていたので、5 月初めくらいにエントリーしました。

その後、6 月末くらいに最終面接があり、落ちました。


就活をして思ったこととか、スタンスとか

どういう基準でエントリーする企業を選んだか

基本的には、AtCoder でコンテストを開いたことがある企業からエントリーする企業を選んでいました。
理由としては、探すのがめんどくさかったというのもあるんですが、コンテストを開くくらいだから競プロer の良い点悪い点を理解して、その上で競プロer に来てほしいと思っているのではないか、と思ったのが大きかったと思います。

何をして働きたいか

これが難しくて。だって、本音を言うと「働かずに金が欲しい」で、百歩譲って「競プロみたいな問題を解いてたら金が降ってきてほしい」。
じゃあ 200 歩譲るとどうなるかと言うと「やりたいことは特にない(コードが書ければなんでもいい)」になるんですが、実はこれは就活ではダメらしいです。えー、なんでさ。



でもエントリーの段階でフロントエンドエンジニア、バックエンドエンジニア、アプリ開発エンジニアとか分かれている会社もあるし、やりたいことが決まっている人は決まっているんだなぁ、となりました。

あとこれはわりとびっくりしたんですが、例えばアプリ開発をやりたいけどフロントエンドは死んでもやりたくない、みたいな人が存在したりするらしいです。
個人的にはそこらへんって本質というか根幹は同じだと思っているので、単純になんでそういうことになるんだろうなぁと思いました(これは普通に興味があるので、そういう方がいたら教えていただきたいです)。

結局面接では、まぁ競技プログラミング的なアルゴリズムとかが活かせる問題があれば嬉しいけど、べつにそういうのじゃなくても良いし、開発もインターンでやって面白かったし向いていると思ったのでそっちでも問題ない、みたいなことを言っていました。

企業を選ぶ基準、企業の順位

これも聞かれて困る質問でした。上で書いたように、やりたいことが明確でない/どんなことでもわりと楽しめてしまう ので、どうしても業務内容よりも環境(給料、周りの社員の優秀さ、等)を挙げることが多かったです。
でもこの回答は、おそらく面接官からの印象はそこまでよくなさそうな気がします。

就活のタイミングについて

これについてですが、まず自分の始めた時期は比較的遅めだったと思います。
自分が本格的に色々な企業にエントリーをし始めたのは 3 月中旬くらいからで、その頃にはすでに就活を終えてる同期もいました。

基本的にはいつ就活をしてもいいとは思うんですが、いくつか難しい点があって、

  • エントリー〆切(3 月末ごろにはもう締め切っているところが多い)
  • (今年の場合、)一部 6 月になってからじゃないと面接をしない企業があり、そうでない企業の選考が早く終わってしまうと長く待ってもらうことになる
  • 通年採用のところは、早いうちに選考を進めないと枠が絞られてしまう/埋まってしまうという噂がある(ほんまか???)

あたりを気をつけるべきかもしれません。

面接について

率直な感想としては、良い雰囲気で進んでいても落ちるときは落ちるなぁというやつでした。
終始和気藹々として 1 時間を過ごしたのに落とされると、普通に人間不信になります。
例えばコンテストとかだと明確な判定基準があってこれが解けなかったからこの順位、とかがあると思うんですが、面接で落ちてメールでいつもの定型文を受け取っても、どこが悪かったか、どうしたらよかったか、今後どうすればいいかなんてわかりません。

あとは、やはり短い時間で自分の優秀さをアピールしなければならないので、練習とまではいかなくても話す内容の準備くらいはしていくべきだと思います。
個人的には、たった 1 時間の面接による印象よりも競技プログラミングのレーティングの方がどちらかと言うと頭の良さとか優秀さとかに対する相関があると思っているのですが、さすがにそんなものはただの持論で、実際には競技プログラミングのレーティングにはそんな影響力はないので、やはり口の上手さは重要になると思います。

あとはまぁこれですね。

あとこれも。

結局競技プログラミングだけで就活はできるのか

端的に言うと、受ける会社・受ける職種に依ると思います(それはそうすぎる)。

例えば、面接が全てコーディングインタビューのみの会社だったら、基本的には行けると思います(え、落ちましたが……)。

そうではない場合、例えば機械学習エンジニアを受けるのだとしたら研究分野が機械学習であったり、そうでなくともしっかり触ったことがあることが望ましいだろうし(最近は機械学習をやっている学生も多いため)、フロントエンドエンジニアを受けるのだとしたら少しくらい触ったことがあることが望ましそうです。

それ以外の、特に細かい分かれ方をしていない職種については扱いが少し難しいですが、それに関しては会話が合計で 1 時間持つようなネタがあればまぁ大丈夫だと思います。
これは知見なんですが、競技プログラミングでの成果ってそこまで話を広げられるものでもないという話があります(これはトークスキルに依存するかもしれません)。
なので、みんな研究はやっているだろうから基本はその話で、もしあまり研究で成果がないなら何か他に話せるネタ、アピールできる何かが必要なのかな、と感じました。


就職先について

結局 ③社 と ⑤社 の 2 社から内定をいただき、③社の方に入ることにしました。以下に理由を挙げていきます。

職種について

まずこの 2 社ではそもそも職種が違います。⑤社は web 系企業ですが、③社はいわゆる ITコンサルと呼ばれるところになります。
感覚としてどう違うかというと、前者は何万何億というユーザーに対してサービスを提供、およびそのサービスを改善をしていくのに対し、後者は一人一人(一団体一団体)の抱えている課題を一つずつ整理し解決する、というイメージです(これは個人的なもので、間違っていても責任を負いません(でも間違っていたらこっそり教えてください))。

このどちらが好きか、というのは本当に人それぞれだと思うのですが、個人的には後者の方が好きだと感じました。
あまり関係ないですが、TL にバグった AtCoder の提出が流れてくるとつい見に行って解決したくなっちゃうのと似ているかもしれません。いや、似てないかもな。

業務内容について

最適化をお仕事にできる、というのもやはり魅力の一つではあります。最適化いいよね。

もちろんそれだけではなくて、やはり顧客の抱えている課題を紐解いてちゃんとクリティカルな問題に切り分けていく、というような作業がわりと好きだし向いているなぁと思ったところも大きいです。

まとめ

短くも険しい就活が終わり、つらいことも多々あったけどでも、結局自分で納得のできる結果を得られたかなという気持ちがあります(いま、落ちた 5 社全てからやっぱり内定出すよ、って言われても、やっぱり③社を選ぶような気がします)。

まぁでも苦労したのは事実で、このレートでこの前例を作ってしまったことが少し申し訳ない気持ちもあります。


しうかつが終わったので各位と飲みたい気持ちがあります。連絡をください。雛鶴あいにはならないけど。


今度は、「レッドコーダーなので就活で俺TUEEEEした件」という記事が投稿されるのを楽しみに待っています。


TOJ Extra Problems Contest #1

これはなに

大学で学部 2 年生向けの C 言語の実習授業の TA をしていて、そこで普通の課題だと物足りないプロ向けに extra 問題を作って置いといたやつです(もちろん、成績には反映されない本当にただのおまけです)(一部改題しています)。
ジャッジシステムは学内からしかアクセスできないので、ジャッジは公開していません。

難易度はどれも ABC-D 前後だと思います。
答えが知りたい方は @rian_tkb とかいう人が twitter で解法を呟いていたりするので探していただいても良いですし、近いうちに解説記事も書くと思います。
半分くらい手で写しているので、間違っていそうなところがあったら教えてください。

twitter.com

ちなみに、受講生は以下の言語縛りで解いて(解かされて)いました。

  • C89 に 1行コメント(// ... )と long long型 を足したもの(GCC 拡張は使用不可)



A - Counting Triangles

実行時間制限 : 1 sec

問題文

入力された正整数 {X} に対して、以下の 2 つの値を半角スペース区切りで出力してください。

  • 全ての辺の長さが正整数かつ一番長い辺の長さが {X} であるような三角形の個数
  • 全ての辺の長さが正整数かつ互いに異なり、一番長い辺の長さが {X} であるような三角形の個数

ただし、回転させたり反転させたりすることで同じ三角形となるものは重複して数えないものとします。

入力

X

制約

  • {1 \le X \le 2 \times 10^9}

出力

  • 入力された整数に対応する 2 つの値を半角スペース区切りで出力してください。

入出力例

入力例 1:

1

出力例 1:

1 0

入力例 2:

5

出力例 2:

9 2

入力例 3:

987654321

出力例 3:

243865264941319921 243865263459838440



B - Contiguous Sum

実行時間制限 : 1 sec

問題文

正整数 {N} に対し、和が {N} になる連続した {1} 以上 {N} 未満の整数の組合せを全て出力してください。

入力

T
(case_1)
(case_2)
:
(case_T)

  • 入力は {T} 個のケースからなり、各ケースでは整数 {N} が与えられます。

制約

  • {1 \le T \le 1{,}000}
  • 各ケースに対し、
    • {2 \le N \le 10^8}

出力

  • 各ケースの答えを改行で区切って出力してください。
    • それぞれの解は、{\displaystyle \sum_{k=l}^{r}k = N} なる {(l, r)} に対し、 l-r という形で出力してください。
      • 解が複数ある場合は、 {l} の小さい順に出力してください。
      • 解が存在しない場合は何も出力しないでください。

入出力例

入力例 1:

3
27
8
9

出力例 1:

2-7
8-10
13-14
2-4
4-5

入力例 2:

1
99999999

出力例 2:

309-14145
592-14154
4999-14999
5002-15000
6539-15580
9877-17249
10224-17450
11669-18334
18347-23164
19859-24379
28337-31669
31672-34685
39319-41784
40307-42715
43894-46115
54097-55914
61464-63069
65604-67110
75447-76760
80487-81719
89454-90564
109557-110465
121244-122065
124132-124934
151879-152535
164714-165319
228092-228529
243104-243514
329882-330184
364827-365100
456512-456730
494949-495150
504952-505149
684859-685004
729859-729995
990049-990149
1010052-1010150
1369827-1369899
1515119-1515184
3030287-3030319
4545444-4545465
5555547-5555564
9090904-9090914
11111107-11111115
16666664-16666669
33333332-33333334
49999999-50000000



C - Dividing Combination

実行時間制限 : 1 sec

問題文

{{}_N \mathrm{C}_K} が整数 {P \ (P \ge 2)} で何回割れるかを求めてください。
より正確には、{P^X \mid {}_N \mathrm{C}_K \ \land \ P^{X + 1} \nmid {}_N \mathrm{C}_K} を満たすような非負整数 {X} を求めてください。

入力

T
(case_1)
(case_2)
:
(case_T)

  • 入力は {T} 個のケースからなり、各ケースでは整数 {N, K, P} がこの順に半角スペース区切りで与えられます。

制約

  • {1 \le T \le 2{,}000}
  • 各ケースに対し、
    • {0 \le K \le N \le 10^9}
    • {2 \le P \le 10^9}

出力

  • 各ケースの答えを改行で区切って出力してください。

入出力例

入力例 1:

6
5 3 5
5 3 10
18 4 6
0 0 2
1000000000 1000000 24
1000000000 500000000 998244353

出力例 1:

1
1
2
0
3
1



D - Palindromic Numbers

実行時間制限 : 1 sec

問題文

{L} 以上 {R} 以下の整数のうち、十進法における回文数であるような整数の個数を求めてください。

入力

T
(case_1)
(case_2)
:
(case_T)

  • 入力は {T} 個のケースからなり、各ケースでは整数 {L, R} がこの順に半角スペース区切りで与えられます。

制約

  • {1 \le T \le 10{,}000}
  • 各ケースに対し、
    • {0 \le L \le R \le 10^{16}}

出力

  • 各ケースの答えを改行で区切って出力してください。

入出力例

入力例 1:

6
0 100
101 101
12345 67890
1234333 1234999
99999999 9999999999999999
0 10000000000000000

出力例 1:

19
1
555
0
199980001
199999999

立命館大学競技プログラミング合宿2019 (RUPC2019) 参加記 part 1


どうしてあんなことになってしまったのか


2/17 (day -16)

この日は日経コンがありました。

懇親会が超大人数でヤバかった

ここでせいかしゃんとめるしゃんから、RUPC day2 でコスプレしてチームを組まないか、というお誘いを受ける。この日本語わけわからないな
(これは重要なことなのですが、誘われたからやっただけなので riantkb は何にも悪くないです(?))

念の為 Amazon で検索をしてみる riantkb


2/19 (day -13)

通常配送を利用した場合、最短で 2/28~3/7 のお届け予定です。

これ、いま注文してもワンチャン間に合わなくないか、となり、とりあえず思考を止めて注文ボタンを押す


2/22 (day -10)

往路と宿を確保する(宿については漫喫とかでも良いかなぁと思っていたんですが、コスプレをするならさすがにホテルを取ったほうが良さそうという気持ちになり)


2/26 (day -6)

衣装が届く。思ったより早く届いてよかった
思ったよりスカートの丈が短くて困る。

あとこれも買いました
https://www.amazon.co.jp/dp/B079QGXKWT


3/4 (day 0)

荷造りをして出家する



TL にせいかしゃんとめるしゃんがいたので、一応なんとなく伝わるようにツイートをする

二人からやる感じの雰囲気を感じたので覚悟を決める


3/5 (day 1)

夜行バスに乗り、朝8時に京都に着く

せいかしゃんとふぇりんくんと銭湯に入る


コンテストの中身はぐってぃさんの記事をみると良いと思います
pomupomu.hatenadiary.jp

D がこれで死んでいたのと、G のグラフを構築し切れなかったのが痛かった…

夜行バスのせいで疲労が溜まっていたのでホテルに着いたら即寝た


3/6 (day 2)

前日寝落ちしたので、5時半に起きる
ウィッグの髪が長くてボサボサになることが目に見えていたので、ウィッグオイルと櫛とヘアワックスでなんとかしようと頑張る(でも結局荷物に詰めて立命まで行く間にボサボサになってしまった、かなしい)
2時間くらいかけてなんとか納得いく感じになった写真がこれでした(会場で着たときは用意する時間が eps しかなかったため、おそらくこの写真のときの方がクオリティが高い、かなしい)


会場での様子(完全にやばいチームですねこれは)


コンテストは J で誤差に殺されてもっと他に何も考えられないくらい競プロのことを考えなくちゃいけなかった雛鶴あいになった




この日は懇親会があったんですが、ブラックニッカのせいで記憶が飛びました、やばい
(めっちゃ陽気だったらしいです)(まぁ酔うとだいたいそんな感じになるのでわかる)
皆様に迷惑をかけてなかったら良いのですが…







本当に全く記憶がない

めっちゃ「わかるなぁ〜」って言っていたらしい



ここら辺は記憶が戻り次第追記するかもしれません(これは罠で、失った記憶は戻らない)


3/7 (day 3)

二日酔いで死んでいたんですが、集合時間から20分遅れくらいでなんとか会場にたどり着きました








コンテストは D と E で色々バグってしまい大変だった





解散後は音ゲー勢とにぼからのゲーセンに行きました



色々な人(主にらてあさん)とめっちゃ色々音ゲーをした
f:id:riantkb:20190309001936j:plainf:id:riantkb:20190309002007j:plainf:id:riantkb:20190309002013j:plainf:id:riantkb:20190309002017j:plainf:id:riantkb:20190309002023j:plainf:id:riantkb:20190309002027j:plain



そのあと21時すぎに京都駅から新幹線に乗ったんですが、こいつ次の日の朝9時半羽田発の飛行機に乗って石川まで学会に行かなきゃいけないんだよなぁ




まとめ

RUPC2019 めっちゃ楽しかったです。雛鶴あいのクオリティはもう少し上げていきたいですね(?)
来年はいけるかわからんけど行けたら行きたい



RUPC2019 参加記 part 2 (day 4 - day 6) に続く

IQ1 の一人暮らし(引越し編)

この記事は「IQ1 Advent Calendar 2018」の 20日目の記事です。もうすぐ 2018年も終わりですね。
adventar.org

あらすじ

この前の記事で卒論時期の限界っぷりをみていただきましたが、
rian.hatenablog.jp

「こいつ、大学のそばに家を借りるべきでは……?」と思った人もいるはずです。まぁ私なんですが。

というわけで、晴れて大学院に進学できたのを機に、大学のそばに家を借りて一人暮らしを始めた、という話です。

4月中旬

家を決める。
ちなみに家を探す際は1月下旬までか4月入ってからがオススメです(2, 3月は大大大人気なので)。

5月1日

入居。



大学からめっちゃ近い



ダンボールは優秀

5月3日

カーシェアで車を借りて、実家から荷物を移す。


5月4日

ニトリで色々買い物をし、けっこう人間的になってくる。
なお、机が届くのは10日後なのでそれまではダンボール机です。


洗濯機と冷蔵庫も買う。


5月7日

新居で初の飲み会が行われる。


多分この日に冷蔵庫洗濯機が届いたんじゃなかったかなぁ

5月11日

一人暮らしにより飢えるタイプのおたく。

5月14日

まだダンボール。

5月15日

ネット回線とこたつを得てめっちゃ人間的になる。


5月19日

モニタを買う。

これは料理です。

5月20日

麻雀牌が届く。

これも料理です。

5月24日

麻雀。



その他


よくある


よくある


まとめ

IQ1 でもなんとか生き延びるくらいはできる。


IQ1 の一人暮らし(生活編) に続きます(ほんまか?)