### What's going on here?

A few years ago while playing cards, I had an idea. More like a question, really: could you encode a message in a deck of cards? Is that mathematically possible?

A few weeks ago, I realized *hey*, you can Google that sort of
thing. Google lead me to a stack overflow article called
Fast permutation -> number -> permutation mapping algorithms.
That introduced me to the word I was looking for: Factorial
number system, and the related concept of Lehmer codes, so I
went straight to Wikipedia and began to figure out what I had gotten myself
into. The good news was that mathematicians have studied this thing and
come up with some great research.

Once I figured out how it was possible to encode a message in a deck of cards, I made this web app to demonstrate it was possible, and that brings us to what you're looking at now.

### How long can the messages be?

That depends on two things: How many cards are in a deck, and how many
letters are in your alphabet. Since there are fifty-two cards in a deck,
there are `52! ≈ 8✖️10`

possible orders for a deck
of cards. If your alphabet has 39 letters (26 proper letters, 10 digits,
space, quote, and period), then you will need to be able to store
39^{57}^{l} messages, where *l* is the maximum length of a
message.

This gives us the following formula to solve for *l*:

`52! ≥ 39`^{l}

This equation can be solved for l by asking Siri, "What's the log of 52 factorial divided by the log of 39?" The answer will be about 42.68, which rounds down to a maximum length of 42 characters, since it doesn't make sense to encode part of a character.

### Why is it named Codeck?

A **codec** is a word for something that encodes and decodes messages,
and I'm not one to pass up a good pun. Or a bad one, apparently.

### How was this built?

The styles and code are my own, but I got a lot of help from a data visualization library called D3.js (not affiliated with this project). All the code I wrote is available on Github at Codeck.