Google Code Jam Practice 1

人類の使っている10進法は"0123456789"という10文字を使って数字を表現しているけど、宇宙人がたとえば"ABCDE"の5文字で表現していたり、"123456789*+-="という13文字を使って表現していたりするかもしれない。与えた宇宙人表記の数字を別の宇宙人表記の数字に変換しなさい、という問題。

で、コードはこんな感じ。練習問題だから簡単なのかな?ちょっと拍子抜けした。

def toDigit(nums, value):
    """ alian to digit
    >>> toDigit("ABC", "A")
    0
    >>> toDigit("ABC", "C")
    2
    >>> toDigit("ABC", "BA")
    3
    """
    N = len(nums)
    map = dict(zip(nums, range(N)))
    result = 0
    for c in value:
        result *= N
        result += map[c]
    return result

def fromDigit(nums, value):
    """ digit to alian
    >>> fromDigit("ABC", 0)
    'A'
    >>> fromDigit("ABC", 2)
    'C'
    >>> fromDigit("ABC", 3)
    'BA'
    """
    if value == 0:
        return nums[0]
    N = len(nums)
    result = ""
    while value > 0:
        result = nums[value % N] + result
        value /= N
    return result

fi = file("data")
fo = file("result", "w")
num_test = int(fi.readline())
for i in range(num_test):
    line = fi.readline()
    value, frm, to = line.split()
    result = fromDigit(to, toDigit(frm, value))
    fo.write("Case #%d: %s\n" % (i + 1, result))

fi.close()
fo.close()

よし、出力ファイルは/Users/nishio/resultに決め打って、ダイアログを開かない方針で。あと入力ファイル名もダウロード前にハードコーディングして置く方針で。これで「サブミットするファイル名に入力」「ダウンロード」「コンソールでEnter」「処理完了を見届ける」「submitボタン」という流れでまごまごせずに送信する!


ところで、ダウンロード完了からの時間で勝敗が決まるこのシステムだとさ、回線が細くてダウンロードに時間がかかっているように見せかけて実は自作プロキシ経由でダウンロードしていて届いたデータから先に計算しちゃう、って言う手が使えるよねぇ。やらないけど。

        • -

練習問題のDを見たら巡回セールスマン問題風の、巡回スーパーマーケット問題だった。しかも牛乳を買ったら痛むからすぐに家に帰れとか、店によって打っている値段が違うとか。ふむふむ。この手の問題だとC++使う必要がありそうだなぁ。


練習問題のCはビルから卵を落としてどの回以上だったら割れるかを判断できるかどうかという問題。卵の個数と、割っていい卵の個数は決まっている。