名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

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()

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