名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

No.593 4進FizzBuzz - yukicoder

No.593 4進FizzBuzz - yukicoder https://yukicoder.me/problems/no/593

4進数の数値を10進数で考えたときにFizzBuzzの出力条件をみたすかどうかを判定する問題。 考え方は色々あるとは思いますが、

  • すべての桁を足して出た数値が3で割れるのであれば、3の倍数(っぽかった、これは実験して試したので、正式ではない)
  • すべての桁を計算した下一桁の結果が0または5であれば、5の倍数(実際、5で剰余を取っていく)

と考えられるので、そのとおりに実装したら出来た。(想定解?では上の桁から考えれば良いと書いてあったような気がしますが、私は下の桁から考えた)

ちなみに4進数を10進数に変換して計算して… とやろうとすると、桁数が大きすぎるため当然間に合いません。

ただ、剰余を取るのはいいのですが、4進数を求めようとすると、40a+41b+42c+43d... のようになり、下一桁を考えるのも少し工夫ですね。(その辺がループの中の条件式)

言語:Python3

def solve():
    n = input()

    i3, i5, t = 0, 0, 0
    for i, v in enumerate(n[::-1]):
        tv = int(v)
        i3 += tv
        if i == 0:
            t = tv * 1
        else: 
            t = tv * [4, 6][(i + 1) % 2]
        t %= 10
        i5 += t
        i3, i5 = i3 % 3, i5 % 5
    print(((i3 == 0 and "Fizz" or "") + (i5 == 0 and "Buzz" or "")) or n)

if __name__=="__main__":
    solve()

想定解をみた感じだと、もう少し綺麗にかけそうな気がしますね…。。。