I played around with – and tried to do the “classic” FizzBuzz programming test in an obnoxious way.
Here’s what I’ve got so far, but I think it’s possible to make it more convoluted than this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reactive.Linq; namespace FizzBuzz { public delegate void NumberEventHandler(object sender, long e); class Program { public static event NumberEventHandler AnyNum; static void Main(string[] args) { var numbergenerator = Observable.Interval(TimeSpan.FromMilliseconds(1)); var numbers = from n in numbergenerator where n > 0 && n <= 100 select n; var numberobs = Observable.FromEvent<NumberEventHandler, long>( ev => { NumberEventHandler neh = (sender, e) => { ev(e); }; return neh; }, ev => AnyNum += ev, ev => AnyNum -= ev); var watchforfizz = from n in numberobs where n % 3 == 0 select "Fizz"; var watchforbuzz = from n in numberobs where n % 5 == 0 select "Buzz"; var watchforothers = from n in numberobs select ((n % 3 != 0 && n % 5 != 0)?n.ToString():"") + "\n"; watchforfizz.Subscribe(x => { Console.Write(x); }); watchforbuzz.Subscribe(x => { Console.Write(x); }); watchforothers.Subscribe(x => { Console.Write(x); }); numbers.Subscribe(x => AnyNum(null, x)); Console.ReadKey(); } } } |
Key features are the number generator, and the three filter event handlers. I feel like there should a better way of handling the “regular” numbers, but close enough.