|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
18.09.2018, 20:25 | #1 |
Пользователь
Регистрация: 17.04.2018
Сообщений: 28
|
Исправление кода C++
Проверяя работу на онлайн симуляторе машины тьюринга оказалось, что output 1.txt должен быть: 00V00000000011111000000000001111100 000000000000000000000000000000000H0 00000.
Output 1.txt моего кода: 00V*0000000001111A00*0000000001111B 0000000000000000000011110R000000000 H000000. Как исправить? #include <iostream> #include <algorithm> #include <vector> #include <fstream> #include <iterator> // Инструкция машины Тюринга struct instruction { std::string current_state; char current_char; char next_char; int move; std::string next_state; }; // Чтение инструкции из потока std::istream & operator>>(std::istream &is, instruction &i) { is >> i.current_state >> i.current_char >> i.next_char; char move_ch; is >> move_ch; i.move = (move_ch == 'R' ? 1 : -1); return is >> i.next_state; } // Машина Тьюринга struct machine { int position; // Позиция std::string state; // Состояние std::string tape; // Лента // Выполнить комманду bool execute(const instruction &i); bool end_of_tape() const { return position < 0 || position > tape.size(); } }; // Выполнить инструкцию bool machine::execute(const instruction& i) { if(i.current_state != state || tape[position] != i.current_char) return false; state = i.next_state; tape[position] = i.next_char; position += i.move; return true; } std::istream & operator>>(std::istream &is, machine &m) { m.state = "0"; is >> m.position; m.position--; return is >> m.tape; } int main() { std::ifstream ifs("1.txt", std::ifstream::in); machine m; ifs >> m; std::vector<instruction> program; std::copy(std::istream_iterator<ins truction>(ifs), std::istream_iterator<instruction>( ), std::back_inserter(program)); for(std::size_t i = 0; !m.end_of_tape() && i < program.size(); ) { if(m.execute(program[i])) i = 0; else i++; std::cout << m.tape << std::endl; } return 0; } 1.txt: 1 00V0000000001111*A000000000001111*B 000000000000000000000000ZR000000000 H000000 0 0 0 R 0 0 1 1 R 0 0 V V R 0 0 * * L 1 1 0 * R 2 1 1 * R 3 1 V V R 20 1 V V R 20 2 * 0 R 4 3 * 1 R 5 4 A A R 4 4 0 0 R 4 4 1 1 R 4 5 A A R 5 5 0 0 R 5 5 1 1 R 5 4 * * L 6 5 * * L 7 6 0 * R 8 6 1 * R 9 7 0 * R 10 7 1 * R 11 6 A A R 20 7 A A R 20 8 * 0 R 12 9 * 1 R 13 10 * 0 R 14 11 * 1 R 15 12 B B R 12 12 0 0 R 12 12 1 1 R 12 13 B B R 13 13 0 0 R 13 13 1 1 R 13 14 B B R 14 14 0 0 R 14 14 1 1 R 14 15 B B R 15 15 0 0 R 15 15 1 1 R 15 12 Z 0 L 16 13 Z 1 L 16 14 Z 1 L 16 15 Z 0 L 17 12 C 1 L 16 13 C 0 L 17 14 C 0 L 17 15 C 1 L 17 16 0 Z L 18 17 0 C L 18 18 A A L 18 18 B B L 18 18 * * L 18 18 0 0 L 18 18 1 1 L 18 18 V V R 0 20 A A R 20 20 B B R 20 20 * * R 20 20 0 0 R 20 20 1 1 R 20 20 Z 0 R 21 20 C 1 R 21 21 0 0 R X 21 1 1 R X |
18.09.2018, 22:29 | #2 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
|
18.09.2018, 23:21 | #3 |
Пользователь
Регистрация: 17.04.2018
Сообщений: 28
|
Именно эту программу проверял тут: http://morphett.info/turing/turing.html
|
19.09.2018, 08:51 | #4 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
Ну посмотрите сами. В программе нет ни одной команды, которая убрала бы из ленты A, B, Z. А в выходе симулятора их нет.
Кроме того, по логике работы Вашей программы как раз Ваш вывод - правильный. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Исправление кода C++ | DellXT | Общие вопросы C/C++ | 3 | 20.05.2018 10:09 |
Исправление кода C++ | DellXT | Общие вопросы C/C++ | 2 | 16.05.2018 00:06 |
Исправление кода | remus-xe2 | Фриланс | 1 | 10.11.2017 22:04 |
Исправление кода... | SwIm | Помощь студентам | 3 | 19.01.2010 01:43 |