雑記帳

メモとやることとやったことと

Strange Counter

次のような不思議なカウンターの要素に高速にアクセスする方法

cntr  = [1, 2, 3]
value = [3, 2, 1]

cntr  = [4, 5, 6, 7, 8, 9]
value = [6, 5, 4, 3, 2, 1]

cntr  = [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
value = [12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1]

HackerRankの掲示板から。 各回のvalueの初期値を、求めるカウンタtから引いていけば、素早く目的の値に近づけるようだ。

t = 10のとき
1回目 10 - 3 = 7 -> まだ大きい
2回目 7 - 6 = 1 -> まだ大きい
3回目 12 > 1 なのでこのカウンタの中にある
配列の1番目の要素(Pythonの0番目)が求めるカウンタの値

コード

t = 10
m = 3

def StrangeCounter(t, m):
    while t > m:
        t -= m
        m *= 2
    return m-t+1

print StrangeCounter(t, m)
  >> 12