public string[] Make(int totalWidth) { if(totalWidth % 2 == 0) throw new ArgumentException("Total width must be odd"); var result = new List(); var centre = totalWidth / 2; var increment = 1; var currentDistanceFromCentre = 0; do { var letter = (char) (currentDistanceFromCentre + 'A'); var line = new string('-', totalWidth).ToArray(); line[centre - currentDistanceFromCentre] = letter; line[centre + currentDistanceFromCentre] = letter; result.Add(new string(line)); // reverse direction when we hit the edge if ((2 * currentDistanceFromCentre) + 1 == totalWidth) increment = -1; currentDistanceFromCentre += increment; } while (currentDistanceFromCentre >= 0); return result.ToArray(); } } [TestClass] public class DiamondMakerTest { [TestMethod] public void TestSmallDiamond() { var diamond = new DiamondMaker().Make(5); Assert.AreEqual( @"--A-- -B-B- C---C -B-B- --A--", string.Join(Environment.NewLine, diamond)); } [TestMethod] public void TestBigDiamond() { var diamond = new DiamondMaker().Make(9); Assert.AreEqual( @"----A---- ---B-B--- --C---C-- -D-----D- E-------E -D-----D- --C---C-- ---B-B--- ----A----", string.Join(Environment.NewLine, diamond)); } }