public static void Main()
var cipher = new QwertyCipher();
var text = "The quick brown fox jumped over the lazy dog.";
var scrambled = cipher.Transform(text, 2);
Console.WriteLine(scrambled);
Console.WriteLine(cipher.Transform(scrambled, 2, true));
public class QwertyCipher
readonly char[] topRow = new char[] { 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p' };
readonly char[] middleRow = new char[] { 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l' };
readonly char[] bottomRow = new char[] { 'z', 'x', 'c', 'v', 'b', 'n', 'm' };
public string Transform(string text, int spaces, bool reverse = false)
var result = new StringBuilder();
foreach(var letter in text)
var isUpper = char.IsUpper(letter);
var c = char.ToLower(letter);
var row = FindRow(c, reverse);
result.Append(char.ToUpper(ShiftOnRow(row, c, spaces)));
result.Append(ShiftOnRow(row, c, spaces));
return result.ToString();
char ShiftOnRow(char[] row, char letter, int spaces)
var index = Array.IndexOf(row, letter);
return row[(index + spaces) % row.Length];
char[] ReverseArray(char[] array)
var reversed = (char[])array.Clone();
char[] FindRow(char letter, bool reverse)
if (topRow.Any(l => l == letter))
return ReverseArray(topRow);
if (middleRow.Any(l => l == letter))
return ReverseArray(middleRow);
if (bottomRow.Any(l => l == letter))
return ReverseArray(bottomRow);