Другие языки программирования и технологии

Задача на машине Поста

На ленте машины Поста находится n массивов меток, после последнего массива на расстоянии
более трех пустых секций находится одна метка. Массивы меток разделены тремя пустыми ячейками. Количество меток в массивах не может быть меньше двух. Произвести обработку массивов следующим образом: если количество меток в массиве кратно трем, то стереть метки в данном массиве через одну, иначе – массив стереть полностью. Каретка находится над крайней левой меткой первого массива
Алгоритм простой, без заморочек.

А1. Делаем три шага влево. На каждом шаге проверяем конец массива. Если конец на третьем шаге, то длина массива кратна трём, идём на А2. Если конец массива на первом или втором шаге, то длина массива не кратна трём, идём на А3. Если конец не достигнут, повторяем А1.

А2. Идём к началу масива, стираем метки через одну. Идём на А4.

А3. Идём к началу массива, стираем метки подряд. Идём на А4.

А4. Проходим по разделителю массивов. Если за ним есть ещё массив, идём на А1.

А5. Идём до конечной метки.

Переведём этот алгоритм в условную запись машины Поста.

Ш1.1. Вправо (первый шаг).
Ш1.2. Если пусто, то Ш3.1 (длина не кратна 3).
Ш1.3. Вправо (второй шаг).
Ш1.4. Если пусто, то Ш3.1 (длина не кратна 3).
Ш1.5. Вправо (третий шаг).
Ш1.6. Если пусто, то Ш2.1, иначе Ш1.1.
Ш2.1. Влево, пока метка.
Ш2.2. Вправо.
Ш2.3. Если пусто, то Ш4.1.
Ш2.4. Стереть.
Ш2.5. Вправо.
Ш2.6. Если пусто, то Ш4.1, иначе Ш2.2.
Ш3.1. Влево, пока метка.
Ш3.2. Вправо.
Ш3.3. Если пусто, то Ш4.1.
Ш3.4. Стереть.
Ш3.5. Перейти к Ш3.2.
Ш4.1. Вправо.
Ш4.2. Если не пусто, ошибка.
Ш4.3. Вправо.
Ш4.4. Если не пусто, ошибка.
Ш4.5. Вправо.
Ш4.6. Если не пусто, то Ш1.1.
Ш5.1. Вправо, пока не метка.
Ш5.2. Стоп.

Ну и сама программа.

1. ВПРАВО
2. ? 14,3
3. ВПРАВО
4. ? 14,5
5. ВПРАВО
6. ? 7,1
7. ВЛЕВО
8. ? 9,7
9. ВПРАВО
10. ? 19,11
11. СТЕРЕТЬ
12. ВПРАВО
13. ? 19,9
14. ВЛЕВО
15. ? 17,14
16. СТЕРЕТЬ
17. ВПРАВО
18. ? 19,16
19. ВПРАВО
20. ? 21,28
21. ВПРАВО
22. ? 23,28
23. ВПРАВО
24. ? 25,1
25. ВПРАВО
26. ? 25,27
27. СТОП
28. ПОСТАВИТЬ

(Последняя команда — это специальная команда записи в непустую ячейку для ошибки.)
Vas9 Алексиевич
12 091
Лучший ответ
Нужно использовать алгоритм, который будет последовательно обрабатывать каждый массив меток на ленте.

Алгоритм может быть следующим:

Пока количество меток в текущем массиве больше 1, повторять следующие шаги:
a. Если количество меток в текущем массиве кратно трем, стереть каждую вторую метку в текущем массиве, начиная со второй метки.
b. Иначе стереть все метки в текущем массиве.

Переместить каретку на три пустых ячейки вправо.

Если на текущей позиции находится метка, удалить ее.

Переместить каретку на три пустых ячейки вправо.

Если на текущей позиции находится метка, переместить каретку на три пустых ячейки вправо и перейти к шагу 1.

Если на текущей позиции нет метки, а следующая ячейка содержит метку, переместить каретку на следующую ячейку и перейти к шагу 1.

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

Если на текущей позиции нет метки и расстояние до ближайшей метки больше трех пустых ячеек, остановить алгоритм.

Этот алгоритм будет работать корректно при условии, что на ленте находится не менее одного массива меток и после последнего массива на расстоянии более трех пустых секций находится одна метка. Каретка должна быть расположена над крайней левой меткой первого массива.
Сергей Заикин
Сергей Заикин
14 610
Марат Сулейманов Опять чат gpt облажался.
Задача дикая решается скорее всего сложно. а вы в институте учитесь или где?
Я для начала начну а потом буду продолжать свои мысли. Для начала ебошим влево пока не увидим три пустоты. Таким образом мы поймём что мы находимся в начале строки.
Потом потихонечку идём направо. Если видим метку, посмотрим следующая метка если ноль то сразу заканчиваем.
Алексей Войтюк Блин как в машине просто понять что-то или нечётное число???
Зубов Александр Если нужно чтобы число делилось на 3 нужно просто 3 проверки. Проблема в том чтобы потом вернуться и стереть
Для решения этой задачи на машине Поста можно использовать следующий алгоритм:

Переместить каретку на первый массив меток.
Если текущий массив меток содержит не менее двух меток и его размер кратен трем, то произвести следующие действия:
Стереть каждую вторую метку в текущем массиве, начиная со второй метки.
Перейти к следующему массиву меток.
Если текущий массив меток содержит не менее двух меток и его размер не кратен трем, то произвести следующие действия:
Стереть все метки в текущем массиве.
Перейти к следующему массиву меток.
Если текущий массив меток содержит менее двух меток, то произвести следующие действия:
Перейти к следующему массиву меток.
Если каретка дошла до последнего массива меток и после него имеется расстояние более трех пустых ячеек до следующей метки, то произвести следующие действия:
Остановить машину Поста.
Таким образом, этот алгоритм будет последовательно обрабатывать все массивы меток на ленте машины Поста в соответствии с условиями задачи.
Алексей Войтюк Каким раком вы будете считать на машине поста более трёх. Вот это условие если более трёх каким образом вы будете считать это на машине поста?