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()
想定解をみた感じだと、もう少し綺麗にかけそうな気がしますね…。。。