2016-10-25 4 views
-3

Итак, у меня есть шифр, который мне нужно будет сломать. У меня есть ключ, но проблема в том, что каждое число в шифре соответствует трем или двум буквам. Например, если бы у нас был шифр «12», и мы знаем, что «1» соответствует либо «A», «J», либо «S», а «2» соответствует «B», «K» или «T ', нам нужно было бы вывести все возможные комбинации, поэтому: «AB», «AK», «AT», «JB», «JK», «JT», «SB», «SK», «ST». Как мне это сделать на C#?Итеративное декодирование

Заранее спасибо.

+1

У вас уже есть код для отображения? –

+0

Простите, нет, у меня есть только код, который анализирует входные данные, но это не имеет значения. – Quantomic

+0

Ну, вам нужна какая-то структура данных, которая сохраняет ваш перевод (1 -> A, J, S). Вычисление возможных комбинаций должно быть довольно простым, если вы его кодируете как рекурсивную функцию. Вы должны начать реализовывать бит, и если у вас есть конкретная проблема, задайте здесь вопрос (так как этот вопрос кажется довольно широким) –

ответ

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

Cant получить гораздо проще

+0

Это потенциально может работать, хотя и создает «OutOfMemoryException». Любая идея, как сделать это менее интенсивным в памяти? Кстати, я строю для архитектуры x64 в x64-системе с установленной 8 ГБ ОЗУ. – Quantomic

+2

@CrAzYPiLoT: потерять «ToArray». Это приводит к тому, что весь результат запроса будет реализован сразу в большом блоке памяти. В этом нет необходимости. –

+0

Удалено ToArray(). Я использовал его только для лучшей видимости отладки. – fixagon

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(); 
Смежные вопросы