逆FizzBuzz問題を解いてみた

FizzBuzz問題を解いてみました。

ただし、答えを知らない状態で解きたかったので、殆ど調べずに書いています。

もしかすると間違ってるかも……?

github.com

FizzBuzz問題とは

逆FizzBuzz問題 (Inverse FizzBuzz) - 猫とC#について書くmatarilloの雑記

上記ページから引用させていただくと、「FizzBuzz問題。あるリストが与えられたときに、FizzBuzzを実行するとそのリストを出力するような最短の連続数列を求めよ。」という問題です。

自分なりに解釈したのが以下。
数えた数字が、3の倍数かつ5の倍数(つまり15の倍数)ならFizzBuzz、5の倍数ならBuzz、3の倍数ならFizzを出力する関数がある。
Fizz, Buzz, FizzBuzzから成る列があった時、この列を出力しうる関数への入力を算出するのが逆FizzBuzz問題
ただし算出する数列は、数列の長さと先頭の数が最小のものとする。

 解き方

自分は以下の方法で解きました。

  1. FizzBuzzの列は周期を持っており、関数への入力の先頭の数字は3から15になる
  2. 最初のFizzBuzzを、FizzBuzzが無ければBuzzとFizzの関係を手掛かりに先頭の数字を確定
  3. 先頭とした数からFizzBuzzの列を生成していき、最後尾の数字を特定

3番は少し非効率なやり方ですが、作成したプログラムでは、この時与えられたFizzBuzzの列とチェックを行い、仮に違いがあった場合は入力されている数列がおかしいということでエラーを出力しています。

最後に

解くためのプログラム作成に3時間程掛かってしまいました。

最近C++ばっか書いてたとは言え、Javaの基本的なプログラムの書き方やInteliJ IDEAの使い方すら忘れていて……。

元ネタではGoogleの面接でこの問題を解かされたそうですが、自分ならまず間違いなく落とされてそうな感じですね……。