Skip to main content

The Solution


And boy did it.

The following sixty tweets, all released within a week's time, comprised the entire 2015 Ginter Code. If you are interested in this solution, but not familiar with this code program, I would highly encourage you to take ten minutes and read through the text of these sixty tweets, ignoring all the numbers and other peripheral information. Take a few more minutes, let it ruminate. Otherwise, the solution will bore you, and you won't fully appreciate what was, in my humble opinion, the best of the eight Ginter Code programs.

The Tweets




The Setup, and First Observations

The first thing you needed to recognize was that the text of all of the tweets has a fixed length. The text of each tweet, not considering spaces or punctuation, is either exactly 50 or 60 characters long. There are fifty tweets of length 60, and ten tweets of length 50, for a total of 3500 letters of text across the sixty tweets.

In addition, you also needed to see that the numbers at the bottom of each tweet somehow corresponded to the text in the tweet itself. Tweets of length 60 had six corresponding numbers (1 thru 6), and tweets of length 50 had five corresponding numbers (1 thru 5). For example, observe that this tweet has sixty letters of text and numbers 1 thru 6:
While this tweet has fifty letters of text and numbers 1 thru 5:
The implication here is that, somehow, each tweet is going to be broken up into blocks of 10 letters each. Tweets of length 60 would contain six blocks of 10 letters each, and tweets of length 50 would contain five blocks. This is most explicit in the very first tweet, which contains six sentences, each exactly 10 letters long:
As you think your way through this, consider these three tweets in sequence:
The tweets contain 3500 total characters of text. Ten years of Allen & Ginter (2006-2015) contains 3500 base cards (1-350 each year). We were being instructed to build a "master set", 350 total cards, using exactly one card for each card number 1-350. We needed to somehow figure out which year's card to select for each card number. How would we determine the cards to select?

So (1) there's something here about "methods" that must be used in order to select cards, (2) there are six (or twelve??) methods to be used, and (3) somehow, someway, the tweets and the cards are used together, or in conjunction with one another, in order to select each card.

Then, there's this bizarre language about the "great mystery of our time", which somehow pertains to knowing which method to use where (or when?).

If you're confused, then you've come to the right place. We thought we understood this in a general sense -- and it turns out that we were right about this fairly early on -- but I will continue and address that later.

From this point on, literally every tweet (I believe the next thirty-six, in fact) until the very last few pertain to the "methods", what they are, and how they are applied in order to select the representative for each card number. I encourage you read through those, and try to make sense of it all. Skipping to the end of the instructions:

Finally, there's something here about the "great mystery" (of our time) and its "minute tail" that tells us what to do once we've selected all 350 cards. The observation you needed to make here is that there are sixty tweets, and each one was tweeted at a unique minute (00-59).

So we have (1) tweets, (2) cards, (3) methods, and (4) time. All four of these components must somehow work in tandem to build a "master set" of 350 cards, selecting one card per card number from all ten years of A&G.

Sorting Through the Mess

Data overload can be one of the most inhibiting factors in separating the signal from the noise in any process, and it was the toughest part of this code. I'll spare you the gory details of explaining exactly how we sorted through everything to map the information we were given onto the process required to get moving on this code program. Suffice it to say that it involved a spreadsheet and Python code that would make any normal person go insane.



There are eight total pieces of information required to solve this code. The numbered information above applies to all of the sixty tweets.

Number 1 - The tweet text
Number 2 - Mapping from tweet to a subset of cards
Number 3 - Mapping from tweet text to individual cards within the subset
Number 4 - Mapping from the selected cards back into the text of the tweet
Number 5 - The hour of the tweet
Number 6 - The minute of the tweet

Number 7 - All 3500 A&G base cards from years 2006-2015
Number 8 - The "methods" required to put everything together

There are 3500 total cards, and 3500 total letters in the sixty tweets. The entire 2015 Ginter Code would consist of extracting a 350-character "secret message" from the text of the tweets, using all the other information as a guide. Here's the process:

