DevPinoy.org
A Filipino Developers Community
   

Short Quizzes

rated by 0 users
This post has 15 Replies | 4 Followers

Top 25 Contributor
Posts 193
Points 3,315

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]

  • | Post Points: 5
Page 2 of 2 (16 items) < Previous 1 2 | RSS
Copyright DevPinoy 2005-2008