迭代解码

时间:2016-10-25 11:30:18

标签: c# iteration decoding

所以,我有一个我需要破解的密码。我有密钥,但问题是密码中的每个数字都对应三个或两个字母。例如,如果我们有密码' 12,我们知道' 1'对应于' A',' J'或' S'和' 2'对应于' B'' K'或者' T',我们需要输出所有可能的组合,因此:' AB',' AK'' AT',&# 39; JB',' JK',' JT',' SB',' SK',' ST&#39 ;。我将如何在C#中进行此操作?

提前致谢。

2 个答案:

答案 0 :(得分:0)

使用LINQ,您可以使用以下代码:

var input = "12";

var mappings = new Dictionary<string, string[]>();
mappings.Add("1", new string[] { "A", "J", "S" });
mappings.Add("2", new string[] { "B", "K", "T" });

var result = input.Select(c => mappings[c.ToString()]).CartesianProduct();

foreach (var item in result)
{
    Console.WriteLine(string.Join("", item.ToArray()));
}

它使用CartesianProduct extension method

中的Eric Lipperts blog

可以变得更容易

答案 1 :(得分:0)

您可以使用Linq创建交叉联接:

char[][] cl1 = { new[] {'A','J','S'}, new[] {'B','K','T'}, new[] {'C','L','U'} ......};

int offsetchar1 = 0;
int offsetchar2 = 1;
var j = (from c1 in cl1[offsetchar1]
          from c2 in cl1[offsetchar2]
          select
          c1.ToString() + c2.ToString()).ToArray();

添加第三个字符:

  int offsetchar3 = 2;
  var k = (from j1 in j
          from c3 in cl1[offsetchar3]
          select
          j1 + c3.ToString()).ToArray();