2009-07-09

アマゾンは、配送業者を複数から指定できるようにしてくれ! できれば避けたい飛脚もいるので……。

オンライン採用試験で遊ぶ

Tachyon Technologies という会社のオンライン採用テスト。別のことを調べていて偶然見つけた。採用希望者はこの同社求人ページから自分のプロフィールをフォームに書いて送信できるんだけど、それには掲載されているプログラミングに関する 3 つの問題の答えとなるコードも添えなくてはならない。最低限の人材の選別はオンラインで済ませてしまおう、と。

入社する気はなくても、プログラミングのパズルとしてどの問題もおもしろい。頭の体操が好きな人はぜひ挑戦してみよう。答えは Python, C++, Scheme のどれかで書けばよい。Python でやるです。

1 問目は、座標上の 2 点、(x1, y1), (x2, y2) を結ぶ直線を引いたとき、その直線が通るグリッドの数を返すようなプログラムを書け、というもの。正方形の中を通らず、頂点や辺に接するだけのものは数えない。

  • x1, y1, x2, y2 はすべて整数。
  • 0 <= x1, y1, x2, y2 <= 10000
  • x1, y1, x2, y2 の4つのコマンドライン引数を受け取るプログラムを書け。
  • プログラムは答えを 1 行、整数で出力する。

あとはページに挙げられている例を見れば、問われていることについてはわかると思う。さて、この例での出力結果は、自分の関数のテストとして使える。

# count_intersections.py

def count_intersections(x1, y1, x2, y2):
    # problem 1
    # http://tachyon.in/jobs/count-intersections/index.html
    """
    >>> count_intersections(1, 1, 6, 6)
    5
    >>> count_intersections(1, 1, 7, 6)
    10
    >>> count_intersections(1, 1, 7, 5)
    8
    >>> count_intersections(5, 6, 500, 6)
    0
    >>> count_intersections(1, 200, 180, 2)
    376
    >>> count_intersections(1, 10000, 9999, 173)
    19824
    """
    
    (... 処理 ...)
    
    return count_squares


if __name__ == '__main__':
    import doctest
    doctest.testmod()

こんなふうにしておけば、スクリプトを実行するだけで doctest モジュールによるテストが実行される。答えが合ってればなにも出力されない。間違ってると、

C:¥...>python count_intersections.py
**********************************************************************
File "C:¥...¥count_intersections.py", line 7, in __main__.count_intersections
Failed example:
    count_intersections(1, 1, 6, 6)
Expected:
    5
Got:
    6

こんなふうなエラーがずらずらと出てくる。上の例は 5 を期待してたのに 6 が返ってきたということ。

まあ正確にはコマンドラインで引数を受け取るプログラムを書け、なんだけど、そのへんは関数がちゃんとできれば難しいとこじゃない。

ウェブに答案を書いてしまうと、なんでもググって解決するような人を手助けすることになってしまう。Tachyon Technologies の人に迷惑かかるからそれはやめよう。そもそも自分の答えが合ってるとは限らないし。できた人はメールで答案交換しましょ。