-- Order all the tweets by the "Number 2" mapping above, 1-60.
-- Map each tweet 1-60 to a subset of card numbers, 1-350, in order. If the tweet text has sixty letters, map it to six card numbers; if it has fifty letters, map it to five card numbers. For example, Tweet 1 will map to Card Numbers 1-6. The tweet above, Tweet 5, will map to Card Numbers 25-30. When you reach the end, you will have mapped all sixty tweets to all 350 card numbers.
-- Take a given tweet, and break up the text of the tweet into chunks of ten letters each. Do this for all sixty tweets. For example, the tweet above, which says "All ten years of cards are used ... each card number is represented only once" would break up like so:

ALLTENYEAR
SOFCARDSAR
EUSEDEACHC
ARDNUMBERI
SREPRESENT
EDONLYONCE


-- Taking a given tweet and its assigned card numbers, map the 6x10 (or 5x10) block of tweet text onto the sixty (or fifty) cards. Do this using the "A-values" inside the parentheses, the "Number 3" mapping above. Do this for all sixty tweets. For example, the "A-values" in the tweet above are, in order, "(3-B 4-B 2-B 5-B 6-B 1-B)". Given that we are mapping to Card Numbers 25-30, our mapping will look like this:

ALLTENYEAR - 3 (Card Number 27)
SOFCARDSAR - 4 (Card Number 28)
EUSEDEACHC - 2 (Card Number 26)
ARDNUMBERI - 5 (Card Number 29)
SREPRESENT - 6 (Card Number 30)
EDONLYONCE - 1 (Card Number 25)


-- Now that you have chunks of tweet text mapped to Card Numbers, map the letters in each chunk onto the ten cards (2006-2015) with that Card Number. Do this for all sixty tweets (all 350 "chunks" of tweet text). For example, the tweet above maps "ALLTENYEAR" to Card Number 27. This will look like so:

A - 27 Luis Gonzalez (2006)
L - 27 Scott Podsednik (2007)
L - 27 Brad Hawpe (2008)
T - 27 Chien-Ming Wang (2009)
E - 27 Brad Hawpe (2010)
N - 27 Dillon Gee RC (2011)
Y - 27 Ricky Nolasco (2012)
E - 27 Shelby Miller RC (2013)
A - 27 David Ortiz (2014)
R - 27 Maikel Franco (2015)

-- In the letter-to-card mapping, remove all text except that which is found in the name on the front of the card. Do this for all sixty tweets (all 350 "chunks" of tweet text). This is tricky, because in A&G years 2006-2008, the full name of each player/subject was given.

A - LuisGonzalez
L - ScottPodsednik
L - BradHawpe
T - Wang
E - Hawpe
N - Gee
Y - Nolasco
E - Miller
A - Ortiz
R - Franco

