Atcoderでお洒落に入茶した話
最近毎週末、僕はAtCoderの主催する プログラミングコンテストに出場しています。 このコンテスト参加者達はその実力に応じたランク付けがなされていて、 そのランクの強弱は色で表現されています。 まず、初めたばかりの弱い人達は灰色。 そこから、茶、緑、水、青、黄、橙、そして、最も強い人達は赤色が与えられます。
今回僕はランクが灰色から茶色に昇格しました。 そして、代々、AtCoderのコンテスト参加者達は色の変る昇格を果した時、 それまでに自分が行なった努力をブログ等に書かなればならない風習があるらしいので、 僕もこれに習い、お洒落に「色変記事」を記しておこうと思います。
ただ、実際のところ、 好きでAtCoderしている灰色コーダーの人達がやってる事は 多分皆そんなに差はないだろうと思います。 僕はまずはじめ、 AtCoderの解答の提出の仕方を覚えて、 AtCoder Problemsで過去問を解いてその成果を記録出来る事を覚えた後、 暫くはそこで簡単な問題を埋める事に熱中していました。 そして、易しい問題に慣れてくる頃には 「AtCoder」でWebを検索してAtCoderに関する情報を色々と集め、 問題を解く環境(エディタやojやacc)を整備し、 提出用のテンプレートを用意しだしました。 その後は、 ツイッターで飛び交うアルゴリズム勉強の本やサイトの 情報に耳を傾け、「数ってこんな性質あるんやー」とか 「コードってこんなふうに書くんやー」とか 新しい発見に感動し、そういうKnowHowが積み重なっていくのを 素直に楽しいと感じながら、ABCに参加し、過去問をボチボチと解いていました。
つまりは、僕が茶色コーダーになるためにやったことは、 「AtCoderを楽しみながらAtCoderに慣れていった」ってことになると思います。 多分、上に書いたことを「うんうん、そうやんね」と頷き、 AtCoder生活を「楽しい」と思っている灰色コーダーの人は、 遅かれ早かれ茶色になるんだろうなと思います。 一方、うちの嫁様に言わせれば「そんなの良くやってるねー」なので、 やっぱり興味ない人には、続かない(そもそもはじめない)のかなぁ と思います。
結局のところAtCoderを始めてみて、その時間を楽しめている人は単にコンテス参加を続ければ良いだけです。 だだひとつ、入茶する前にTwitterのAtcoder界隈に生息しておくことはお勧めします。
僕のTwitter人生で、自分の事でこんなにイイネもらったことありません! みなさん、ありがとうございました。
この色変記事は
さて、私はGo言語でコンテストに参加しています。 しかし、Go言語を使ってる人少いみたいなので、 Go言語でAtCoderに参加する時に役立つかもしれない事をまとめておこうと思います。
後は、AtCoderについて好きなことを幾つか適当に!
ただその前に、やっぱりまずは、「AtCoderって何?」って人へのAtCoderを軽く紹介しておこうと思います。
AtCoder
世の中には、普通に参加出来るプログラミングコンテストは幾つかありますが、 その中でも、僕が参加しているプログラミングコンテストはAtCoderです。
競プロっておもろいよ!
僕はもともと、Twitterの中で、パソコンが好きな人達、 特にvimやarchlinux、xmonad、haskell、 go辺りの情報が流れる界隈に生息しています。 この辺りの人達は、「パソコンを触る」事が好きな人が多くいるのですが、 一方で、そのパソコンで実際になにかやる「目的」が見い出せず彷徨っている人もいるように見えます。 特にプログラムを趣味でやっている人は、 「何つくっていいかわからん」という人も多いんじゃないでしょうか? そんな人達こそ、競技プログラミングに足を踏み入れてみませんか?!
そうすれば、 ArchLinuxの普段使い用途のひとつとして、 AtCoder専用にカスタマイズしたxmonadのワークスペースで、 neovimを使ってコンテストのコーディングが出来ますよ?!
つまりは、競技プログラミングをすれば、 パソコンを触る目的が出来るわけ! しかも、"I use arch, btw!"とか言いたい人達で、 「俺は、おまえらと違うんだぜ、、悪いが、俺様はハッカーだし」とか、 こっそりと心の中で厨二的なことを呟いたりする種族なのならば、 こっそりする必要はありません! 思う存分AtCoderでハッカー度合いを発揮しましょう!
AtCoderの初め方
さて、興味を持ってAtCoderを始めてみようと思ったら、 まずはAtCoderのサイトで自分のアカウントを作成しましょう。
AtCoderのサイトって実はちゃんと必要なページや 初心者向けのリンクも揃っているんですが、 使い始めの頃は何が何処にあるのか見つけられなくて良く迷子になったり、 「何をすりゃいいの?」ってのは、割と初心者あるあるだったりします。 そこで、アカウント作成が完了したら次に見るべきサイトはココです! そのあたりの事情を汲み取って手取り足取り丁寧に解説してくれています。
AtCoderの問題の見方と回答の仕方、 ジャッジのされ方をマスターすれば、 過去問も本番問題も操作は一緒です! その後は、上記ページでも紹介されているAtCocder Problemsを活用して 過去問に挑戦し、どんどん問題に慣れていきましょう。
このサイトにログインして、 メニューのAccount Infoにある AtCoderUserIDに自分のAtCoderIDを入れておくと、 自分の解いた記録を見る事が出来る様になります。
ABCへの参加
AtCoderを始めて、週末がやって来たならば、 ABCコンテストに参加しましょう! 毎週土曜日の夜9時から10時40分までの100分で行なわれています。
その開始前とコンテスト終了後は、 Twitterでコンテスト参加者の呟きが大量にながれます。 それらのツイートを拾えるタイムラインになってくると、 コンテスト開始直前には、今から始まる緊張感がツイートから伝わって決ますし、 コンテスト終了後は、いくつできたとか、どういう解法だったかとか、 レートがあがったさがったの悲喜交々がタイムラインを色採るようになります。 AtCoderの色々なページには、ツイッターにシェアするためのボタンがあるので、 自分の参加や成績をシェアしていると、タイムラインがAtCoder色に染まって行くと思います。
もしかしたらはじめは、AtCoder系のツイートは内輪ネタや専門用語も混じっているため 「楽しそうに話してるのは雰囲気で分るけど、何いってんのかわからん」ってことが あるかもしれません。 そんな時には、次のページがヒントになります。
Go言語での参加
Go言語をばりばり使っているエキスパートの人ならば関係の無い話になりますが、 僕のように、 「Go言語の勉強はじめたから、実践がてらAtCoderでコード書こう!」 とか思う人が結構いるのかなぁ?と思ったりしてます。 なんせ、Go言語ってやっぱり「なんかカッコイイ」でしょ?!
さて、AtCoderでは、問題を解くとき標準入力からデータを取り込みます。 なので、初めに標準入力の処理をマスターしなければなりません。 教科書的な読み込み方法は以下のものです。
package main
import "fmt"
func main() {
var s string
fmt.Scan(&s)
fmt.Println(s)
}
しかし、先人達の提出コードを見ると、 あまりこの書き方はされておらず、 なにやら独自のルーチンを定義して それを使っているはずです。
実は、この教科書的入力の処理方法は、 大量の入力を受ける時に時間が掛かる遅い処理なのです。 なので、AtCoderではこの処理を使わず、 大量の入力でも早く処理出来る方法をあらかじめ準備しておく必要がります。
このあたりをGo言語の知識として勉強して把握しておきたい場合、 次のサイトが凄く頼りになります。
で、とりあえず話さえ読んだらコンテストのためのコードについては、 難しい話はおいておいて、自分で入力用のルーチンを定義して、 テンプレートとして準備しておくようにしましょう。
おしゃれなAtCoder用テンプレート
めんどくさがり屋さん用にGo言語でのAtCoder用のテンプレートを以下に紹介します。
このテンプレートは、bufioを使った入出力をするための関数を定義した テンプレートです。 問題を解き初める時に、このファイルをコピーして利用すればOKです。 main関数の外側は気にせずに、 main関数の中に回答コードを書けばOKです。
標準入力からの読み込みの基本はin()関数です。 1ワードをInt型のデータとして読み込みます。 入力の定番パターンとしてよくあるn個のなんたらのために、 整数nを受け取りますが、次のように書くだけでOKです。
n := in()
また、良くあるパターンとして整数NとKが初めに渡されたりします。 この時は、in()関数を使って次の用に書きます。
n := in()
k := in()
しかし、見易くするために次の関数も用意しています。
n,k := in2()
次に文字列を受け取るなら、ins()関数を使います。
s := ins()
更に浮動小数点数を受け取るなら、infl()関数を使います。
fl := infl()
出力については改行付きの場合、out()関数を使います。 fmt.Println()と同等です。
out("Hello World!")
フォーマット式の出力は、outf()関数を使います。 fmt.Printf()と同等です。
n := in()
outf("n:%v\n",n)
これらの入出力関数で用いているスキャナ構造体は、 グローバルで宣言して作る建て付けになっているので、 main()関数の外で定義する自作の関数の中でも同じように使えます。
読み込みは文字列として受け取ってから、 各型に変換するので、その変換関数も作っています。 Go言語の場合、基礎関数にある変換関数は、 失敗してるかどうかのフラグも一緒に返すので、 AtCoder用には、単純に変換したものだけ返してくれる 関数として自作しておいたほうが扱いやすく 入出力時だけでなく、必要な時に気軽に使えます。
入出力に関しては、これらを組合せるだけで、だいたい間に合うと思います。
よくあるパターン
僕が良く使っている 入力関数を使ったスライスへの受け取りの定番を例示しておきます。
数列等の格納には、スライスを使います。 AtCoderの場合、入力から受け取る場合は、 数列の数がNとして先にわかりますが、 多分ほんとんどの人が、配列ではなくてスライスを使います。
n := in()
a := make([]int, n)
for i := 0; i < n; i++{
a[i] = in()
}
2次元配列への数値の読み込みパターンは次みたいな感じ。
n,m := in2()
a := make([][]int, n)
for i := 0; i < n; i++{
//ここでスライスを作成して入れる
a[i] = make([]int, m)
for j := 0; j < m; j++{
a[i][j] = in()
}
}
与えられた文字列の種類を数えたりする時に、 連想記憶配列が重宝します。
n := in()
//mapの初期化の仕方の定番
count := map[string]int{}
for i := 0; i < n; i++{
cout[ins()]++
}
準備しておくべき関数
C++の場合、 プログラムコンテストで良く使われるような処理の 定番関数が用意されていたりしますが、 Go言語の場合、用意されていないか、 使っている人が少いので用意されているのかどうかが別らなかったりします。 そこで、 簡単で良く使う処理は自作のルーチンをテンプレートに保存しておくと便利です。 例えば、最大値、最小値を返してくれる関数だったり、 絶対値を返してくれる関数は準備しておくと重宝します。
AtCoderでは、先人の提出したコードが見れるので遠慮なく覗いて 勉強させてもらいましょう。 みんな、それぞれ便利ルーチンを持っています。 問題の解き方だけでなく、 その辺りもよさそうなものは真似して、 いいとこどりしましょう!
お得情報
自分なりにAtCoder関連で役に立ったり、 面白かったりするものを紹介しときます。
本家AtCoderの中の「便利リンク集」
結局はここが一番便利だし、役に立つ!!
環境整備のために
AtCoderの問題で書かれている、 サンプルの入力とその正解出力は、 atcoder-cliというものを使うと、データとしてローカルに保存できます。 また、自分の書いたコードをAtCoderに送信してコードの提出もしてくれます。 そして、ダウンロードした、サンプルケースとその正解データに基づいて、 自分のコードをチェックしてくれるのがonline-judge-toolsツールです。
LinuxやMacで日常的にシェルを使っているなら、 これらを導入すると色々と楽ちんになるので超おすすめです。
これらの導入を丁寧に解説してくれているページが以下にあります。
うちのパソコンでAtCoder Problemsを解いている様子。
あの人だれ?
AtCoder界隈でうろうろするようになると、 良く見掛けるようになる人達があらわれますが、 初めは「あの人なんの人なの?」って思うことがあります。 そんな中で、僕の好きなAtCoder有名(?)人を紹介します。
まずは岩井星人さん。 僕はずっと「茶コーダーの人」として認識しています。 ABCのコンテストに参加している様子をYouTubeで配信しています。 実際のコンテストの最中に彼が「何いってるかわからん!」とかぶつぶつ言ってるのを見ると、 「そうそう!あの問題ほんと何いってるかわからんかったよねっ」と 灰色、茶色ランク同士なら解り合える親近感がもてて楽しいです。
次はSnukeさん。 ABCが終った晩にYouTubeでライブ解説してくれているあのお兄さんです。 先の岩井さんと対象的にどんな問題も優しく解説してくれてクールにコーディングしてくれます。 クールな解説の合間合間に、なんかおちゃめな事をぼそっと言って笑かしてくれることも多々あります。 Twitterのプロフィールには「アイコンは時計になっています。」とか、もうやってることが人ではありません。
次はE8さん。 多分、彼は今、全人類を競プロに参加させる的野望を抱いていて、 競プログラミング普及のため、数学やプログラムに疎い人でもアルゴリズムが理解できるように説明した 本を執筆しています。 当然僕も「鉄則本」だけでなく「アルゴリズムX数学」の両方もってます。
E8さんのテレ東Bizってのに出てる動画が好きです。
最後は、chokudaiさん。
実は昔この人の書いた本を読んだのがきっかけでTopCoderってのにちょっとだけ参加したことがあります。 ただその時、問題文の英語を早くよめるようになりたいと思って英語を勉強しだしたら、 そっちの方がおもしろくて競プロにははまらなかったという経緯があります。 さらに実は、chokudaiさんが、 その本を書いた人ということをついこの間まで知りませんでした。 ごめんなさい。 でもおかげで、今は、パソコンやプログラム関係の英語のドキュメントが まぁまぁ普通に読める様になって良かったと思っています。 ありがとう、chokudaiさん!!
No comments: