在恺撒密码第二变【难度:3级】:
答案1:
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;
using System;
public class CaesarTwo
{
public static List<string> encodeStr(string s, int shift)
{
s=char.ToLower(s[0])+""+(char)((char.ToLower(s[0])-97+shift)%26+97)+string.Join("",s.Select((x,i)=>(char.IsUpper(s,i)) ? (char)((x+shift-65)%26+65) : (char.IsLower(s,i)) ? (char)((x+shift-97)%26+97) : x));
var rs=new List<string>();
foreach(Match m in Regex.Matches(s,".{0,"+(s.Length/5+(s.Length%5==0 ? 0 : 1))+"}")) if (rs.Count<5&m.Value!="") rs.Add(m.Value);
return rs;
}
public static string decode(List<string> s)
{
string u=string.Join("",s).Substring(2);
return string.Join("",u.Select((x,i)=>(char.IsUpper(u,i)) ? (char)((x-s[0][1]+s[0][0]-65)%26+65) : (char.IsLower(u,i)) ? (char)((x-s[0][1]+s[0][0]-97)%26+97) : x));
}
}
答案2:
using System;
using System.Collections.Generic;
using System.Linq;
public class CaesarTwo
{
private static string alphabet = "abcdefghijklmnopqrstuvwxyz";
public static List<string> encodeStr(string s, int shift)
{
var firstLetter = char.ToLower(s[0]);
var message = firstLetter + "" + (char)((int)firstLetter + shift) + string.Concat(s.Select(c =>
{
if(char.IsLetter(c))
{
var preShift = alphabet.IndexOf(char.ToLower(c)) + shift;
while(preShift < 0)
{
preShift += alphabet.Length;
}
preShift %= alphabet.Length;
preShift -= alphabet.IndexOf(char.ToLower(c));
return (char)(((int)c) + preShift);
}
else
{
return c;
}
}));
var chunkMod = message.Length % 5;
var chunkSize = message.Length / 5;
var lastChunkSize = chunkSize;
if(message.Length % 5 != 0)
{
chunkSize++;
lastChunkSize = message.Length - (4 * chunkSize);
}
var list = new List<string>();
var start = 0;
for(var i=0;i<5;i++)
{
var len = chunkSize;
if(i == 4)
{
len = lastChunkSize;
}
if(len > 0)
{
list.Add(message.Substring(start, len));
}
start += len;
}
return list;
}
public static string decode(List<string> s)
{
var message = string.Concat(s);
var unshift = message[1] - message[0];
var decoded = "";
for(var i=2;i<message.Length;i++)
{
if(char.IsLetter(message[i]))
{
var preShift = alphabet.IndexOf(char.ToLower(message[i])) - unshift;
while(preShift < 0)
{
preShift += alphabet.Length;
}
preShift %= alphabet.Length;
preShift -= alphabet.IndexOf(char.ToLower(message[i]));
decoded += (char)(((int)message[i]) + preShift);
}
else
{
decoded += message[i];
}
}
return decoded;
}
}
答案3:
using System;
using System.Collections.Generic;
using System.Text;
public class CaesarTwo
{
private static List<string> splitEqually(string text, int nb)
{
List<string> res = new List<string>();
int size = text.Length / nb;
int rem = text.Length % nb;
if (rem != 0)
size++;
for (int start = 0, k = 0; k < nb; k++, start += size)
{
int l = Math.Min(text.Length - k * size, size);
string s = text.Substring(start, l);
if (s != "") res.Add(s);
}
return res;
}
private static List<string> encodeAux(string s, int shift)
{
StringBuilder result = new StringBuilder();
char c = Char.ToLower(s[0]);
char ch = (char)('a' + (c - 'a' + shift) % 26);
result.Append(c);
result.Append(ch);
for (int k = 0; k < s.Length; k++)
{
ch = s[k];
if (ch >=