summer_tree_home

Check iOでPython3をマスターするぜっ

The Good Radix (Incinerator) - 基数を探せ

新しいエリア Incinerator の最初の問題。Electronic Stationの後半は難しい問題が多かったので、こういうスコア10点の問題はホッとする。

どんな問題?

The Good Radix
http://www.checkio.org/mission/good-radix/

k進数で書かれた数字がある。この数字は(k-1)で割り切れることがわかっている。
このとき、最小のkを求めよ。
1 < k < 37 とする。

Radixとは基数のことらしい。

例題:

checkio("18") == 10
checkio("1010101011") == 2
checkio("222") == 3
checkio("A23B") == 14

どうやって解く?

kは2~36の範囲だから、順番にやってれば、すぐに答えがでそうだ。

n進数の文字列を整数に変換

n進数の文字列を数値化するには、int(s, n) とする。

>>> int('1010101011', 2)
683

>>> int('222', 3)
26

>>> int('A23B', 14)
27885

あとは、2から36まで順番に試せばいい。

def checkio1(number):
    for k in range(2, 37):
        n = int(number, k)
        if n % (k - 1) == 0:
            return k
    return 0

これで実行!

ValueError: invalid literal for int() with base 2: '18'

あ、変換できない時のことを考えてなかった。例外発生したらcontinueするように修正。

def checkio(number):
    for k in range(2, 37):
        try:
            n = int(number, k)
            if n % (k - 1) == 0:
                return k
        except ValueError:
            continue
    return 0

これでクリア!らくしょー。