Омофоническая замена на C#

Каждой букве в алфавите соответствует одна или несколько уникальных чисел от 01 до 99, требуется зашифровать вводимое слово. К примеру первая буква А заменяется на первое число, если А повторяется, то заменяется на следующее соответствующее ей. Руками прописывать 100 вариантов - идиотизм. Хочу понять сам механизм. Накидал пример ключаключ

        string symbols = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
        char[] alph = symbols.ToCharArray();
        int[] omo = new int[100];

        string a = ReadLine();
        char[] word = a.ToCharArray();

        for (int i = 0; i < word.Length; i++)
        {

        }

все что додумался написать


Ответы (2 шт):

Автор решения: Andrew

Для начала нужно завести себе дикшинари где ключем будет буква, а валью - массив чисел.

Потом конвертируешь строку в массив символов и через LINQ делаешь замену выбирая случайное число из массива, который ты достанешь из дикшинари по букве.

А в конце результат обьединяешь назад в строку, конечно же.

Вот, собственно, и все.

→ Ссылка
Автор решения: tym32167

Готовим словарь для маппинга

char[] symbols = "абвгдеёжзийклмнопрстуфхцчшщэюя".ToCharArray();    
var dict = new Dictionary<char, Queue<int>>();  
for(int i=1; i<=99; i++)
{
    var symb = symbols[i % symbols.Length];
    if (!dict.ContainsKey(symb)) dict.Add(symb, new Queue<int>());
    dict[symb].Enqueue(i);
}

Функция для кодирования

string Encrypt(string text, Dictionary<char, Queue<int>> dict)
{   
    var sb = new StringBuilder();
    foreach (var s in text)
    {
        if (dict.ContainsKey(s))
        {
            var number = dict[s].Dequeue();
            dict[s].Enqueue(number);
            sb.Append(string.Format("{0:D2}", number));
        }
        else        
            sb.Append(s);
        
    }
    return sb.ToString();
}

Проверка

var textToEncrypt = "аааааа! какой то текст, просто текст и всё.";  
Console.WriteLine(Encrypt(textToEncrypt, dict));

Вывод

306090306090! 1130411510 1945 4905711879, 161775481915 4935117879 09 021806.
→ Ссылка