Name: Anonymous 2010-07-06 19:37
Discuss: http://cspangled.blogspot.com/
A teaser:
A command line gui? What is this, the 1970-ies? (A side note: This was the main reason I later persuaded them to replace the test with a new one.)
And the algorithm was pretty muddily explained. Replace X, Y corresponding with A, B and whatnot? That couldn't possibly be any less unclear, couldn't it not? Not giving up hope, I read the text carefully over and over again until finally it hit me: This is just a less general version of my Rot Thirteen cipher! I was in luck. After quickly typing in the memorized code, I had about an hour to figure out how to get the blooming thing to work in a terminal and add some polish. I got time to add some XML in there and even add a few design patterns. I was, and still am, pretty pleased with the end result:
A teaser:
A command line gui? What is this, the 1970-ies? (A side note: This was the main reason I later persuaded them to replace the test with a new one.)
And the algorithm was pretty muddily explained. Replace X, Y corresponding with A, B and whatnot? That couldn't possibly be any less unclear, couldn't it not? Not giving up hope, I read the text carefully over and over again until finally it hit me: This is just a less general version of my Rot Thirteen cipher! I was in luck. After quickly typing in the memorized code, I had about an hour to figure out how to get the blooming thing to work in a terminal and add some polish. I got time to add some XML in there and even add a few design patterns. I was, and still am, pretty pleased with the end result:
using System;
namespace ConsoleApplication1 {
// Factory pattern
class CesarFactory {
private int key;
public CesarFactory(int key) {
this.key = key;
}
public ICipher Instantiate() {
return new CesarAdapter();
}
}
// Interface pattern
interface ICipher {
string Encipher(string plaintext);
}
// Adapter pattern
class CesarAdapter : ICipher {
string ICipher.Encipher(string plaintext) {
return Cesar.Encode(plaintext);
}
}
// Cesar cipher
class Cesar {
public static string Encode(string input) {
char[] chars = input.ToCharArray();
for (int i = 0; i < input.Length; i++) {
int lowerRotation = Rotate(chars[i] - 'a', 3, 26);
int upperRotation = Rotate(chars[i] - 'A', 3, 26);
if (chars[i] > 'a') chars[i] =
(char)('a' + lowerRotation);
else if (chars[i] > 'A') chars[i] =
(char)('A' + upperRotation);
}
return new string(chars);
}
private static int Rotate(int c, int delta, int max) {
c += delta;
while (c > max) c -= max;
return c;
}
}
// Entry point.
class Program {
// Command line gui.
static void Main(string[] args) {
// Create Cesar factory
CesarFactory factory = new CesarFactory(3);
// Xml header
Console.Out.Write("<XML version=\"1.0\"><Cesar>");
// Read as long as there is something in the input buffer.
while (Console.BufferHeight > 0) {
// Read from Console.
int x = Console.Read();
// Encode input as string.
string plaintext = new string(new char[]{(char)x});
// Get cipher.
ICipher cesar = factory.Instantiate();
// Encipher plaintext.
string ciphertext = cesar.Encipher(plaintext);
// Output ciphertext to Console.
Console.Write(ciphertext);
}
// Xml footer
Console.Out.Write("</XML></Cesar>");
}
}
}