2008-10-26

DRYFizzBuzz

http://anond.hatelabo.jp/20081026002746

ステートマシン大好きっ子としては書かずにいられない

もう少しがんばればforも無くせるな

fsmの中身ってDRYなの?的な話もあるだろうが,こんなもの他のプログラム自動生成すればいいんだよ!(開き直り)

#include <stdio.h>

static int process(unsigned char *str, int c) {
    if (str != NULL)
        puts(str);
    else
        printf("%d\n", c);
    return ++c % (3 * 5);
}

static int iter(int c) {
    return process(NULL, c);
}

static int fizz(int c) {
    return process("Fizz", c);
}

static int buzz(int c) {
    return process("Buzz", c);
}

static int fizzbuzz(int c) {
    return process("FizzBuzz", c);
}

static int (*fsm[])(int) = {
    fizzbuzz, iter, iter, fizz, iter,
    buzz, fizz, iter, iter, fizz,
    buzz, iter, fizz, iter, iter
};

int main(void) {
    int i, state;

    for (i = state = 1; i <= 100; i++) {
        state = (*fsm[state])(i);
    }

    return 0;
}
  • http://anond.hatelabo.jp/20081025225144

    フラグを導入するっていうのは一つの手だけど 今度はプログラム中でフラグを管理する必要が出てくるじゃない。 プログラムの中で管理する「状態」は極力減らせっていう鉄則 (何に書...

    • http://anond.hatelabo.jp/20081025230447

      じゃぁ再帰で。 int fizz_buzz(int i, int j) { if(i % 3 == 0 &amp;amp;&amp;amp; j % 3 != 0) { printf(&quot;Fizz&quot;); return 1+ fizz_buzz(i / 3, j * 3); } if(i % 5 == 0 &amp;amp;&amp;amp; j % 5 != 0) { printf(&quot;Buzz&quot;); r...

      • http://anond.hatelabo.jp/20081025231830

        さっきのはあまりに汚かったのでちゃんと書いたよ!! static int do_fizz_buzz(int num, int rem, const char* str, int print) { if (num % rem == 0) { return do_fizz_buzz(num / rem, rem, str, 1); } if (print) printf(&quot;%...

        • http://anond.hatelabo.jp/20081025233552

          printf("%s", str); printf(str);又はputs(str); "%s"をパースする時間がもったいない とかどうでしょうか?

          • http://anond.hatelabo.jp/20081025233759

            Thanks. 確かにそうなんだけど、putsだと勝手に改行が出力されてしまうので一ヶ所しか使えなかった。DRY、forなし、ifなし(:?使ってるのでインチキだけど)、main以外に関数なし風味。これで...

            • DRYなFizzBuzz

              http://anond.hatelabo.jp/20081026002746 ステートマシン大好きっ子としては書かずにいられない もう少しがんばればforも無くせるな fsmの中身ってDRYなの?的な話もあるだろうが,こんなもの他の...

              • http://anond.hatelabo.jp/20081026132547

                FizzBuzz続き Cにもlambdaがあればいいのに #include &lt;stdio.h&gt;#include &lt;unistd.h&gt;#define FALSE 0#define TRUE !FALSEtypedef struct state_t { int state; int num; int max; int outputted;} state_t;typedef struct fsm_t { ...

                • http://anond.hatelabo.jp/20081028123934

                  なんでここまで簡単な要求を、ここまで複雑に書く必要があるのか、サッパリ理解できません。 それがプログラマというもの? だったら僕はプログラマになんかならなくてもいいや。

                • http://anond.hatelabo.jp/20081028123934

                  じゃ、少しだけ本気出してみたよ。要求仕様にかなうといいんだけど。 #include &lt;stdio.h&gt;int main(void) { puts(&quot;1&quot;); puts(&quot;2&quot;); puts(&quot;Fizz&quot;); puts(&quot;4&quot;); puts(&quot;...

            • http://anond.hatelabo.jp/20081026002746

              for を再帰で代替するなんて、どういうメリットがあるの?

              • http://anond.hatelabo.jp/20081026004041

                for を再帰で代替するなんて、どういうメリットがあるの? 逆だよ。ループ構文が再帰の一種なの。 だから代替するってのはちょっと違う。

                • http://anond.hatelabo.jp/20081026110712

                  ループが再帰処理の一種・・・? 再帰処理って処理を停止して新しい処理を行い、終了後に停止していた処理に戻ることじゃない? 処理A -&gt; 処理B -&gt; 処理A が再帰処理の名前の由来で...

                  • http://anond.hatelabo.jp/20081027001018

                    元増田じゃないけど、LISPとかの話じゃないかな。 ループは再帰で実現できるけど、再帰はループで実現できない。だから論理的には、再帰の方がより一般的。(再帰さえあればOK) ただ...

                  • http://anond.hatelabo.jp/20081027001018

                    「俺にとってはループの方が判りやすい」という主張は否定しないが。 再帰処理って処理を停止して新しい処理を行い、終了後に停止していた処理に戻ることじゃない? 処理A -&gt; 処...

                    • http://anond.hatelabo.jp/20081027222327

                      「末尾再起のある処理系なら」と付け加える必要があるのでは?

                    • http://anond.hatelabo.jp/20081027222327

                      よくわかってないならマジレスしなくていいよ。ネタじゃないし。 それは「関数呼び出し」じゃないかな? 言語によるのかも知れないが、私が触ってきた言語では全部自分自身を関数...

                      • http://anond.hatelabo.jp/20081028222130

                        元増田と違う人かもしれないが、 言語によるのかも知れないが、私が触ってきた言語では全部自分自身を関数呼び出しすることを再帰と言っていた。 これには同意します。しかしな...

                      • http://anond.hatelabo.jp/20081031010058

                        元エントリについている『大はずれだろ。どこが「名前の由来」やねん。』云々は別増田です 口調が違うのでわかります。 ちなみにそのエントリについてるエントリも私とは別増田で...

          • http://anond.hatelabo.jp/20081025233759

            後者がいいんじゃないかな。前者だと一部コンパイラだとセキュリティ警告が出ると突っ込まれるかもしれない。 この流れだとw

記事への反応(ブックマークコメント)

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん