Омофоническая замена на 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 шт):
Для начала нужно завести себе дикшинари где ключем будет буква, а валью - массив чисел.
Потом конвертируешь строку в массив символов и через LINQ делаешь замену выбирая случайное число из массива, который ты достанешь из дикшинари по букве.
А в конце результат обьединяешь назад в строку, конечно же.
Вот, собственно, и все.
Готовим словарь для маппинга
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.