Snippets

Craig Slusher Code Dojo - Christmas Tree

Created by Craig Slusher last modified
module tree;

import std.conv : to;
import std.range : repeat, take;
import std.stdio : writeln;

version(unittest)
{
    import std.algorithm : equal;
    import std.range : takeNone;
}

void main(string[] args)
{
    christmasTree(args[1].to!uint);
}

auto christmasTree(in uint height)
{
    for (auto level = 1; level <= height; level++)
    {
        writeln(height.getSpaces(level), level.getStars);
    }
}

auto getSpaces(in uint height, in uint level)
in
{
    assert(level > 0 && level <= height);
}
body
{
    return ' '.repeat.take(height - level);
}

unittest
{
    auto noSpaces = [' '].takeNone;
    assert(equal(getSpaces(1, 1), noSpaces));
    assert(equal(getSpaces(5, 1), ' '.repeat.take(4)));
    assert(equal(getSpaces(5, 4), [' ']));
    assert(equal(getSpaces(100, 100), noSpaces));
}

auto getStars(in uint level)
in
{
    assert(level > 0);
}
body
{
    return '*'.repeat.take(level * 2 - 1);
}

unittest
{
    assert(equal(getStars(1), ['*']));
    assert(equal(getStars(5), '*'.repeat(9)));
    assert(equal(getStars(100), '*'.repeat(199)));
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.