早く流れる川で

雑に書き留めた何か

C#でFizzBuzz

はじめに

C#FizzBuzzを書きます。
ちなみに開発環境は以下のとおりです。

目次

FizzBuzzとは?

こちらをどうぞ。 解答が書いてあるようなものじゃないですか!
とりあえず「100」までFizzBuzzをします。

FizzBuzz1個目

using System;

namespace FizzBuzz2019
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 1; i <= 100; i++)
            {
                if(i % 3 == 0 && i % 5 == 0)
                    Console.WriteLine("FizzBuzz");
                else if(i % 3 == 0)
                    Console.WriteLine("Fizz");
                else if(i % 5 == 0)
                    Console.WriteLine("Buzz");
                else
                    Console.WriteLine(i.ToString());
            }
        }
    }
}

FizzBuzz1個目の所感

for文の「1」や「100」、if文の「3」「5」がマジックナンバーに見えるなぁ。 判定する部分はメソッドにした方が良いかも。書いてある内容が重複しているし。 となるとConsole.WriteLine()も1個にした方が良さそうか。

FizzBuzz2個目

using System;
using System.Text;

namespace FizzBuzz2019
{
    class Program
    {
        //
        private static readonly int FIZZBUZZ_START_NUMBER   = 1;
        private static readonly int FIZZBUZZ_END_NUMBER     = 100;
        private static readonly int CALL_FIZZ_NUMBER        = 3;
        private static readonly int CALL_BUZZ_NUMBER        = 5;

        //
        static void Main(string[] args)
        {
            for (int i = FIZZBUZZ_START_NUMBER; i <= FIZZBUZZ_END_NUMBER; i++)
            {
                var message = new StringBuilder();

                if(IsFizz(i) && IsBuzz(i))
                    message.Append("FizzBuzz");
                else if(IsFizz(i))
                    message.Append("Fizz");
                else if(IsBuzz(i))
                    message.Append("Buzz");
                else
                    message.Append(i.ToString());

                Console.WriteLine(message.ToString());
            }
        }

        //
        private static bool IsFizz(int n)
        {
            return n % CALL_FIZZ_NUMBER == 0;
        }

        //
        private static bool IsBuzz(int n)
        {
            return n % CALL_BUZZ_NUMBER == 0;
        }
    }
}

FizzBuzz2個目の所感

for文に違和感を覚える。

FizzBuzz3個目

using System;
using System.Linq;

namespace FizzBuzz2019
{
    class Program
    {
        //
        private static readonly int FIZZBUZZ_START_NUMBER   = 1;
        private static readonly int FIZZBUZZ_END_NUMBER     = 100;
        private static readonly int CALL_FIZZ_NUMBER        = 3;
        private static readonly int CALL_BUZZ_NUMBER        = 5;

        //
        static void Main(string[] args)
        {
            var call_fizzbuzz = Enumerable.Range(FIZZBUZZ_START_NUMBER, FIZZBUZZ_END_NUMBER)
                                    .Select(i => IsFizz(i) && IsBuzz(i) 
                                                ? "FizzBuzz"    : IsFizz(i)
                                                ? "Fizz"        : IsBuzz(i)
                                                ? "Buzz"        : i.ToString());

            foreach (var item in call_fizzbuzz)
                Console.WriteLine(item);
        }

        //
        private static bool IsFizz(int n)
        {
            return n % CALL_FIZZ_NUMBER == 0;
        }

        //
        private static bool IsBuzz(int n)
        {
            return n % CALL_BUZZ_NUMBER == 0;
        }
    }
}

FizzBuzz3個目の所感

Rangeの書き方、分からなかったので参考1にしました。 三項演算子の部分が読みにくい気がする。
結局、繰り返し使ってるやん!

感想

まだ何か考える余地がありそう。 英語力ぅ・・・


  1. Pythonか何かでこういうのがあった記憶がありまして・・・