-- Apply a method to select one card from the group of ten. Do this for all sixty tweets (all 350 "chunks" of tweet text). (I'm not even going to try to explain this here ... see the section entitled "The Methods and Card Selection" below.) The example above gives "E - Hawpe" as the proper selection.
-- Taking the six (or five) letters selected within a given tweet, use the "Number 4" mapping above to reorder the letters. Do this for all sixty tweets. For example, the tweet above gives us the string "E C A R T C", which when reordered using the mapping "2 6 4 3 1 5", gives us "T E R A C C".
-- Once this action has been performed for all sixty tweets, take the sixty chunks of ordered text and reorder them by the minute of the tweet, "Number 6" above. The result is a coherent 350-character message, which I will reveal in the final section.

The Methods and Card Selection

If you've made it to this point, pat yourself on the back and claim a small victory.

I've shown you everything needed to solve this code, except the methods, what they are, how they were used, etc ... which, as it turns out, is about 80% of this code program. The tweets claim that there are six unique "methods", and that the reverse of each can be used, making effectively twelve. A large portion of the tweets are about these methods, how they are selected, and how they are applied. Consider these tweets once more:

These tweets are alluding to the use of the hour of each tweet (00-23) in determining the method to be used. We had already made some headway into what the methods were, but we weren't able to nail it down completely until a hint was provided about eight months later:

There's a lot to decipher there, but here's what we were able to confirm:

-- Methods, whatever they may be, are used to select words (from cards or from tweets?);
-- Whether a tweet came in the morning or the evening, or some variation thereof, would determine which 'version' of a method to use;
-- From the final tweet there (which says "THAT CLEARLY MEANS SUNDAY"), simple mathematical calculations of transforming letters to numbers would likely be found among the methods.


It may appear that I accidentally posted the same tweet twice, but notice that the times are different. These two tweets were sent at the exact same minute, but six hours apart. This affirmed that methods were selected based on hour, and that they rotated every six hours (because there are six methods). This also helped give us an order to the methods, and then helped us determine what the methods were. Applied to his example tweet, the methods produced the following:

-- something: Method 5 - Word Length, longest/shortest
-- -----—---------—----: Method 6 - ??
-- my: Method 1 - Highest Single Letter Score, max/min (numerical value of single letter)
-- my: Method 2 - Average Letter Score, highest/lowest (numerical average of all letters)
-- a: Method 3 - Alphabetical Arrangement, first/last
-- something: Method 4 - Total Word Score, highest/lowest (numerical sum of all letters)

There's some ambiguity in the example, what with some of the methods producing identical results, so we actually didn't nail down the methods perfectly until the day we actually solved the code ... but whatever. :)

From this, we determined how the methods lined up with the tweet hours ... but one more trick. Everything I've posted is in Central Time. The Codemaster is in New York, Eastern Time. It's always something. In fact, the very first two tweets from the Codemaster, well before the code officially started, were already pointing in this direction:

Therefore, every tweet would have to be considered in Eastern Time for the methods to line up correctly in this way:

-- Method 1: Tweet Hours 2am, 8am, 2pm, 8pm
-- Method 2: Tweet Hours 3am, 9am, 3pm, 9pm
-- Method 3: Tweet Hours 4am, 10am, 4pm, 10pm
-- Method 4: Tweet Hours 5am, 11am, 5pm, 11pm
-- Method 5: Tweet Hours 6am, 12pm, 6pm, 12am
-- Method 6: Tweet Hours 7am, 1pm, 7pm, 1am

In the example given, an "evening cohort", we applied the max/highest/first/longest versions of the methods. In a "morning cohort", we would apply the min/lowest/last/shortest versions. Six methods, but actually twelve. Method 1 produced "my", because it has the maximum highest single letter of any word in the tweet ("y"). Method 2 also produced "my", because it has the highest average letter score of any word in the tweet ("m" + "y" = 13 + 25 = 38 ... 38/2 = 19). Method 3 produced "a", because it is first when all words in the tweet are sorted alphabetically. Method 4 produced "something", because it has the highest total score of any word in the tweet (sum of digits in "something" is 110). Method 5 also produced "something", because it is the longest of all the words in the tweet. Method 6 ... much like the Codemaster, I'm not even sure what to say about this one.

When we figured this out, we were left with confusion ... not because we understood the methods obviously, but because the Codemaster had just applied the methods to words in a tweet. This actually took us down a fruitless path of applying the methods to the tweets themselves. This was never their intended use. If you've ever been inundated with data, you know how easy it is to lose sight of what's important. The methods were meant to be applied to names on the fronts of cards.

An Example of Method Application

Let's return to our example from before:

This is an "evening cohort", Hour 9pm (Eastern), so we would apply the high version of Method 2, "average letter score", to the cards mapped to this tweet. Once again, we have:

ALLTENYEAR - 3 (Card Number 27)
SOFCARDSAR - 4 (Card Number 28)
EUSEDEACHC - 2 (Card Number 26)
ARDNUMBERI - 5 (Card Number 29)
SREPRESENT - 6 (Card Number 30)
EDONLYONCE - 1 (Card Number 25)


And once more, for simplicity, consider only Card Number 27, and the average letter score of each name:

