99 lines
2.3 KiB
Markdown
99 lines
2.3 KiB
Markdown
|
# Crypto Square
|
||
|
|
||
|
Welcome to Crypto Square on Exercism's Elixir Track.
|
||
|
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||
|
|
||
|
## Instructions
|
||
|
|
||
|
Implement the classic method for composing secret messages called a square code.
|
||
|
|
||
|
Given an English text, output the encoded version of that text.
|
||
|
|
||
|
First, the input is normalized: the spaces and punctuation are removed from the English text and the message is down-cased.
|
||
|
|
||
|
Then, the normalized characters are broken into rows.
|
||
|
These rows can be regarded as forming a rectangle when printed with intervening newlines.
|
||
|
|
||
|
For example, the sentence
|
||
|
|
||
|
```text
|
||
|
"If man was meant to stay on the ground, god would have given us roots."
|
||
|
```
|
||
|
|
||
|
is normalized to:
|
||
|
|
||
|
```text
|
||
|
"ifmanwasmeanttostayonthegroundgodwouldhavegivenusroots"
|
||
|
```
|
||
|
|
||
|
The plaintext should be organized into a rectangle as square as possible.
|
||
|
The size of the rectangle should be decided by the length of the message.
|
||
|
|
||
|
If `c` is the number of columns and `r` is the number of rows, then for the rectangle `r` x `c` find the smallest possible integer `c` such that:
|
||
|
|
||
|
- `r * c >= length of message`,
|
||
|
- and `c >= r`,
|
||
|
- and `c - r <= 1`.
|
||
|
|
||
|
Our normalized text is 54 characters long, dictating a rectangle with `c = 8` and `r = 7`:
|
||
|
|
||
|
```text
|
||
|
"ifmanwas"
|
||
|
"meanttos"
|
||
|
"tayonthe"
|
||
|
"groundgo"
|
||
|
"dwouldha"
|
||
|
"vegivenu"
|
||
|
"sroots "
|
||
|
```
|
||
|
|
||
|
The coded message is obtained by reading down the columns going left to right.
|
||
|
|
||
|
The message above is coded as:
|
||
|
|
||
|
```text
|
||
|
"imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau"
|
||
|
```
|
||
|
|
||
|
Output the encoded text in chunks that fill perfect rectangles `(r X c)`, with `c` chunks of `r` length, separated by spaces.
|
||
|
For phrases that are `n` characters short of the perfect rectangle, pad each of the last `n` chunks with a single trailing space.
|
||
|
|
||
|
```text
|
||
|
"imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau "
|
||
|
```
|
||
|
|
||
|
Notice that were we to stack these, we could visually decode the ciphertext back in to the original message:
|
||
|
|
||
|
```text
|
||
|
"imtgdvs"
|
||
|
"fearwer"
|
||
|
"mayoogo"
|
||
|
"anouuio"
|
||
|
"ntnnlvt"
|
||
|
"wttddes"
|
||
|
"aohghn "
|
||
|
"sseoau "
|
||
|
```
|
||
|
|
||
|
## Source
|
||
|
|
||
|
### Created by
|
||
|
|
||
|
- @jimmbraddock
|
||
|
|
||
|
### Contributed to by
|
||
|
|
||
|
- @amencarini
|
||
|
- @angelikatyborska
|
||
|
- @Cohen-Carlisle
|
||
|
- @devonestes
|
||
|
- @ggpasqualino
|
||
|
- @lpil
|
||
|
- @neenjaw
|
||
|
- @parkerl
|
||
|
- @sotojuan
|
||
|
- @waiting-for-dev
|
||
|
|
||
|
### Based on
|
||
|
|
||
|
J Dalbey's Programming Practice problems - https://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html
|