読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

No.164 ちっちゃくないよ!!

回答

#59800 No.164 ちっちゃくないよ!! - yukicoder


元ネタはWORKING!!種島ぽぷらちゃんのセリフですかね(たまには元ネタの推測をする)


各数について最小となるような進数を考え,最小となる進数での表記→10進数での表記,という形に変えて,最小値を更新し続けて答えを求める.


最小となるような進数の求め方だが,たとえば,2進数ならば0,1が出現するので,1が出た時に2を記録するようにする….つまり出てくる文字の中で,最大+1になるときが,最小となる真数になる.
a..zも出てくるので,数字でなければ,アスキーコードを使い,計算する.(対象となる文字のアスキーコード - "A"のアスキーコード + 11 で合うはず… alphabetのアスキーコードが連番になっていることが前提ではあるが)

n進数から10進数への変換は,python3の場合,int(num, n) で実現可能なので楽ですね….

res = -1
for _ in range(int(input())):
    inp = input()
    while inp[0] == "0" and len(inp) > 1:
        inp = inp[1:]
    decimal = 2
    for c in inp:
        tdec = 0
        if c.isdigit():
            tdec = int(c) + 1
        else:
            tdec = ord(c) - ord('A') + 11
        decimal = max(tdec, decimal)
    res = min(res, int(inp, decimal)) if res != -1 else int(inp, decimal)
print(res)