Created
August 17, 2015 12:56
-
-
Save davidwhitney/343dbfbd929e8ebf40f7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using NUnit.Framework; | |
namespace triangle | |
{ | |
public class Pascal | |
{ | |
public static string GenerateNicely(int maxDepth) | |
{ | |
var triangle = Generate(maxDepth); | |
return Pretty(triangle); | |
} | |
public static List<int[]> Generate(int maxDepth) | |
{ | |
var lines = new List<int[]>(); | |
for (var currentDepth = 0; currentDepth < maxDepth; currentDepth++) | |
{ | |
if (currentDepth == 0) | |
{ | |
lines.Add(new[] { 1 }); | |
continue; | |
} | |
var thisLine = CreateNewLine(currentDepth); | |
PopulateMiddleParts(lines, thisLine, currentDepth); | |
lines.Add(thisLine); | |
} | |
return lines; | |
} | |
private static int[] CreateNewLine(int i) | |
{ | |
var thisLine = new int[i + 1]; | |
thisLine[0] = 1; | |
thisLine[i] = 1; | |
return thisLine; | |
} | |
private static void PopulateMiddleParts(List<int[]> lines, int[] thisLine, int currentDepth) | |
{ | |
var previous = lines.Last(); | |
for (var position = 1; position <= currentDepth - 1; position++) | |
{ | |
thisLine[position] = previous[position - 1] + previous[position]; | |
} | |
} | |
private static string Pretty(IEnumerable<int[]> triangle) | |
{ | |
var linesWithFixedSpaces = triangle.Select(x => string.Join(" ", x)).ToArray(); | |
var widest = linesWithFixedSpaces.Max(x => x.Length); | |
for (var i = 0; i < linesWithFixedSpaces.Length; i++) | |
{ | |
var leftPad = (widest - linesWithFixedSpaces[i].Length) / 2; | |
linesWithFixedSpaces[i] = new string(' ', leftPad) + linesWithFixedSpaces[i]; | |
} | |
var formatted = string.Join(Environment.NewLine, linesWithFixedSpaces); | |
return formatted; | |
} | |
} | |
[TestFixture] | |
public class PascalTests | |
{ | |
[Test] | |
public void GivenOneGetOne() | |
{ | |
var triangle = Pascal.Generate(1); | |
Assert.That(string.Join(" ", triangle[0]), Is.EqualTo("1")); | |
} | |
[Test] | |
public void GivenMoreThanOneDepth_StartsAndEndsWithOne() | |
{ | |
var triangle = Pascal.Generate(5); | |
Assert.That(string.Join(" ", triangle[0]), Is.StringStarting("1")); | |
Assert.That(string.Join(" ", triangle[0]), Is.StringEnding("1")); | |
} | |
[Test] | |
public void GivenTwo_TriangleTwoDeepCreated() | |
{ | |
var triangle = Pascal.Generate(2); | |
Assert.That(triangle.Count, Is.EqualTo(2)); | |
} | |
[Test] | |
public void GivenTwo_TriangleCreatedWithCorrectValues() | |
{ | |
var triangle = Pascal.Generate(2); | |
Assert.That(string.Join(" ", triangle[0]), Is.EqualTo("1")); | |
Assert.That(string.Join(" ", triangle[1]), Is.EqualTo("1 1")); | |
} | |
[Test] | |
public void GivenThree_TriangleCreatedWithCorrectValues() | |
{ | |
var triangle = Pascal.Generate(3); | |
Assert.That(string.Join(" ", triangle[0]), Is.EqualTo("1")); | |
Assert.That(string.Join(" ", triangle[1]), Is.EqualTo("1 1")); | |
Assert.That(string.Join(" ", triangle[2]), Is.EqualTo("1 2 1")); | |
} | |
[Test] | |
public void GivenFour_TriangleCreatedWithCorrectValues() | |
{ | |
var triangle = Pascal.Generate(4); | |
Assert.That(string.Join(" ", triangle[0]), Is.EqualTo("1")); | |
Assert.That(string.Join(" ", triangle[1]), Is.EqualTo("1 1")); | |
Assert.That(string.Join(" ", triangle[2]), Is.EqualTo("1 2 1")); | |
Assert.That(string.Join(" ", triangle[3]), Is.EqualTo("1 3 3 1")); | |
} | |
[Test] | |
public void GivenFour_PrettyPrints() | |
{ | |
var lines = Pascal.GenerateNicely(6) | |
.Split(new[] {Environment.NewLine}, StringSplitOptions.None); | |
Assert.That(lines[0], Is.EqualTo(" 1")); | |
Assert.That(lines[1], Is.EqualTo(" 1 1")); | |
Assert.That(lines[2], Is.EqualTo(" 1 2 1")); | |
Assert.That(lines[3], Is.EqualTo(" 1 3 3 1")); | |
Assert.That(lines[4], Is.EqualTo(" 1 4 6 4 1")); | |
Assert.That(lines[5], Is.EqualTo("1 5 10 10 5 1")); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment