-
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add
crypto square
exercise (#60)
- Loading branch information
Showing
7 changed files
with
168 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
# 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 " | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
{ | ||
"authors": [ | ||
"glaxxie" | ||
], | ||
"files": { | ||
"solution": [ | ||
"crypto-square.ua" | ||
], | ||
"test": [ | ||
"tests.ua" | ||
], | ||
"example": [ | ||
".meta/example.ua" | ||
] | ||
}, | ||
"blurb": "Implement the classic method for composing secret messages called a square code.", | ||
"source": "J Dalbey's Programming Practice problems", | ||
"source_url": "https://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# Implement the classic method for composing secret messages called a square code | ||
|
||
CleanStr ← |1 ⊢⍉regex "\\w" ¯⌵ | ||
EmptyStr ← |0 [0 0] | ||
NoneEmptyStr ← |1 [⌈÷:⟜(.⌈√)⧻] | ||
GetRowNCol ← |1 ⨬(NoneEmptyStr|EmptyStr) ⊸(=0 ⧻) | ||
# Ciphertext ? Plaintext | ||
Ciphertext ← |1 /$"_ _" ≡(/$"__") ⍉↯⊙(⬚" "↙) ⟜/× GetRowNCol .CleanStr |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# This is an auto-generated file. | ||
# | ||
# Regenerating this file via `configlet sync` will: | ||
# - Recreate every `description` key/value pair | ||
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications | ||
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) | ||
# - Preserve any other key/value pair | ||
# | ||
# As user-added comments (using the # character) will be removed when this file | ||
# is regenerated, comments can be added via a `comment` key. | ||
|
||
[407c3837-9aa7-4111-ab63-ec54b58e8e9f] | ||
description = "empty plaintext results in an empty ciphertext" | ||
|
||
[aad04a25-b8bb-4304-888b-581bea8e0040] | ||
description = "normalization results in empty plaintext" | ||
|
||
[64131d65-6fd9-4f58-bdd8-4a2370fb481d] | ||
description = "Lowercase" | ||
|
||
[63a4b0ed-1e3c-41ea-a999-f6f26ba447d6] | ||
description = "Remove spaces" | ||
|
||
[1b5348a1-7893-44c1-8197-42d48d18756c] | ||
description = "Remove punctuation" | ||
|
||
[8574a1d3-4a08-4cec-a7c7-de93a164f41a] | ||
description = "9 character plaintext results in 3 chunks of 3 characters" | ||
|
||
[a65d3fa1-9e09-43f9-bcec-7a672aec3eae] | ||
description = "8 character plaintext results in 3 chunks, the last one with a trailing space" | ||
|
||
[fbcb0c6d-4c39-4a31-83f6-c473baa6af80] | ||
description = "54 character plaintext results in 7 chunks, the last two with trailing spaces" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# Implement the classic method for composing secret messages called a square code | ||
# Ciphertext ? Plaintext | ||
Ciphertext ← |1 ⊙(⍤ "Please implement Ciphertext" 0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
~ "crypto-square.ua" ~ Ciphertext | ||
|
||
# empty plaintext results in an empty ciphertext | ||
⍤⤙≍ "" Ciphertext "" | ||
|
||
# normalization results in empty plaintext | ||
⍤⤙≍ "" Ciphertext "... --- ..." | ||
|
||
# Lowercase | ||
⍤⤙≍ "a" Ciphertext "A" | ||
|
||
# Remove spaces | ||
⍤⤙≍ "b" Ciphertext " b " | ||
|
||
# Remove punctuation | ||
⍤⤙≍ "1" Ciphertext "@1,%!" | ||
|
||
# 9 character plaintext results in 3 chunks of 3 characters | ||
⍤⤙≍ "tsf hiu isn" Ciphertext "This is fun!" | ||
|
||
# 8 character plaintext results in 3 chunks, the last one with a trailing space | ||
⍤⤙≍ "clu hlt io " Ciphertext "Chill out." | ||
|
||
# 54 character plaintext results in 7 chunks, the last two with trailing spaces | ||
⍤⤙≍ "imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau " Ciphertext "If man was meant to stay on the ground, god would have given us roots." |