miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

Google Code Jam 2011〜2013 の話

今年も(私の中では)終わってしまったわけですが。ここ数年ぶんの出来事を、

  • その時々でどんな言語に興味を持っていたのか
  • 各言語に対してどんな感想を持ったのか

を中心に、まとめてさらっと書いておきます。

Google Code Jam 2011

結果

ということで、Round1 を通過できずに終了。

方針
  • 何かのめりこめる言語を探したい
    • 「どんな処理でも Perl で書いてやる!」と考えてた頃のような情熱がほしい
    • 条件はこんな感じ
      • Ruby くらい簡単に書けて、速く動作する言語(Windows だと妙に遅いとか不可)
      • メモ化やら末尾最適化やらが簡単にできる言語
      • 実用性が高いもの(DLL が作成できるとか、仕事でつかえそうだとか、配布が容易だとか)

ちなみに前年の反省を活かして、触りたい言語についてはあらかじめ入出力くらいは書けるようにしておいた。

使った言語
  • Go
    • 当時流行ってた(?)ので。
    • もっと簡単に解けるのに、無駄にゴルーチンやらチャンネルを使って解いて遊んでた。
    • 悪くはないけどすごくハマったりもしなかった
  • Clay
    • 手軽に DLL が作れるということで。
    • 最近の言語っぽく書きやすく、コンパイルはちょっと重いけど実行は速い。
    • わりと気に入ってたんだけど、その後使ってないのは、文字コードまわりのサポートが少ないから・・・だったかな。
  • Perl6
    • たまには触っておきたかったので
    • やっぱり動作遅い・・・
  • Factor
  • F#
    • 「他に普段触らない言語なかったっけ?」という感じで適当に
  • D
    • Round 1A を Groovy で解こうと思ったら、家の PC でうまく動かなかったので、適当に入っていたやつで
  • Groovy
    • この年の本命。
    • 「配列のメソッドが最初から Ruby + ActiveSupport くらい充実してるし、it とか使えるし、Ruby よりいいかも!」「Groovy++ を使えば速くなるし末尾最適化もできるっぽいし、Groovy かわいいよ Groovy」と急に気に入ったので。
    • ところが Groovy++ を使うと型を書かないといけない箇所が増えるしコンパイル通らなくて苦労するし、かわいい部分がどっかに行ってしまうことに気づいて、その後は Jenkins 関係でしか使ってない

Google Code Jam Japan 2011

結果

予選と決勝しかないけど、決勝を一問くらい解いたくらいでイマイチ。

方針
  • 時間的にあんまり余裕がなかったので使い慣れてる Ruby
  • 他の言語を触るにしても、Ruby で解いた後におまけ的に触る感じ
使った言語
  • Ruby
    • いつの間にか Enumerable のメソッドが増えてて、Groovy と比べても見劣りしない感じに
    • Windows での動作が遅いので、損した気分になる・・・
  • CoffeeScript
    • コーヒーの問題だから CoffeeScript 使っておくかー、みたいな
    • submit したら答えが合わず(JavaScript の sort() が文字列でソートされてたせい)、Ruby のほうを submit したのでソースコードは残ってなかったり
  • D
    • ビット配列が使える気がして触ったけど、あんまり意味がなかった気がする。

Google Code Jam 2012

方針
使った言語
  • Prolog
    • パラダイムが違う言語代表(論理型言語)。普段とは違う考え方が必要で新鮮だった。
    • 最初は SWI-Prolog を使ってたけど、入力が面倒なので GNU Prolog に乗り換えたりとか、これだけで 22 時間使ってしまった・・・
  • PowerShell
  • PHPPerlRuby
    • 時間がなくなってきたので適当に使っただけ
  • Julia
    • この年の本命。
    • なぜ僕らはJuliaを作ったか - 丸井綜研 を読んで期待が高まった+Windows 用のバイナリも正式ではないものの上がっていたので
    • マクロが強力な言語を触るのが初めてだったので、いろいろ作って遊んでた
    • 若い言語だから、言語が成長していく過程を見られたり、要望を出したりバグ報告したりで楽しかった
    • 「もっと深く関わりたいけど、関数型の言語やら、よく比較されてる R や Mathematica の知識を身に着けからにしよう」とか思っているうちに放置気味に。

Google Code Jam 2013

結果

今年も Round 1 で終了。

方針
  • 1 つくらいはパラダイムが違う言語を触りたい、くらい?
使った言語
  • GolfScript
    • またスタック指向言語を触っておこうか、って感じで。
    • ネタっぽい言語だけど、APL を ASCII にした感じなので、うまくハマるとかなり簡潔に書ける気がする
    • とはいえインタラクティブシェルがないので、スタック指向言語の利点が活きてないような
      • golfscript.rb の簡潔さも芸のうちだから仕方ないのかな
  • Nemerle
    • C# で書いてた処理を簡潔に書きなおせそうで、しばらくマニュアル読みこんでたので記念に
    • マクロが強力なのがいい。printf() のフォーマットと引数が合わないと IDE でエラー教えてくれたりして新鮮。
      • でも IDE の動作はまだ不安定で、たまにエラーが出なくなるので再起動してた・・・
  • Haskell
  • Groovy
    • Ruby より書きやすいかなーと思ったんだけど、今触ってみると「あれ?この機能ないの?」みたいなのが結構あった
      • shift/unshift、all、zip、リスト内包表記とか
    • Ruby のほうが Perl っぽい部分が残ってて、自分のスタイルには向いてる気がする
  • PHP
    • 多次元(連想)配列を作るのが楽かなってことで使ってみたけど、Perl と違って ++ で新しい要素を作ってくれないから、あんまりきれいにならなかった
    • あと多次元配列を扱うときは変数名の先頭に $ があるとうるさく見えるので、PerlPHP は避けたほうがいいのかも、と思ったり
  • Perl
    • Qualification Round A. Tic-Tac-Toe-Tomek で使ったけど、これだけは Perl らしく(?)簡潔に書けた気がするので gist で晒しておこう
    • 普段はまずやらないけど、$_ を多用すると見た目がすっきりするなー、とか思った
  • Ruby
    • 時間がなかったので適当に
  • Scala
    • 今年の本命。
    • 「仕事で Java を使うから何かしら勉強になるかなー」って思って触りはじめたけど、Scalaスケーラブルプログラミング第2版 を読み終えた頃に、ほとんど Java の勉強ならないことに気づいた
      • Round 1A の A を力技で解くにはどうすればいいか調べてて、BigDecimal やら MathContext やらの知識が身についた程度?
    • 関数型とオブジェクト指向がうまいこと合わさってるなーって印象。
      • 関数型の部分は Haskell っぽい部分が多いので、Haskell 触ってるとすんなり入れるかも。
    • いざってときについ手続型っぽい処理を書いちゃうので、関数型の特訓には向かないかも。
      • 関数型っぽく書くなら Haskell のほうが簡潔に書けちゃうし・・・。
      • -

という感じでした。今後の方針としては

  • 年に一回だけだといつまでたっても成長しないので、TopCoder やら AtCoder に参加したい(毎年言ってる気がする・・・)
  • Haskell で解いたりして、もっと関数型っぽい考え方に詳しくなっておきたい

ってところですかね。