Нормальный алгорифм Маркова

Возникла проблема с реализацией нормального алгоритма Маркова в С#. Задание: A={a,b,c}. Из слова P удалить второй символ, если такой есть. Сам алгоритм я записала так:

  • *a|->a^
  • ^a|->
  • *b|->b^
  • ^b|->
  • *c|->c^
  • ^c|->
  • *|->
  • ->*

При попытке использования готовых функций в С# ничего не выходит :(

У кого есть возможность помогите, пожалуйста :)

string word = Console.ReadLine();
string temp = word.Insert(0, new string('*', 1));
if (temp.Contains("*a"))
{
    temp.Replace("*a", "a^");
    temp.Replace("a^", "");
}
else if (temp.Contains("*b"))
{
    temp.Replace("*b", "b^");
    temp.Replace("b^", "");
}
else if (temp.Contains("*c"))
{
    temp.Replace("*c", "c^");
    temp.Replace("c^", "");
}
else Console.WriteLine("Слово пустое!");

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

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

Удобнее было бы использовать словать Dictionary и цикл его перебора. Я ничего не знаю про этот алгоритм, но попробую догадаться, чего вы бы хотели достичь.

Вот сделал с примером из Википедии.

  • 1 → 0|
  • |0 → 0||
  • 0 → ""

Как реализовать с вашим словарем, не знаю, потому что не понятно, что должен делать последний его элемент.

static void Main(string[] args)
{
    Dictionary<string, string> dictionary = new Dictionary<string, string>
    {
        { "1", "0|" },
        { "|0", "0||" },
        { "0", "" }
    };
    Console.Write("Введите слово: ");
    string word = Console.ReadLine();
    if (word.Length == 0)
    {
        Console.WriteLine("Слово пустое");
    }
    else
    {
        bool found;

        do
        {
            found = false;
            // перебираем словарь с использованием пары ключ-значение
            foreach (KeyValuePair<string, string> pair in dictionary)
            {
                if (word.Contains(pair.Key))
                {
                    found = true;
                    int position = word.IndexOf(pair.Key);
                    word = word.Remove(position, pair.Key.Length);
                    word = word.Insert(position, pair.Value);
                    break;
                }
            }
        }
        while (found); // повторяем перебор, пока есть совпадения

        Console.WriteLine("Результат: {0}", word);
    }
    Console.ReadKey();
}
→ Ссылка
Автор решения: Odin LaVoie

Если |-> это исполнение и стоп, то Сам алгоритм работать не будет. Может быть так?

*a->a^; *b->b^; *c->c^; ^a|-> ; ^b|-> ; ^c|-> ; *|-> ; ^|-> ; ->*
→ Ссылка