Конечный автомат
Детерминированная машина конечного состояния - простая вычислительная модель, широко используемая как введение в теорию автоматов в базовых курсах CS. Это простая модель, эквивалентная регулярному выражению, которая определяет определенную входную строку Accepted или Rejected. Оставляя некоторые формальности в стороне, пробег конечной машины состояний состоит из:
- алфавит, набор символов.
- состояния, обычно визуализируемые как круги. Одно из состояний должно быть начальным состоянием. Некоторые из состояний могут принимать, обычно визуализируются как двойные круги.
- переходы, обычно визуализированные как направленные арки между состояниями, являются направленными связями между состояниями, связанными с буквой алфавита.
- строка ввода, список символов алфавита.
Запуск на машине начинается в начальном состоянии. Каждая буква входной строки считывается; Если есть переход между текущим состоянием и другим состоянием, соответствующим букве, текущее состояние изменяется на новое состояние. После чтения последней буквы, если текущее состояние является принимающим, входная строка принимается. Если последнее состояние не было принимающим состоянием или буква не имела соответствующей арки из состояния во время прогона, входная строка отклоняется.
Примечание. Это краткое описание далеко не полное, формальное определение FSM; Хорошая статья в Википедии - отличное введение в тему.
Пример
Например, следующий компьютер сообщает, имеет ли двоичное число, читаемое слева направо, четное число 0
s:
- Алфавит - это набор
{0,1}
. - Состояние: S1 и S2.
- Переходы
(S1, 0) -> S2
,(S1, 1) -> S1
,(S2, 0) -> S1
и(S2, 1) -> S2
. - Строка ввода - это любое двоичное число, включая пустую строку.
Правила:
Внедрить FSM на выбранном вами языке.
Ввод
FSM должен принять следующий ввод:
<States> List of state, separated by space mark.
The first state in the list is the start state.
Accepting states begin with a capital letter.
<transitions> One or more lines.
Each line is a three-tuple:
origin state, letter, destination state)
<input word> Zero or more characters, followed by a newline.
Например, вышеупомянутая машина с 1001010
в качестве входной строки будет записана как:
S1 s2
S1 0 s2
S1 1 S1
s2 0 S1
s2 1 s2
1001010
Выход
Запуск FSM, написанный как <State> <letter> -> <state>
, за которым следует конечное состояние. Выход для входного примера будет следующим:
S1 1 -> S1
S1 0 -> s2
s2 0 -> S1
S1 1 -> S1
S1 0 -> s2
s2 1 -> s2
s2 0 -> S1
ACCEPT
Для пустого ввода ''
:
S1
ACCEPT
Примечание.. Следуя вашим комментариям, строка S1
(показывающая первое состояние) может быть опущена, а также следующий вывод:
ACCEPT
Для 101
:
S1 1 -> S1
S1 0 -> s2
s2 1 -> s2
REJECT
Для '10X'
:
S1 1 -> S1
S1 0 -> s2
s2 X
REJECT
Приз
Активация 250 репрессий будет предоставлена кратчайшему решению.
Эталонная реализация
Референсная реализация Python доступна здесь. Обратите внимание, что требования к выходной мощности были ослаблены для ввода пустой строки.
Добавление
Формат вывода
Следуя популярному запросу, следующий вывод также допустим для пустой строки ввода:
ACCEPT
или
REJECT
Без первого состояния, записанного в предыдущей строке.
Имена состояний
Допустимые имена состояний - это английская буква, за которой следует любое количество букв, _
и цифр, подобно именам переменных, например. State1
, state0
, STATE_0
.
Формат ввода
Как и большинство гольф-клубов, вы можете предположить, что ваш вход правильный.
Сводка ответов:
- Cobol - 4078 символов
- Python - 171 символ, 568 символов, 203 символы, 218 символов, 269 символов
- sed - 137 символов
- ruby - 145 символов, 183 символа
- Haskell - 192 символа, 189 символов
- LISP - 725 символов
- Perl - 184 символа
- Bash - 184 символа
- Rexx - 205 символов
- Lua - 356 символов
- F # - 420 символов
- С# - 356 символов
- Mixal - 898 символов
Решение sed
137 является самым коротким, ruby 145 - это # 2. В настоящее время я не могу заставить решение sed работать:
cat test.fsm | sed -r solution.sed
sed -r solution.sed test.fsm
оба дали мне:
sed: -e expression #1, char 12: unterminated `s' command
поэтому, если у него нет разъяснений, щедрость переходит к рубиновому решению.