2009年10月20日火曜日

FizzBuzz 2

このエントリーをはてなブックマークに追加
FizzBuzz からの続き

そして

ASP.NET MVC 病患者



Matrix 病併発





終わるまでが、無駄に長い。

おしまい

当たり前と言えば、当たり前だけど、件数が多くなると、System.Console.WriteLine のコストがそれなりになるので
using System;
using System.Collections.Generic;
using System.Linq;

namespace FizzBuzz
{
    static class ExtMethods
    {
        public static string ToFizzBuzz(this int i)
        {
            return (i % 3 == 0) ? ((i % 5 == 0) ? "FizzBuzz" : "Fizz") : (i % 5 == 0) ? "Buzz" : i.ToString();
        }

        public static void ToConsole(this string s)
        {
            Console.WriteLine(s);
        }
    }

    class FizzBuzz4
    {
        static string GetFizzBuzz(int start, int end)
        {
            return GetFizzBuzz("\n", start, end);
        }

        static string GetFizzBuzz(string separator, int start, int end)
        {
            return String.Join(separator, CreateFizzBuzz(start, end).ToArray());
        }

        static IEnumerable<string> CreateFizzBuzz(int start, int end)
        {
            int count = end - start + 1;
            return from i in Enumerable.Range(start, count)
                    let s = i.ToFizzBuzz()
                    select s;
        }

        public static void Main(string[] args)
        {
            //GetFizzBuzz(1, 100).ToConsole();
            GetFizzBuzz(1, 1000000).ToConsole();
        }
    }
}
これが、オレの環境(Mono on Ubuntu with P4 + 2GB RAM)で、だいたい 4 3.5 秒くらい。
拡張メソッド病患者バージョンだと、30 秒くらいかかることもあったので、それなりに短縮。

今時の CPU を入手したら、並列化(PLinq?)を試してみるのも一興か。

ということで、おしまい。

1 件のコメント:

sta さんのコメント...

以下の修正を行いました。

11行目
Before:
return (i % 15 == 0) ? "FizzBuzz" : (i % 5 == 0) ? "Buzz" : (i % 3 == 0) ? "Fizz" : i.ToString();

After:
return (i % 3 == 0) ? ((i % 5 == 0) ? "FizzBuzz" : "Fizz") : (i % 5 == 0) ? "Buzz" : i.ToString();

コメントを投稿