0

我有一个问题,我必须SWAPmove字符和整数。就像我有任何字符一样A。现在我有一些案例,比如

注意:- 必须使用字符A-Z和整数0-9

  1. A,现在我希望当我的程序运行时我为这个字符分配一些整数值,如果我给这个字符分配值 3 那么A它将变成D或者它只是移动到 3 个位置。

  2. 现在,如果我有一个喜欢的角色Y并且我添加了 4 那么它将再次从 character 开始C后成为手段。ZA

  3. 如果我有 9 并且我们将 3 分配给它,那么我必须遵循相同的条件,然后它将变为 2,因为循环从 0 而不是从 1 开始。意味着我们只能使用 0-9 整数。

我知道我使用了错误的名字来提问,但我不知道我必须使用哪些行来回答这类问题。

希望你能理解我的问题。

提前致谢。

4

4 回答 4

2

尝试以下扩展方法,该方法执行以下操作:

  1. 它创建了 2 个字典以加快在alphabet
  2. 将解析inputString变量,将其拆分为moveString变量长度(或余数)的子字符串
  3. 在每个子字符串上,它将评估每个字符以检测它是否是数字
  4. 如果不是数字,则swappedAlphabet使用int键在字典中查找值
  5. 如果是数字,则对数字和相应moveint值的和应用模运算
  6. 它最终聚合了最终结果字符串中的所有字符

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        string
            alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        string inputString = "ABC123D", moveString = "12";
        var result = inputString.Swap(alphabet, moveString);
        Console.WriteLine(result);
    }
}

static class ExtensionMethods
{
    public static Dictionary<TValue, TKey>
        SwapKeysValues<TKey, TValue>(this Dictionary<TKey, TValue> input)
    {
        var result = new Dictionary<TValue, TKey>();
        input.ToList().ForEach((keyValuePair) =>
        {
            result.Add(keyValuePair.Value, keyValuePair.Key);
        });
        return result;
    }

    public static string Swap(
        this string input,
        string alphabet,
        string move)
    {
        Dictionary<char, int> 
            alphabetDictionary = new Dictionary<char, int>();

        for (int i = 0; i < alphabet.Length; i++)
        {
            alphabetDictionary.Add(alphabet[i], i);
        }

        var swapedAlphabet = alphabetDictionary.SwapKeysValues();
        return Enumerable
            .Range(0, (int)Math.Ceiling(input.Length / (move.Length * 1M)))
            .ToList()
            .Aggregate<int, string>("", (s, i) =>
            {
                var l = i * move.Length + move.Length;
                var cInput = input.Substring(i * move.Length, 
                    (l > input.Length) 
                        ? input.Length - i * move.Length : move.Length);
                return s + cInput
            .Select((c, index) =>
            {
                int intCandidate;
                if (!Int32.TryParse(c.ToString(), out intCandidate))
                {
                    var length = (alphabetDictionary[c] +
                        Int32.Parse(move[index].ToString()));
                    return
                        swapedAlphabet[(alphabet.Length > length)
                            ? length : length % alphabet.Length];
                }
                else
                {
                    var moveInt = Int32.Parse(move[index].ToString());
                    return Char.Parse(((intCandidate + moveInt) % 10)
                        .ToString());
                }
            })
            .Aggregate<char, string>("", (a, b) => a + b);
            });
    }
}
于 2013-07-24T08:22:02.623 回答
1

您拥有的另一种选择是依靠遵循您想要的顺序的内置character/类型;integer还有一个额外的考虑:如果您考虑上限,它将提供上限(“A”之后的“B”和“a”之后的“b”)。您唯一需要担心的是确保迭代将限制在 AZ/0-9 边界内。示例代码:

public string moveChar(string inputChar, int noPos)
{
    string outChar = checkBoundaries(inputChar, noPos);

    if (outChar == "")
    {
        outChar = basicConversion(inputChar, noPos);
    }

    return outChar;
}

public string basicConversion(string inputChar, int noPos)
{
    return Convert.ToString(Convert.ToChar(Convert.ToInt32(Convert.ToChar(inputChar)) + noPos));
}

public string checkBoundaries(string inputChar, int noPos)
{
    string outString = "";

    int count1 = 0;
    do
    {
        count1 = count1 + 1;
        string curTemp = basicConversion(inputChar, 1);
        if (inputChar.ToLower() == "z" || curTemp.ToLower() == "z")
        {
            if (inputChar.ToLower() != "z")
            {
                noPos = noPos - count1;
            }

            inputChar = "a";
            outString = "a";
            if (inputChar == "Z" || curTemp == "Z")
            {
                inputChar = "A";
                outString = "A";
            }

            count1 = 1;
        }
        else if (inputChar == "9" || curTemp == "9")
        {
            if (inputChar != "9")
            {
                noPos = noPos - count1;
            }

            inputChar = "0";
            outString = "0";

            count1 = 1;
        }
        else
        {
            inputChar = curTemp;
            outString = inputChar;
        }
    } while (count1 < noPos);

    return outString;
}

它需要字符串(每次调用只有一个字符(字母或数字)),您可以简单地通过使用来调用它:moveChar("current letter or number", no_of_pos_to_move). 这个版本只考虑了“积极”/“向前”的运动,但它可能很容易被编辑以解释相反的情况。

于 2013-07-24T09:14:28.620 回答
1

这是一种非常简单的方法来实现具有您定义的限制的凯撒密码。

var shift = 3;
var input = "HELLO WORLD 678";

var classAlphabets = new Dictionary<UnicodeCategory, string>
{
    { UnicodeCategory.SpaceSeparator, " " },
    { UnicodeCategory.UppercaseLetter, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" },
    { UnicodeCategory.DecimalDigitNumber, "0123456789" }
};

var encoded = input.ToUpperInvariant()
                   .Select(c => new { Alphabet = classAlphabets[Char.GetUnicodeCategory(c)], Character = c })
                   .Select(x => new { x.Alphabet, Index = x.Alphabet.IndexOf(x.Character) })
                   .Select(x => new { x.Alphabet, Index = x.Index + shift })
                   .Select(x => new { x.Alphabet, Index = x.Index % x.Alphabet.Length })
                   .Select(x => x.Alphabet.ElementAt(x.Index))
                   .Aggregate(new StringBuilder(), (builder, character) => builder.Append(character))
                   .ToString();

Console.Write(encoded);

// encoded = "KHOOR ZRUOG 901"

解码只是反转移位的一种情况。

于 2013-07-24T08:49:30.003 回答
0

凯撒密码可以像这样更容易:

static char Encrypt(char ch, int code)
{
    if (!char.IsLetter(ch))
    {
        return ch;
    }
    char offset = char.IsUpper(ch) ? 'A' : 'a';
    return (char)(((ch + code - offset) % 26) + offset);
}

static string Encrypt(string input, int code)
{
    return new string(input.ToCharArray().Select(ch => Encrypt(ch, code)).ToArray());
}

static string Decrypt(string input, int code)
{
    return Encrypt(input, 26 - code);
}

const string TestCase = "Pack my box with five dozen liquor jugs.";

static void Main()
{
    string str = TestCase;

    Console.WriteLine(str);
    str = Encrypt(str, 5);
    Console.WriteLine("Encrypted: {0}", str);
    str = Decrypt(str, 5);
    Console.WriteLine("Decrypted: {0}", str);
    Console.ReadKey();
}
于 2013-09-24T15:23:45.863 回答