/* * The Computer Language Shootout * http://shootout.alioth.debian.org/ * * Contributed by: Micky Latowicki, ported from Tobias Polzin's Python program, * itself ported from Mike Pall's Lua program. * Date: May 8, 2007 */ #pragma indent using System using System.Collections.Generic using Nemerle.Imperative enum Color | None | Red | Blue | Yellow | Faded class Chameneos mutable N : int = 0 mutable first : Color = Color.None mutable second : Color = Color.None mutable meetings : int = 0 Creature(mutable me: Color) : IEnumerator[Color] mutable met = 0 mutable other = Color.None def meet() met += 1 when (me!=other) me = match (me, other) | (Blue, Red) => Color.Yellow | (Blue, _) => Color.Red | (Red, Blue) => Color.Yellow | (Red, _) => Color.Blue | (Yellow, Blue) => Color.Red | (Yellow, _) => Color.Blue | _ => me while (true) // wait for an available slot in the meeting place while (second!=Color.None) yield me if (first!=Color.None) second = me other = first else if (N<=0) me = Color.Faded meetings += met break else first = me N -= 1 // wait for a companion: while (second==Color.None) yield me other = second first = Color.None second = Color.None yield me meet() Schedule(threads: list[IEnumerator[Color]]) : int if (threads.IsEmpty) meetings else Schedule(threads.Filter((c)=>c.MoveNext())) public this(n:int) this.N = n public Run() : void def creatures = [Color.Blue, Color.Red, Color.Yellow, Color.Blue].Map(Creature) Console.WriteLine(Schedule(creatures)) def n = int.Parse(Environment.GetCommandLineArgs()[1]) Chameneos(n).Run()