Here's another solution - getting crazy with closures and objects. It's not the shortest one but I think it is quite readable.
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using NUnit.Framework; 5 6 namespace Spikes 7 { 8 [TestFixture] 9 public class PostmanProblemTest 10 { 11 [Test] 12 public void PostmanProblem() 13 { 14 MailBoxes mailBoxes = new MailBoxes(100); 15 mailBoxes.CloseAll(); 16 for (int multiple = 2; multiple <= 100; multiple++) 17 mailBoxes.ToggleMultiplesOf(multiple); 18 19 Console.WriteLine("-- All ---"); 20 mailBoxes.PrintOn(Console.Out); 21 Console.WriteLine("-- Closed ---"); 22 mailBoxes.PrintAllClosedOn(Console.Out); 23 } 24 25 public class MailBoxes 26 { 27 private List<MailBox> mailBoxes; 28 29 public MailBoxes(int numberOfMailBoxes) 30 { 31 mailBoxes = new List<MailBox>(numberOfMailBoxes); 32 33 for (int address = 1; address <= mailBoxes.Capacity; address++) 34 mailBoxes.Add(new MailBox(address)); 35 } 36 37 public void CloseAll() 38 { 39 mailBoxes.ForEach(MailBox.Close); 40 } 41 42 public void ToggleMultiplesOf(int multiple) 43 { 44 mailBoxes.FindAll(MultiplesOf(multiple)).ForEach(MailBox.Toggle); 45 } 46 47 public void PrintOn(TextWriter writer) 48 { 49 mailBoxes.ForEach(WriteOn(writer)); 50 } 51 52 public void PrintAllClosedOn(TextWriter writer) 53 { 54 mailBoxes.FindAll(delegate(MailBox box) { return box.IsClosed; }).ForEach(WriteOn(writer)); 55 } 56 57 private static Predicate<MailBox> MultiplesOf(int multiple) 58 { 59 return delegate(MailBox mailBox) { return mailBox.AddressIsMultipleOf(multiple); }; 60 } 61 62 private static Action<MailBox> WriteOn(TextWriter writer) 63 { 64 return delegate(MailBox box) { box.WriteOn(writer); }; 65 } 66 } 67 68 public class MailBox 69 { 70 private int _address; 71 private bool _isClosed = true; 72 73 public MailBox(int theAddress) 74 { 75 _address = theAddress; 76 } 77 78 public static void Close(MailBox aMailBox) 79 { 80 aMailBox.IsClosed = true; 81 } 82 83 public bool IsClosed 84 { 85 get { return _isClosed; } 86 set { _isClosed = value; } 87 } 88 89 private void Toggle() 90 { 91 IsClosed = !IsClosed; 92 } 93 94 public static void Toggle(MailBox aMailBox) 95 { 96 aMailBox.Toggle(); 97 } 98 99 public bool AddressIsMultipleOf(int multiple) 100 { 101 return _address % multiple == 0; 102 } 103 104 public void WriteOn(TextWriter writer) 105 { 106 writer.WriteLine(this); 107 } 108 109 public override string ToString() 110 { 111 return string.Format("MailBox {0} : {1}", _address, IsClosed ? "Closed" : "Open"); 112 } 113 } 114 } 115 } 116
-- All --- MailBox 1 : Closed MailBox 2 : Open MailBox 3 : Open MailBox 4 : Closed MailBox 5 : Open MailBox 6 : Open MailBox 7 : Open MailBox 8 : Open MailBox 9 : Closed MailBox 10 : Open MailBox 11 : Open MailBox 12 : Open MailBox 13 : Open MailBox 14 : Open MailBox 15 : Open MailBox 16 : Closed MailBox 17 : Open MailBox 18 : Open MailBox 19 : Open MailBox 20 : Open MailBox 21 : Open MailBox 22 : Open MailBox 23 : Open MailBox 24 : Open MailBox 25 : Closed MailBox 26 : Open MailBox 27 : Open MailBox 28 : Open MailBox 29 : Open MailBox 30 : Open MailBox 31 : Open MailBox 32 : Open MailBox 33 : Open MailBox 34 : Open MailBox 35 : Open MailBox 36 : Closed MailBox 37 : Open MailBox 38 : Open MailBox 39 : Open MailBox 40 : Open MailBox 41 : Open MailBox 42 : Open MailBox 43 : Open MailBox 44 : Open MailBox 45 : Open MailBox 46 : Open MailBox 47 : Open MailBox 48 : Open MailBox 49 : Closed MailBox 50 : Open MailBox 51 : Open MailBox 52 : Open MailBox 53 : Open MailBox 54 : Open MailBox 55 : Open MailBox 56 : Open MailBox 57 : Open MailBox 58 : Open MailBox 59 : Open MailBox 60 : Open MailBox 61 : Open MailBox 62 : Open MailBox 63 : Open MailBox 64 : Closed MailBox 65 : Open MailBox 66 : Open MailBox 67 : Open MailBox 68 : Open MailBox 69 : Open MailBox 70 : Open MailBox 71 : Open MailBox 72 : Open MailBox 73 : Open MailBox 74 : Open MailBox 75 : Open MailBox 76 : Open MailBox 77 : Open MailBox 78 : Open MailBox 79 : Open MailBox 80 : Open MailBox 81 : Closed MailBox 82 : Open MailBox 83 : Open MailBox 84 : Open MailBox 85 : Open MailBox 86 : Open MailBox 87 : Open MailBox 88 : Open MailBox 89 : Open MailBox 90 : Open MailBox 91 : Open MailBox 92 : Open MailBox 93 : Open MailBox 94 : Open MailBox 95 : Open MailBox 96 : Open MailBox 97 : Open MailBox 98 : Open MailBox 99 : Open MailBox 100 : Closed -- Closed --- MailBox 1 : Closed MailBox 4 : Closed MailBox 9 : Closed MailBox 16 : Closed MailBox 25 : Closed MailBox 36 : Closed MailBox 49 : Closed MailBox 64 : Closed MailBox 81 : Closed MailBox 100 : Closed
Discuss.
[jop]