A - LuisGonzalez - 13.9
L - ScottPodsednik - 12.4
L - BradHawpe - 8.7
T - Wang - 11.3
E - Hawpe - 10.6
N - Gee - 5.7
Y - Nolasco - 11.3
E - Miller - 11.5
A - Ortiz - 17.6
R - Franco - 9.5

Our instinct may tell us that the winner here is "Ortiz", with an average letter score of 17.6. However, there's just one more kicker in method application. (And for you all still keeping up ... this was the final piece we were missing. Great back-story about how we finally figured this out.) Earlier I talked about "A-values", but I never mentioned what to do with the "B-values". Look at the example tweet above, and consider Card Number 27. "A-B", "3-7" ... means that you should select the seventh-highest value that the method produces among the ten values. The B-value is a rank.

A - LuisGonzalez - 13.9
L - ScottPodsednik - 12.4
L - BradHawpe - 8.7
T - Wang - 11.3
E - Hawpe - 10.6
N - Gee - 5.7
Y - Nolasco - 11.3
E - Miller - 11.5
A - Ortiz - 17.6
R - Franco - 9.5

The seventh-highest value is 10.6, which belongs to "Hawpe", which is assigned to the letter "E" in the tweet. You have made your very first card selection in the 'master set', and found your very first letter.

Wasn't that fun, kids? Imagine doing that 350 times, using twelve different methods. A calculation of some sort had to be performed on all 3500 cards. This was careful, painstaking labor. But it had to be done. :)

The Final Arrangements

Once this process was complete for all 350 cards, and all internal rearrangements were made (see the example in the "Sorting Through the Mess" section), you were still left with sixty chunks of unreadable text, each chunk either five or six letters long. Knowing that we would be resorting everything in order by tweet minute at the end ... once we began applying methods and selecting letters, we gamed the system a bit and went ahead and sorted everything by minute, to try and speed up the decryption process.

Once everything was done, all cards and letters were selected, and everything was put in its proper order, we had the following 350-character message:

CONGRATULATIONS ON CRACKING THE LAST STEP
NO ANAGRAMS HERE
TO WIN YOU MUST ACCESS THE TWITTER ACCOUNT GAMESETCRACKED
THE PASSWORD IS THE FIN NINE LETTERS OF THIS MESSAGE
MOVED UP THREE AND ALTERNATING CAPS AND LOWER
TWEET AT THE CODEMASTER AND YOUR OWN TWITTER ACCOUNT
AN IMAGE OF THE FIRST AND LAST CARDS IN THE MASTER SET
WITH THE REMAINDER OF THIS MESSAGE AS A HASHTAG
MASTER SET COMPLETE THE FINAL GINTER CODE IS CRACKED


Now, because we had screwed up a selection or twenty, we actually didn't have the full message right away. And wouldn't you know it, the part where we were hurting the most was in the definition of the password to the @GameSetCracked Twitter account. Once we spent an hour or two correcting our mistakes, we understood that the password would be the fin(al) nine letters of the entire message, shifted up by three, and alternating uppercase and lowercase.

Password: IsCrAcKeD + 3 == LvFuDfNhG

The rest, as they say, is history.




************************************


Looking back through what I've written here, even though it is an ocean of information, you might get the impression that this was not a difficult code program. However, there's a reason that almost everything we needed was released within a week's time, and it still took 19 months to be solved. There were many, many pieces that had to fall into place. Everything had to be precisely correct. If we made one wrong move, the entire thing would produce gibberish and would make no sense. Thankfully, it all came together.

We are very glad to have won, and we are grateful to the Codemaster for putting this together. Being the eighth and final Ginter Code program, he certainly went out with a bang. A+ for construction and presentation.

Thanks for the reading the 2015 Ginter Code Solution. We hope you enjoyed it.

Sincerely,

Jim and Grant

