O Christmas Tree – JavaScript Challenge

abstract business code coder
Photo by Pixabay on Pexels.com

I have seen my fair share of Christmas tree coding posts this holiday season. They look cool and I was inspired to give it a try. I turned to javascript again since I am trying to learn more about it. Especially since I ran across cypress.io, but I digress.

What We’re Building

Here’s a look at the final(ish) version. I may come back to do a bit more formatting and add a few embellishments.

You can see from the screenshot above that it is a very simple application. A title, the tree, and a form to set the number of rows to be generated. It was quite easy to generate the tree to the console, but the html version was a bit tricky. I needed to find a way to push the console content to the web page.

Styles.css

The Christmas tree css is criminally simple. It is only there to apply a mono space font.

h1,
h2,
h3 {
    font-family: monospace;
    font-size: 24px;
    font-style: normal;
    font-variant: normal;
    font-weight: 700;
    line-height: 24px;
}

Index.html

Here again we have a simple tml file for the Christmas tree.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="styles.css">
    <title>Document</title>
</head>
<body>
    <h2>Christmas Tree</h2>
    <h3 id="star"></h3>
    <h3 id="tree"></h3>
    <div>
        <form action="/" method="get">
            <p>How many rows tall should the tree be?</p>
            <input type="text" name="size" id="size"> <input type="button" id="create" value="Create" onclick="printtree">
        </form>
    </div>
    <script src="index.js"></script>
</body>
</html>

Index.js

This is the heart of the Christmas tree app. First is the function to overwrite the default console logging. Arun Johny had the perfect implementation on stackexchange. I added the console.clear so the user does not have to see a christmas tree forest on their screen.

(function () {
    var old = console.log;
    var logger = document.getElementById('tree');
    console.log = function (message) {
        if (typeof message == 'object') {
            logger.innerHTML += (JSON && JSON.stringify ? JSON.stringify(message) : message) + '<br />';
        } else {
            logger.innerHTML += message + '<br />';
        }
    }
    console.clear = function () {
        logger.innerHTML = "";
    }
})();

Next is the function to print the Christmas tree. I pass in the number of rows as the tree height. I had a hard time with the white space, so I used hex value instead of  . Some simple padding within the for loop gives all of the formatting.

function printtree(n) {
    for (i = 0; i < n; i++) {
        if (i === 0) {
            console.log("*".padStart(n, '\xa0'));
        } else {
            str1 = "/".padStart(n - i, '\xa0');
            fill = (i % 3) === 0 ? "O" : "V";
            str2 = "\\".padStart((i + i), fill);
            console.log(str1.concat('', str2));
        }
    }
}

The last little bit of code is there to handle the create button action.

var createButton = document.querySelector("#create");
createButton.onclick = function () {
    console.clear();
    //should really check that there is a valid value here.
    var n = document.getElementById("size").value;
    printtree(n);
};

That’s it for the Christmas tree implementation. There is plenty of room to improve it. Hopefully this will give you a great starting place. I would love to see how much further you can take it. Be sure to check out some of my other posts.

Day 1: December 31, 2019 Monday

Today’s Progress: I have jumped on the Christmas Tree generation bandwagon.

Thoughts 100 consecutive days of coding is tough. Life finds a way to get in the way. I plan on figuring out a way to set aside 100 hours in the first quarter.

Link(s) to work Christmas Tree

You May Also Like