Skip to content

Instantly share code, notes, and snippets.

@davidwhitney
Created August 17, 2015 12:56
Show Gist options
  • Save davidwhitney/343dbfbd929e8ebf40f7 to your computer and use it in GitHub Desktop.
Save davidwhitney/343dbfbd929e8ebf40f7 to your computer and use it in GitHub Desktop.
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