Crestron Masters Hackathon 2019

Jeremy Weatherford
5 min readApr 10, 2019

I’ve been looking forward to the 2019 Hackathon for months now — ever since the date for 2019 Masters was set. I was hoping for another individual challenge since I’ve never been a group project kind of guy, but Toine and Chris again stretched us by requiring solitary programmers to self-organize into groups. Fortunately it was easy to get most of the old gang back together — Andrew Wirshborn and I connected early on, then Casey Roe and David Lawton got us over the minimum to register a team. Nathan Hesson and Justin Curtin joined in later. Sadly Matt Rasmussen was not here this year.

Challenge number 1 was paying attention to the keynote speech earlier in the day for two reasons. The most elementary reason was figuring out which room to report to (since it wasn’t on our schedules), and the second was more diabolical.

I was happy to hear that the new challenge would involve components which could be worked on simultaneously. Last year’s absurdity of rotating programmers every 7 minutes in a relay race, however real-world of a scenario it might be, would not be repeated this year. At the beginning, however, we were all bottlenecked on a single trivia challenge which had to be completed before advancing to the others.

It became apparent that despite Rich’s exhortation to pay close attention to his introductory speech for hackathon clues, none of us had written down every word he had said, in particular the release dates for Crestron’s various product lines which turned out to be vital information. After making our best efforts on the ten or so trivia questions, we were doubly frustrated by the lack of feedback — it turned out this test was graded pass/fail, so we had no idea which answers were wrong. With ten answers to fill out and some contradictory results from Google, trying all permutations was out of the question. The tipping point was when Chris and Toine admitted they had misspelled the name of the town Crestron was named after (Cresskill, not Creskill).

I believe one team passed the trivia challenge unaided (maybe somebody did take notes?), but after Chris admitted the typo the rest of us had the leverage to insist that he provide some major hints (aka, correct answers) so that everyone could advance to the bulk of the competition.

At this point we made a strategic blunder by not explicitly assigning components of the puzzle to different people, and it took us longer than it should have to realize we were not only duplicating effort but actually interfering with each other. Once we got ourselves distributed on separate tasks it proceeded much smoother.

The tasks were a fantastic balance of programming and puzzles that reminded me of the 2017 Hackathon. I worked on Lock initially, then let my program run in the background while I picked up somebody else’s work on Game and finished it. Nathan and several other people collaborated on the logic problem, while Casey quickly completed the Design challenge and Andrew started on Shuffle.

The decryption challenge in Program stumped me for longer than it should have. I racked my brain to remember what I knew about cryptograms and ran it through some online frequency analyzers (none of which knew what to do with high ASCII —seriously, Chris?). At Chris’ prompting I re-read the problem which indicated the decryption key could be found on the site. There was a Latin phrase hidden in the page source which Justin recognized as “Divide and Conquer”, but I didn’t see how that could be mapped to the character set in the ciphertext. It turned out the answer had been right in front of me when I solved Mastermind. It actually gave me a link to download the key, but I had completely missed that when I jumped to the next task. Reading is important — stay in school, kids. Having missed the easy route, instead I started guessing filenames on the server, and was ecstatic to discover that the obvious “key.txt” returned the correct decryption key. Chris was kind enough to let me gloat about “hacking the server” for 15 whole seconds before telling me that the key.txt file didn’t even exist until I solved the Mastermind puzzle (which gave me a direct link to it). Ah well.

With the key, I whipped up a Javascript program to decode the ciphertext, which gave us the answer to that part as well as some curious instructions involving Twitter and party hats. Oddly, Chris looked baffled when several of us got up to leave the room, and we quickly ascertained that none of the people in party hats we were looking for were anywhere in the vicinity. Apparently he wasn’t ready for us to be on that part of the puzzle yet, maybe because the rest of us were still working on the Shuffle puzzle. After some frenzied recruiting of Crestron employees to man the party hats, Justin was able to get the required selfies and post them.

Around the same time, the Shuffle puzzle was finally solved after 30 minutes of work, revealing text describing the mathematical puzzle to be solved. When the last piece was in the correct place and the Submit button appeared, Casey yelled “Submit it!”, not that Andrew needed any encouragement, and it was submitted a nanosecond later. There followed an extended silence as we realized that none of us had actually read the text on the puzzle in order to answer the second part, and the solved puzzle was no longer visible. With the caution and precision of a bomb squad, Andrew clicked the Back button only to reveal that the puzzle was once again scrambled. Words were said.

As the Shuffle puzzle was being finished, Chris made an indirect comment about there being more than one way to solve it (as he had throughout the contest). Having nothing better to do, I had a look at the Javascript source for the puzzle and determined that each component had an index attribute set on it. After some quick research on jQuery sortables, I got them sorted by data-value from the console, which did in fact present the puzzle pieces in solved order. After carefully taking a screenshot of the puzzle text, we submitted it again, and Googled a solution to the puzzle which I’m sure would have been very interesting to do by hand.

We had one final code to enter, which was supposed to be related to the party hat photos. Nathan pointed out the letters taped to each one, and we had our clue: APSECE, which is an anagram of ESCAPE as hinted at by Rich. After a quick round of “We are the mightiest!” (not technically required, but now traditional) we basked in the glory until, well, I’ll let you know when I stop smiling.

Heartfelt thanks to my teammates, both returning and new. Thanks to Chris and Toine for pouring their hearts and diabolical schemes into the hackathon. I can’t wait to see how you’ll top this next year.

--

--