2009年10月20日火曜日

FizzBuzz 2

FizzBuzz からの続き

そして

ASP.NET MVC 病患者



Matrix 病併発





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

おしまい

当たり前と言えば、当たり前だけど、件数が多くなると、System.Console.WriteLine のコストがそれなりになるので
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4.   
  5. namespace FizzBuzz  
  6. {  
  7.     static class ExtMethods  
  8.     {  
  9.         public static string ToFizzBuzz(this int i)  
  10.         {  
  11.             return (i % 3 == 0) ? ((i % 5 == 0) ? "FizzBuzz" : "Fizz") : (i % 5 == 0) ? "Buzz" : i.ToString();  
  12.         }  
  13.   
  14.         public static void ToConsole(this string s)  
  15.         {  
  16.             Console.WriteLine(s);  
  17.         }  
  18.     }  
  19.   
  20.     class FizzBuzz4  
  21.     {  
  22.         static string GetFizzBuzz(int start, int end)  
  23.         {  
  24.             return GetFizzBuzz("\n", start, end);  
  25.         }  
  26.   
  27.         static string GetFizzBuzz(string separator, int start, int end)  
  28.         {  
  29.             return String.Join(separator, CreateFizzBuzz(start, end).ToArray());  
  30.         }  
  31.   
  32.         static IEnumerable<string> CreateFizzBuzz(int start, int end)  
  33.         {  
  34.             int count = end - start + 1;  
  35.             return from i in Enumerable.Range(start, count)  
  36.                     let s = i.ToFizzBuzz()  
  37.                     select s;  
  38.         }  
  39.   
  40.         public static void Main(string[] args)  
  41.         {  
  42.             //GetFizzBuzz(1, 100).ToConsole();  
  43.             GetFizzBuzz(1, 1000000).ToConsole();  
  44.         }  
  45.     }  
  46. }  
これが、オレの環境(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();

コメントを投稿