C#とLINQでFizzBuzz
- 2009-02-28
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
// FizzBuzzの無限リスト
var FizzBuzz = Enumerable.Range(0, int.MaxValue).Select(i =>
(i % 15 == 0) ? "FizzBuzz" :
(i % 3 == 0) ? "Fizz" :
(i % 5 == 0) ? "Buzz" :
i.ToString());
// Skipが起点、Takeが表示数に対応する
FizzBuzz.Skip(1).Take(100).ForEach((s, i) => Console.WriteLine("{0,3}:{1}", i + 1, s));
}
}
public static class ExtensionMethods
{
// indexが取れるForEach
public static void ForEach<T>(this IEnumerable<T> source, Action<T, int> action)
{
int index = 0;
foreach (var item in source) { action(item, index++); }
}
}
何だかふと思って、今更ながらにanarchy golf - FizzBuzzをやってた。とりあえずC#でSize 123で同率一位達成なので満足です。以上。で終わるのもアレなので、記念にFizzBuzzをきちんと書くならどうなるかなあ、と考えてみた。
C#3.0だとLINQを使うのがきっとスマートです、よね。無限リストを作ってやるのが一番、かな。Skipがstart、Takeがcountに相当するってのが何だか面白い。しかし毎度ながらEnumerable.Range(0,int.MaxValue)という表記が冗長に過ぎてげんなり。あとIEnumerableにForEachが用意されてないのもなあ。ToList()は色々と違うと思うので、本当に何とかして欲しい。