воскресенье, 19 февраля 2012 г.

Нормальный алгоритм

Нормальный алгорим Маркова представляет собой упорядоченный набор правил замен подстрок. Например, если у нас есть алгоритм
"Мой" -> "Моя"
"дядя" -> "тётя"
то, применив его к строке "Мой дядя самых честных правил", мы получим строку "Моя тётя самых честных правил".

Другими словами, алгоритм Маркова действует следующим образом:
1. Просматривая список правил сверху вниз, найти первое правило, которое применимо к текущей строке.
2. Если такого правила нет, то закончить алгоритм.
3. Если правило нашлось, то выполнить подстановку и перейти на шаг 1. При этом, если левая часть правила содержится в строке более одного раза, то будет заменено только самое левое вхождение.

Напишите нормальный алгоритм, который будет складывать двоичные числа. То есть, подав ему на вход строку "10+11", мы должны получить на выходе строку "101".

Для проверки решения можно воспользоваться онлайн интерпретатором:

Решение
Алгоритм:
0$Z -> $0
0$U -> $1
1$Z -> $1
1$U -> C$0
0C -> 1
1C -> C0
C -> 1
0Z -> Z0
1Z -> Z1
0U -> U0
1U -> U1
+Z -> Z+
+U -> U+
0@ -> Z@
1@ -> U@
#0 -> 0#
#1 -> 1#
# -> @
+@ ->
$ ->
+ -> $+#

Здесь используются дополнительные управляющие символы: Z (zero) и U (uno) для перемещения складываемых разрядов. $ и @ определяют границы обработанных разрядов. Символ C (carry) обозначает перенос.

Пример работы:
110+10
110$+#10
110$+1#0
110$+10#
110$+10@
110$+1Z@
110$+Z1@
110$Z+1@
11$0+1@
11$0+U@
11$0U+@
11$U0+@
1C$00+@
C0$00+@
10$00+@
10$00
1000

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

Отправить комментарий