東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

FizzBuzz思考過程

こんなんでモチベーション上がんのかよ を発端にFizzBuzzぷち祭りの様相♪

なんかの参考になれば、と思考の過程をまとめておきます。

【問題】
1から100までの数を表示するプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。


問題を眺めて最初に浮かんだのは"多分岐":ああ、4通りに分かれんのねと。
多分岐がイメージできたら3秒後には脳内コーディング開始:

for ( i = 1 ~ 1000 ) {
  switch ( f(i) ) {
  case 3の倍数: "Fizz"
  case 5の倍数: "Buzz"
  case どっちも: "FizzBuzz"
  case それ以外: i
  }
}

んでもって各case条件に見合う f(i) を考えればいい。
→ 分岐条件を決定するファクタは 3で割れるか / 5で割れるか のふたつだけ
→ それぞれの true/false に応じて4つに分けりゃえぇ
→ 00, 01, 10, 11 → 0, 1, 2, 3 ... デキター♪
# こっからヒネクレ始めて
→ 0から始まる連番になってんね
→ 配列の要素にマップできるよねー...ヨッシャー♪

なんてな段取りだったんじゃないかな、改めて思うに。

不思議なくらい if ... else ... による多段の2分岐はアタマん中にありませなんだ。
ちらりと浮かんだんだけど"ダメ!そっち行っちゃダメ!"と引き戻す奴が現れまして。
プログラマの本能? 勘?
よくわかんないけど、この感覚って経験/場数によって磨かれるもんだと思う。

投稿日時 : 2007年11月8日 9:05

コメントを追加

# re: FizzBuzz思考過程 2007/11/08 9:31 裏口

失礼なこと書いて申し訳ないですが、個人的にはマズイと思います。

普通にメンテナンスが入る業務系のプログラムにはそういうトリッキーなロジック含めるべきじゃないという意味です。
# ソースコード自体がドキュメントなので効率よりも判り易さが重要かと。

宗匠の思考はエンジニアというよりはアーティストに近い気がwww

# re: FizzBuzz思考過程 2007/11/08 9:39 774RR

だから効率有線なら static table
puts(fizzbuzztable[i]); 一行っす。
メンテナンスも fizzbuzztable を直すだけ、っと。

# re: FizzBuzz思考過程 2007/11/08 9:50 επιστημη

うん、自分でも「これを業務ではやらんよな」と思ってますですよ。
問題見た途端に"ふたつのtrue/falseの組み合わせ"が
意識下にあったと思われます。問題からパッと見でわかるから。

オシゴトならクソおもしろくもなく

if ( ほげほげ ) { }
else if ( ぱよぱよ ) { }
else if ( ぺもぺも ) { }
else { }

からスタートだろうな、と。

# re: FizzBuzz思考過程 2007/11/08 9:54 774RR

誰も書いてないしおそらく知らない雰囲気なので
define(`fizzbuzzfunc',`ifelse(eval($1%15),0,`fizzbuzz',eval($1%5),0,`buzz',eval($1%3),0,`fizz',$1)')dnl
define(`fizzbuzzloop',`ifelse(eval($1),0,,`fizzbuzzloop(eval($1-1))` 'fizzbuzzfunc($1)')')dnl
fizzbuzzloop(100)
さてこれは何言語だろう

# re: FizzBuzz思考過程 2007/11/08 9:55 Mr.T

Mr.Tです、こんにちは。
>不思議なくらい if ... else ... による多段の2分岐はアタマん中にありませなんだ。

これって、初心者にとっては最初に習う判定処理であるんで、それを適用しがちになるんじゃないでしょうか。
で、経験をつむことで、あの手この手をつかってみようとするわけじゃないのかな、と。

この場合、人間の思考だと全ての条件を当てはめて考えて答えを出しちゃうんで、switchであえてbreakしない流れですよね。

# re: FizzBuzz思考過程 2007/11/08 9:56 επιστημη

はて...なんかミョーにLISPっぽいですが

# re: FizzBuzz思考過程 2007/11/08 9:58 επιστημη

> 初心者にとっては最初に習う判定処理であるんで、それを適用しがちになるんじゃないでしょうか。

あー、それはあるかもですね。
やってくうちに手駒が増えてく、と。

# re: FizzBuzz思考過程 2007/11/08 10:11 nagase

Program書いている最中に・・・。
エントリ消したほうがよいのかも。

# re: FizzBuzz思考過程 2007/11/08 10:15 nagase

エントリ削除しておきました♪

# re: FizzBuzz思考過程 2007/11/08 10:31 774RR

これは m4 っつーマクロプロセッサでおます。引用符が `' という。
define(`a',`b') と書くとその後は a が b に置換されます
ifelse(a,b,c,d) は lexical に a==b と判定されると c にそうでないとき d に置換されます
ifelse(a,b,c,d,e,f,g...) は else に相当する部分が再度同値判定となり
a==b なら c そうでないとき d==e なら f そうでないとき g 以下同文

さて思考過程というか実装過程というかを解説
一気に全部を実装するのは大変なので分割統治、と判断
ifelse で fizz/buzz/fizzbuzz/n をまず実装
この際に15の倍数を判定、というロジックが思いつくかどうかが肝
これが思いつけば ifelse のワンライナーで1つの値を置換が完了
m4 はループ文法が無いので、繰り返しは再帰で実装
逆順にならないよう注意、っと。以上で完了っすな。
マクロプロセッサは手駒が少ないのでいくつかパターンを覚えると流用が効く。
あと m4 は文法上、引用符にうるさいので
必要なところにきっちりつけ、つけてはならないところにはつけない
を注意しないと再帰で無限ループになるのですな。

# re: FizzBuzz思考過程 2007/11/08 18:41 アクア

> 不思議なくらい if ... else ... による多段の2分岐はアタマん中にありませなんだ。

不思議なくらいif…else~しか浮かびませんでした。w
# ええ、場数足りてないんで…(滝汗

ただし、普段はif…else~の多段の2分岐は好きじゃなくて使わないです。

> ちらりと浮かんだんだけど"ダメ!そっち行っちゃダメ!"と引き戻す奴が現れまして。
> プログラマの本能? 勘?
> よくわかんないけど、この感覚って経験/場数によって磨かれるもんだと思う。

そう思える経験が、羨ましいッス。

あと、if…else~にしてもswitch(VBならselect)でも分岐の順序を瞬時に最適な順序で組めるスキルも羨ましいです。


ところで是非、if文よりswitchの方が望ましいのかBlogで取り上げて頂きたいです。
ダメですか?

タイトル
名前
URL
コメント