Click here to Skip to main content
15,881,281 members
Articles / Programming Languages / C++

Advent Of Code – Matchsticks – Puzzle 8

Rate me:
Please Sign up or sign in to vote.
0.00/5 (No votes)
19 Aug 2019CPOL3 min read 2.2K   2  
Advent of code - Matchsticks

This is Part 8 of a long series on Advent Of Code. You can find the previous part here.

For this new post, we are going to solve the problem from 8th December 2015, named "Matchsticks". The solution I will propose is in C++, but the reasoning can be applied to other languages.

Part 1

The Problem

The full version of this problem can be found directly on the Advent of Code website, I will only describe the essence of the problem here:

This year, Santa is bringing his list as a digital copy. He needs us to find out how much space it will take up when stored. To do that, we will have to find the difference between the number of characters in the code representation of the string literal and the number of characters in the in-memory string itself.

For example:

  • "aaa"aaa\x27" is 14 characters of code, but the string itself contains six "a" characters, a single quote character (escaped with the ""), and an ' in hexadecimal, so 8 characters in memory, which means the result of the difference will be 14-8=6.

For information, the only escape sequences used are \\ (representing a single backslash), \" (representing a lone double-quote character), and \x plus two hexadecimal characters (representing a single character with that ASCII code)

Solution

Compared to the previous problem, this one is simpler, so the solution will be much quicker. Let’s start with the logic of the program!

C++
size_t totalNumberOfCharacter{0};
size_t inMemoryNumberOfCharacter{0};

foreachLineIn(fileContent, [&totalNumberOfCharacter, 
                            &encodedNumberOfCharacter](const std::string& line)
{
    totalNumberOfCharacter += getTotalNumberOfCharacters(line);
    inMemoryNumberOfCharacter += getNumberOfCharacterInMemory(line);
});

const auto result =  totalNumberOfCharacter - inMemoryNumberOfCharacter;

Easy right?! Well, the objective is to make a subtraction, so, for each line, we do get the data and make the subtraction at the end.

Now, all we need to do is to look at the detail of the functions getTotalNumberOfCharacters and getNumberOfCharacterInMemory:

The first one (getTotalNumberOfCharacters) is a one-liner, all we have to do is return line.size().

The second one is larger, but still pretty simple. Indeed, to find the number of characters when the string is encoded, we have to count each letter, and count only one for the escape sequences of characters. This looks like that:

C++
size_t size{0};
for(size_t index{0}; index < line.size(); ++index)
{
    ++size;

    if(index == line.size() - 1) { continue; }

    if(line[index] == '\\' && line[index + 1] == '\\') { ++index; }
    else if(line[index] == '\\' && line[index + 1] == '"') { ++index; }
    else if(line[index] == '\\' && line[index + 1] == 'x') { index += 3; }
}
return size - 2; // Subtracts the two " around the sequence of characters

And here we are, with the source code allowing us to give Santa his answer. 🎅

Part 2

The Problem

Now, let’s do the opposite. In addition to finding the ù, we are going to encode each code representation as a new string and find the number of characters of the new encoded representation, including the surrounding double quotes, before subtracting it to the number of characters of code.

For example:

  • "aaa"aaa\x27" encodes ""aaa\"aaa\x27"", which adds 7 characters.

Solution

Well, since this part is very similar to the first part, we can reuse the code and only replace the call to getNumberOfCharacterInMemory by a call to a function getNumberOfCharactersWhenEncoded.

So let’s take a look to this new function:

C++
std::stringstream ss;
ss << std::quoted(line);
return ss.str().size();

What really ?!… Yes really, C++ has something done exactly for that, std::quoted, to encode a sequence of characters.

And we are done with this day from Advent of Code. It’s pretty nice to have some simpler problem for time to time. 😃

Conclusion

You can note that the solutions, written in this post, don’t include all the sources to make running programs, but only the interesting part of the sources to solve this problem. If you want to see the programs from end to end, you can go on my GitHub account, explore the full solution, add comments or ask questions if you want to.

Here is the list of std methods that we have used, I can’t encourage you enough to look at their definitions:

Thanks for reading, hope you liked it. 😃

And until the next part, have fun learning and growing.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Comments and Discussions

 
-- There are no messages in this forum --