Как создать машину Тьюринга, которая считывает и записывает 1 и 0 секунд? C#

#increment #state-machine #turing-machines

Вопрос:

Итак, у меня есть домашнее задание по созданию машины Тьюринга, которая использует строку типа 101, и если она считывает 0, она записывает 1, а если она считывает 1, она записывает 0. Он использует правила перехода с состояниями. Полный вопрос и таблица должны быть включены в прилагаемое изображение. Вопрос о домашнем задании

Вот что у меня получилось до сих пор с созданием этой машины Тьюринга на языке Си#

 class Program
{
    enum States
    {
        START,
        ADD,
        CARRY,
        OVERFLOW,
        RETURN,
        HALT
    };
    
    static void Main(string[] args)
    {
        States state = States.START;
        char[] input = "*101*".ToCharArray();
        int index = input.Length - 1;

        while(state != States.HALT)
        {
            switch (state)
            {
                case States.START:
                    if (input[index] == '*')
                    {
                        index--;
                        state = States.ADD;
                    }
                    break;
                case States.ADD:
                    if (input[index] == '0')
                    {
                        index  ;
                        state = States.RETURN;
                    }
                    else if (input[index] == '1')
                    {
                        index--;
                        state = States.CARRY;
                    }
                    else if (input[index] == '*')
                    {
                        index  ;
                        state = States.HALT;
                    }
                    break;
                case States.CARRY:
                    if (input[index] == '0')
                    {
                        index  ;
                        state = States.RETURN;
                    }
                    else if (input[index] == '1')
                    {
                        index--;
                        state = States.CARRY;
                    }
                    else if (input[index] == '*')
                    {
                        index--;
                        state = States.OVERFLOW;
                    }
                    break;
                case States.OVERFLOW:
                    if (input[index] == '*')
                    {
                        index  ;
                        state = States.RETURN;
                    }
                    break;
                case States.RETURN:
                    if (input[index] == '0')
                    {
                        index  ;
                        state = States.RETURN;
                    }
                    else if (input[index] == '1')
                    {
                        index  ;
                        state = States.RETURN;
                    }
                    else if (input[index] == '*')
                    {
                        state = States.HALT;
                    }
                    break;
            }
 

Кто-нибудь может помочь, пожалуйста?

Комментарии:

1. Какая помощь вам нужна?

2. Вам сказали, сколько звездочек должно предшествовать номеру? '*' Всегда ли одного человека достаточно?

3. Это должно быть 1 звездочка до и другая в конце, иначе это приведет к переполнению состояния

4. Не совсем так. Состояние «переполнения» вызвано не звездочками, а переполнением числа «переносом», например увеличением *1* (в отличие от успешного увеличения *01* ). А затем состояние «переполнения» обрабатывается неправильно, вызывая неопределенное поведение. Это можно предотвратить, указав две ведущие звездочки.

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