Comments

  1. I'll kick off the comments here.

    For the Codemaster, I am curious about a couple of things:

    (1) What insight can you give us into the original concept and design process? Did you hit any major/minor snags between design and implementation?

    (2) "THE PASSWORD IS THE FIN(AL) NINE LETTERS OF THIS MESSAGE" ... what happened that caused you to write "FIN" instead of "FINAL"?

    (3) Now that the Ginter Code is history, and you're nine years older than when you started it (and, if you're like the rest of us 30-somethings, you may have experienced significant life changes over that period of time) ... is it really, really over? Meaning, have you completed ruled out the possibility of doing something like this again?

    I'm sure I'll come up with another question or two before the day is up.

    ReplyDelete
    Replies
    1. Once again, congratulations and a hearty well done.

      1 - I can't recall any real eureka moments while putting the code together this time. Being the tenth anniversary of Ginter and the last code, building the master set seemed like the natural endgame. I don't remember when I came up with that, but it was very early in the process, probably earlier than any other code, and there was no agonizing or sleepless nights trying to think of a theme, as there had been pretty much every other time. Knowing that so early, it was just a matter of letting it roll around in my head for a while, and the form and steps of the code just accrued naturally over time. At a certain point, they accrued so much that I began to dread getting started, but it was better than the alternative I had experienced quite a few times before, flailing around until the last minute trying to come up with something simultaneously interesting, difficult, and solvable.

      All that said, before I came up with the general idea, the only thing I knew I wanted to accomplish was to put out the code all at once with, in theory at least, no additional information necessary. This one was going to hinge on dedication, not happening to be on Twitter at the right time, as some people have complained about parts of past codes.

      The only major snag I can think of is when I realized that even with the entire universe of Ginter cards to work with, I couldn't always engineer it to get the letters I needed to come out. This obviously became more pronounced the deeper I got and the smaller that universe become. I knew the solution to the problem immediately but really didn't want to go there. I beat my head against it for about a week trying to find another route but never did, and thus B values were born.

      2 - I'm sure you noticed this part of the message was one of the two within the arcane method (along with the "finalg" part of the winning hashtag). That was by design, as a kind of final roadblock for anyone who was running away with it and a check against any unforeseen hacks I was just blind to. Originally it was "the last ten letters," but I realized that was stupidly easily guessed by anyone who had cracked everything but the arcane method, so I reworded it in a way that would be unambiguous to those who had cracked it, but inscrutable if you were missing only that part of the message.

      3 - I make no promises (I learned my lesson in Willow Cove), but I wouldn't rule anything out. As exhausting as the whole thing can be, I always feel the pull back towards it around solution time.

      Delete
    2. Dearest Abe -

      1) The heck was all the "there's no triple crown" talk from the instructions? It was the only thing I didn't find a home for.

      2) Please delight me with the "poem point" code reveal from the 2014 code, in detail. I still lose sleep over it (okay, I don't, but I still want to see how it worked)

      3) Much appreciate the "all the info out at once" approach. Only wish the collective community liked to bash their heads against walls as much as me (a couple of you do tho, and I appreciate that).

      4) I think had you still posted a few cards here and there along the way, it would have been enough to keep the interest around it, and we'd probably have found the solution much sooner. Though I did appreciate you removing some degrees of freedom with the "something" example. In the end, I forced Grant to think about how we could get "CONGRA" from the first six letters (similar to the Jacoby break in 2010). Once we knew "INTERC" was preceded by "FINALG", it was the incentive we needed to keep pushing through. He woke up with "rank order" in his head the next morning. Grant had found "INTERC" a year earlier after we cranked through the orignal scoring, sorting and gridding.

      5) Thank you.

      Delete
  2. Really well done guys. I think we had tried your final revelation at some point a few months ago (Using B-value to choose the Nth card in the order). But we obviously were missing something somewhere else in the process, either the method selection, or something in the letter ordering, or maybe how we were using part 4 of the tweets (the last sequence of numbers). I don't think we ever got any readable text.

    Congrats on a long-fought battle!

    ReplyDelete
  3. Ok please let us know when you are going to start- newbie here

    ReplyDelete

Post a Comment