勘と経験と読経

略すとKKD。ソフトウェア開発やITプロジェクトマネジメントに関するあれこれ。

Google Colaboratory で AtCorder生活

以前にScratchでAtCorderする方法を記事に書いた。

その後AtCorderの過去問をScratchで解きまくってみたのだけれども、実行時間制限が厳しい問題をクリアできなくなってきた。Scratchでは例えばソート関数などが提供されていないのでアルゴリズムを手組みせざるをえないのだけれども、高速なアルゴリズムを組むのはしんどい。
というわけでPythonに浮気した。しかし、ローカル開発環境を構築するのは面倒だ。そこで、まるっと使いやすいサービスを探していたところ、Google Colaboratoryがよかったというのが本記事の内容。

Google Colaboratoryとは

このあたりからどうぞ。GoogleがホストしているJupyterですね。

類似のオンライン実行環境としては、国内では某転職斡旋業者のサービスもあるようだが、私はなんとなく避けている。なんとなく。

Google ColaboratoryでAtCorder

基本的にはGoogle Colab上でコーディングとテストを実施して、完成したらAtCorderのフォームから提出するという流れ。
特に工夫をしないでも

  1. Google Colab上で、テストデータをインプットとするコードを書く
  2. サンプルデータで正解になるか確認する
  3. 問題が無さそうであれば、AtCorderに提出する用のI/Oを追加する
  4. 提出する

という流れでAtCorderに参加できるが、最後のI/Oの追加あたりが面倒だ。

そこで、以下のようなテンプレートコードを考えた。これであればColab上で開発完了したら、そのままAtCorderへも提出できる。

def main():
  if 'get_ipython' not in globals():  
    # 以下のコードはAtCorder提出時のみに実行される。問題の種類に応じてinputメソッドを準備する
    N = int(input())
    # AtCorderでよくある入力形式
    # A, B, C = input().split()
    # b = [int(i) for i in input().split()]  横持ち
    # S = [input() for _ in range(N)]  縦持ち/行数N
    # t = [0] * N    ti xi yi 縦持ち/行数N
    # x = [0] * N
    # y = [0] * N
    # for i in range(N):
    #   t[i], x[i], y[i] = map(int, input().split())
  else:
 # 以下のコードはColab上でのみ実行される。テスト用の入力データを書いておく
    N = 1

  # 以下にコード本体を書く
  print(N)

main()

例えば、AtCorderサンプル問題「practice_1」の回答は以下になる。

def main():
  if 'get_ipython' not in globals():  
    #以下のコードはAtCorder提出時のみに実行される。問題の種類に応じてinputメソッドを準備する
    a = int(input())
    b,c = map(int,input().split())
    s = input()
  else:
    #以下のコードはColab上でのみ実行される。テスト用の入力データを書いておく
    a,b,c = 1,2,3
    s = "test"
 
  # 以下にコード本体を書く
  print("{} {}".format(a+b+c, s))
  
main()