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
これでクリア!らくしょー。