逆FizzBuzz問題をオブジェクト指向(C++)で解くコメントをどうぞTweetBlogの生存報告がてら。旬の過ぎた話題ですが、逆FizzBuzz問題をC++で、自分なりにがんばってオブジェクト指向っぽく解いてみます。逆FizzBuzz問題FizzBuzzゲームは英語圏での定番飲み会用ゲームで、日本で言うナベアツゲームみたいなものです。ルールは各人が1から順に数を言っていき、3の倍数のときには数字の代わりにFizz、5の倍数のときにはBuzz、3かつ5の倍数のときにはFizzBuzzを言うというものです。...プログラミング界隈では初歩的なコーディング問題として、相手が本当にプログラミングができるのかどうかを知る問題として使われるそうです。(現場で本当に使われているのかは知りません。)さて、逆FizzBuzz問題というのは、これに関連した問題の逆問題として定義されます。1からでなく適当な数字から始め、さらに数字を言わないFizzBuzz問題を考えます。これの逆問題を考えます。FizzやBuzzやFizzBuzzの羅列でできた文字列が与えられたとき、結果がそれに一致するような数列を求めたい、それを逆FizzBuzz問題と定義します。それだけだと答えが複数あるので、今回はその中で最小の数列の最も小さい数から始まるものを答えとしましょう。具体的な問題例とその答えは以下のようになります。猫とC#について書くmatarilloの雑記オブジェクト指向で逆FizzBuzz問題ここからプログラミングの話題。先に挙げたリンク先(とさらにその先の英語原文)では、オブジェクト指向プログラミングがプログラマーに滅びをもたらす思想であると認定され、代わりに関数型プログラミングが広く認められた近未来で逆FizzBuzz問題を解くお話になっています。オブジェクト指向が悪であるかどうかは議論を避けるとして、ここでは2016年になってもやっぱりオブジェクト指向は世の中を支配していた、そしてその世界で逆FizzBuzz問題もオブジェクト指向のノリで解く必要に迫られたらどうなるのかをやってみた、という内容になります。(そもそも私は関数型プログラミングをきちんと勉強していない人なので、善悪の議論ができません。)言語は例によってC++11です。だいたい次のように決めておきます。出力は逆FizzBuzz問題の解の数列の範囲。“[3,5]”入力が空文字のときは[0,0]を返す。解がないときは適当に文句を返す。先にソースコードを書いてしまいましょう。まとめ」についての話です。Flickrそこそこ反響があったのですが、「書いてある中身がよくわからない」という反応もいくらかあったので、一部抜粋してちょっとだけ補足してみたいと思います。書いた側の身になって考えてみたいと思います。何かコメントで見当はずれなところがありましたらご指摘よろしくお願いします。私もいわゆるクソコードを書いてしまうことがよくあるので。個人的にはこれが一番衝撃的だった。何かトラウマがあったんだと思う。2012掃除機で同じ所を何度もかけるようなノリですね。過去に何があったんでしょうか。一応、マルチスレッドの処理などを適当に書いてしまうと、代入した変数の値が適当なタイミングで勝手に書き変わってしまうことがあります。その場合でも変数にvolatile宣言をしておかないと最適化で取り除かれてしまいますが。2013絶対に実行されないコード。適当な変数が定数になったとき、機械的に置換していくとこういう記述が出てくるおそれがあります。takamoto「ガリレオ温度計」買ってきました。1件のフィードバックTweet先日、東急ハンズ渋谷店で気になっていたものをいくつか買ってきました。本当は低温度差スターリングエンジンを探しに行ったのですが、そちらは今は置いてありませんでした。今回の注目は左上の品。「ガリレオ温度計」です。浮きに温度が書いてあり、浮き沈みで温度を計るようになっています。実験用とかではなく、完全なインテリア用です。takamoto「クイックソートをHaskellで書くと5行、C++で書くと35行!」←いやそんなにかからないだろコメントをどうぞTweet(この記事はC++メインの内容です。)関数型言語のセンスも身につけておかないと、と思ってHaskellの簡単なお勉強をしようと思いました。圏論のような背景や文法から把握するのもひとつのルートですが、まずは適当な例を見てみようと思ったわけです。「関数型言語だとこんなことができる!」みたいな驚きがあったほうが楽しいですしね。FlickrまずはHaskellでのクイックソートの実装例を探してみました。クイックソートというのはアルゴリズムの勉強を1からすると必ずと言っていいほど登場するほどのものですし、比較もできて面白そうです。クイックソート」でGoogle検索にかけてみると、「C++だと35行のところがHaskellは5行で書ける」だの、「最も美しいコードのひとつ」だのとなかなか景気の良い記事が出てきます。ところがもう少し読んでみると、「Haskellの5行クイックソートはクイックソートではない」みたいな議論がされているページがいくつか出てきます。Togetterにいろいろな主張のまとめがありました。「In-placeソートでないからだめ」「というか遅い」「いやHaskellに効率を求めてはいけない」「5行の例はPivotingをしていないのでだめ」「Pivotingはクイックソートの本質ではない」「メモリを抽象化していて扱えていないのでとても遅い」「Haskellでメモリの議論をするべきでないしIn-placeソートでなくてもよい」「Haskellでクイックソートをしっかり書きたいなら手続き型風に書くのが良い」といった感じで、さっそく頭が痛くなってきました。まあ今回はHaskellについては一旦置いておいて、その途中で出てきた「C++のクイックソートは35行」の部分についての話です。C++で普通に書いてももっと短くなっていいはずです。結果から書きますと、普通に書いても9行くらいになりました。takamotoマンデルブロー集合へ飛び込む1件のフィードバックTweet先日のマンデルブロー集合の10の200乗倍で作成したプログラムがあるので、今回はマンデルブロー集合の様々な地点へ飛び込んだ動画を作ってみました。今回訪れる地点は計5箇所です。どの点も拡大していく最中に集合全体と同じ形が現れます。フラクタルらしくて面白いと思います。具体的には以下の点です。それぞれ個性的な場所だと思います。Wikimedia)この集合はフラクタルなので自己相似の図形ではあるのですが、ただ単純にどこでも同じ形を持っているわけではありません。拡大する場所を変えると景色が一変してしまいます。