From e6fc4f9d5b2116b187da38d49629a0637b954d39 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 27 Aug 2016 16:56:02 +0200 Subject: Add crypto square --- go/crypto-square/README.md | 87 ++++++++++++++++++++++++++ go/crypto-square/crypto_square_test.go | 108 +++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 go/crypto-square/README.md create mode 100644 go/crypto-square/crypto_square_test.go diff --git a/go/crypto-square/README.md b/go/crypto-square/README.md new file mode 100644 index 0000000..8ce9bd9 --- /dev/null +++ b/go/crypto-square/README.md @@ -0,0 +1,87 @@ +# Crypto Square + +Implement the classic method for composing secret messages called a square code. + +Write a program that, given an English text, outputs 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 downcased. + +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 + +> If man was meant to stay on the ground, god would have given us roots. + +is normalized to: + +> ifmanwasmeanttostayonthegroundgodwouldhavegivenusroots + +The plaintext should be organized in to a rectangle. The size of the +rectangle (`r x c`) should be decided by the length of the message, +such that `c >= r` and `c - r <= 1`, where `c` is the number of columns +and `r` is the number of rows. + +Our normalized text is 54 characters long, dictating a rectangle with +`c = 8` and `r = 7`: + +```plain +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: + +```plain +imtgdvsfearwermayoogoanouuiontnnlvtwttddesaohghnsseoau +``` + +Output the encoded text in chunks. Phrases that fill perfect squares +`(r X r)` should be output in `r`-length chunks separated by spaces. +Imperfect squares will have `n` empty spaces. Those spaces should be distributed evenly across the last `n` rows. + +```plain +imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau +``` + +Notice that were we to stack these, we could visually decode the +cyphertext back in to the original message: + +```plain +imtgdvs +fearwer +mayoogo +anouuio +ntnnlvt +wttddes +aohghn +sseoau +``` + +To run the tests simply run the command `go test` in the exercise directory. + +If the test suite contains benchmarks, you can run these with the `-bench` +flag: + + go test -bench . + +For more detailed info about the Go track see the [help +page](http://exercism.io/languages/go). + +## Source + +J Dalbey's Programming Practice problems [http://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html](http://users.csc.calpoly.edu/~jdalbey/103/Projects/ProgrammingPractice.html) + +## Submitting Incomplete Problems +It's possible to submit an incomplete solution so you can see how others have completed the exercise. + diff --git a/go/crypto-square/crypto_square_test.go b/go/crypto-square/crypto_square_test.go new file mode 100644 index 0000000..75a3582 --- /dev/null +++ b/go/crypto-square/crypto_square_test.go @@ -0,0 +1,108 @@ +package cryptosquare + +import "testing" + +const targetTestVersion = 2 + +var tests = []struct { + pt string // plain text + ct string // cipher text +}{ + { + "s#$%^&plunk", + "su pn lk", + }, + { + "1, 2, 3 GO!", + "1g 2o 3", + }, + { + "1234", + "13 24", + }, + { + "123456789", + "147 258 369", + }, + { + "123456789abc", + "159 26a 37b 48c", + }, + { + "Never vex thine heart with idle woes", + "neewl exhie vtetw ehaho ririe vntds", + }, + { + "ZOMG! ZOMBIES!!!", + "zzi ooe mms gb", + }, + { + "Time is an illusion. Lunchtime doubly so.", + "tasney inicds miohoo elntu illib suuml", + }, + { + "We all know interspecies romance is weird.", + "wneiaw eorene awssci liprer lneoid ktcms", + }, + { + "Madness, and then illumination.", + "msemo aanin dnin ndla etlt shui", + }, + { + "Vampires are people too!", + "vrel aepe mset paoo irpo", + }, + { + "", + "", + }, + { + "1", + "1", + }, + { + "12", + "1 2", + }, + { + "12 3", + "13 2", + }, + { + "12345678", + "147 258 36", + }, + { + "123456789a", + "159 26a 37 48", + }, + { + "If man was meant to stay on the ground god would have given us roots", + "imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau", + }, + { + "Have a nice day. Feed the dog & chill out!", + "hifei acedl veeol eddgo aatcu nyhht", + }, +} + +func TestEncode(t *testing.T) { + if testVersion != targetTestVersion { + t.Errorf("Found testVersion = %v, want %v.", testVersion, targetTestVersion) + } + for _, test := range tests { + if ct := Encode(test.pt); ct != test.ct { + t.Fatalf(`Encode(%q): +got %q +want %q`, test.pt, ct, test.ct) + } + } +} + +func BenchmarkEncode(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, test := range tests { + Encode(test.pt) + } + } +} -- cgit v1.2.3