大袈裟にFizzBuzzを実装した話

なんとなくしたくなったからしただけです
開発経験はろくにないのでいじめないでください
半分ネタ記事です

FizzBuzzが何かについては適当にググってください
一応先に言っておくと普通は下のコードで何も問題ないです(多分)

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        if (i%15 == 0) {
            cout << "FizzBuzz" << endl;
        } else if (i%3 == 0) {
            cout << "Fizz" << endl;
        } else if (i%5 == 0) {
            cout << "Buzz" << endl;
        } else {
            cout << i << endl;
        }
    }
}

成果物
github.com

入出力編

標準入出力なんて一般に使わないのでファイル入出力にする
標準入出力したいならechoとかcatとか適当に使えばいい
逆にリダイレクトで飛ばそうとすると環境によってBOMとか紛れ込むことあってめんどい

仕様編

FizzBuzzは3の倍数のときFizz、5の倍数のときBuzz、15の倍数のときFizzBuzzだけど拡張したいよね
nの倍数のときname(n)を出力するという条件がいくつかあって、出力の後ろにname(n)を連結していけばよさそう
また、デフォルトだと1~nについて出力するけど、st~enみたいに開始の位置もしていできたほうがいい
細かいinputの仕様はREADME見て
ファイルの数字をちょっと書き換えるだけで色々なFizzBuzzができてうれしい

アルゴリズム

FizzBuzzなんて基本的に計算量気にする必要もないんだけど、仕様にあるように条件がたくさんあると遅いかもしれない
愚直に範囲内のすべての数について全ての条件を試すより、各条件についてnの倍数だけ見てそこの出力の後ろにname(n)を加えていくようにしたほうが高速
実装は超楽
雑に並列化とかしようかとも思ったけどキリがなさそうなのでやめた

ソースコード
  • repとか使ってはいけない

競プロerがたまに使うtype量を減らすためのマクロとか
当然使わない

  • bits/stdc++.hとかインクルードしてはいけない

競プロerが好んで使う全てのライブラリをインクルードするもの
必要なものだけインクルードする

  • using namespace stdとかしてはいけない

一般によく使われる
名前の衝突とか起きるとしんどいので使わない

奇麗じゃないから使わない
名前衝突しやすくなるしあちこちからアクセスできるのは嬉しくない

  • 一文字変数とか使わない

読みにくくなるから使わない

  • インデントとかちゃんとする

当たり前だよなぁ

  • コメントを書く

関数が何をやってるのかとか書くといいと思う

  • エラー処理を書く

ファイルのopenとか失敗したらちゃんとエラー文吐いて異常終了する
また、不適切な入力とかもちゃんとはじくようにする。実行時エラーをなくす

  • 処理を分割する

処理ごとに関数を作ろうな

その他編

  • サンプルを追加する

サンプルがあると他の人が仕様を理解しやすい
動作チェックにも使える

makeってやるだけでビルドできるようにする
サンプルはmake testってだけで動くようにする
cleanも書いておく

ソースコード、入力、出力など役割に応じてディレクトリをわける
中身がないとaddできないので.gitkeepとか適宜置く

GitHubで管理をする
ちゃんとgit add -pでaddするものをチェックするし、commitメッセージはちゃんとする

  • READMEを書く

ちゃんと使い方とか何のプロジェクトなのかとか書く
イケてるREADMEがあると中身がhogeでもかっこいい

  • LICENCEを追加する

適当にMITライセンスとかにする
ライセンスないと他の人が使いにくい

  • .gitignoreを追加する

実行ファイルなどはcommitしない

  • 自動ビルド

Travis-CIでちゃんとビルドができることをpushのたびにチェックする
使ったことないのでよくわからんが.travis.ymlを適当にそれっぽくする
一応サンプル(普通のFizzBuzz)がちゃんと動くかもチェックする
READMEにbadgeも貼ってカッコよくする

おわりに

コードテストでFizzBuzzを書かせる企業をバカにする風潮が目立ったので実際にFizzBuzzを自分で頑張って書いたらどうなるのかやってみた
多分これでも十分じゃないし、ちゃんとした開発者からすると素人って感じだと思う
問題の出し方にもよるけど、普通にFizzBuzzでも開発能力とかのチェックにはなるんじゃないかと個人的には思う
意外と楽しい