Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 16.04.2016
Сообщений: 11

Конечные автоматы JS

08.05.2018, 03:47. Показов 2450. Ответов 3

Студворк — интернет-сервис помощи студентам
Привет. Необходимо реализовать такой алгоритм программы.

У нас есть како-то массив правил
JavaScript
1
 const array = ["A1B","A2C","A3D","B1C","B2A","A1A","C2C","C3A"];
"A1B" - значит что мы можем перейти из состояния "A" по команде "1" в состояние "B" , а также
есть массив переходов который пользователь вводит с клавиатуры, например:
JavaScript
1
commands = [1, 1, 1];
.
В этом примере
После 3 команды ( commands[2] ), "A1B" -> "B1C" -> невозможно перейти(так как после "B1C" мы не можем перейти в "C1*" у нас нет такого правила.) значит ( мы должны вернуться обратно ) ->"A1A" -> "A1B" -> "B1C" - этот путь возможен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2018, 03:47
Ответы с готовыми решениями:

Конечные автоматы
Сделал программу, задание звучит так Найти последовательность подряд идущих не четных элементов с максимальной суммой. Исходные...

Конечные автоматы!?!?!?!?
Ребят тупая задача сложнность 11 % а условие тупое не понятное кто может объяснить и условие и решение и с чем оно связано )))))) ...

Конечные автоматы
есть код для вычисления количества строк в тексте, все вроде ок, но при нажатии на кнопку выдает ошибку ThrowIfOutOfRange(idx); //...

3
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
08.05.2018, 23:16
Судя по описанию, у вас недетерминированный конечный автомат, заключительными состояниями которого может быть любое из состояний, можно схематично представить так:


Как у вас с теорией?
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
var stateMachine = {};
 
stateMachine.Rule = class {
  constructor (state, rule, next) {
    this.state = state;
    this.rule = rule;
    this.next = next;
  }
 
  isApplies (state, rule) {
    return this.state == state && this.rule == rule
  }
 
  follow () {
    return this.next
  }
}
 
stateMachine.NRulebook = class {
  constructor (rules) {
    this.rules = rules
  }
 
  nextStates (states, rule) {
    var result = [];
 
    states.forEach(state => {
      result = result.concat(this.rulesFor(state, rule).map(r => r.follow()))
    });
 
    return Array.from(new Set(result).values())
  }
 
  rulesFor (state, rule) {
    return this.rules.filter(r => r.isApplies(state, rule))
  }
 
  static from (array) {
    return new this(array.map(rule => {
      var vals = rule.split('');
 
      return new stateMachine.Rule(vals[0], parseInt(vals[1], 10), vals[2])
    }));
  }
}
 
stateMachine.NSM = class {
  constructor (startState, acceptStates, rulebook) {
    this.states = [startState];
    this.acceptStates = acceptStates;
    this.rulebook = rulebook;
  }
 
  next (step) {
    this.states = this.rulebook.nextStates(this.states, step);
 
    return this;
  }
 
  readSteps (steps) {
    steps.forEach(step => this.next(step));
 
    return this;
  }
 
  isAccepting () {
    for (var state of this.states) {
      if (this.acceptStates.includes(state)) return true
    }
 
    return false
  }
}
 
stateMachine.NSMFactory = class {
  constructor (params) {
    this.startState = params.startState;
    this.acceptStates = params.acceptStates;
    this.rulebook = params.rulebook;
  }
 
  isAccepting (steps) {
    return new stateMachine.NSM(this.startState, this.acceptStates, this.rulebook)
      .readSteps(steps)
      .isAccepting()
  }
}
 
const array = ["A1A", "A1B", "A2C", "A3D", "B1C", "B2A", "C2C", "C3A"];
 
var nsm = new stateMachine.NSMFactory({
  startState: 'A',
  acceptStates: ['A', 'B', 'C', 'D'],
  rulebook: stateMachine.NRulebook.from(array)
});
 
console.log(nsm.isAccepting([1, 1, 1])); //=> true
console.log(nsm.isAccepting([1, 2, 2, 1])); //=> false
console.log(nsm.isAccepting([3, 1])); //=> false
console.log(nsm.isAccepting([2, 3, 2, 3])); //=> true
3
0 / 0 / 0
Регистрация: 16.04.2016
Сообщений: 11
09.05.2018, 21:08  [ТС]
j2FunOnly, Спасибо вам за решение , да вы правельно поняли что это недетерминированный конечный автомат, а можно например вывести последовательность переходов, а не просто true или false. Например: если (1,1,1) , то вывод ( A1B -> B1C (здесь возврат)-> A1B -> A1A -> A1B) , а потом как бы показать что мы возвращаемся на шаг назад и идем по другому варианту.
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
11.05.2018, 09:53
Цитата Сообщение от MrJustify Посмотреть сообщение
то вывод ( A1B -> B1C (здесь возврат)-> A1B -> A1A -> A1B)
В приведённой реализации , такой вывод не получится. Так на каждый шаг вычисляются все возможные состояния автомата. (Тут кстати не до конца реализован КА - не хватает механизма свободных переходов)

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

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

Не по теме:

Честно говоря, мне лень этим заниматься :pardon:

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2018, 09:53
Помогаю со студенческими работами здесь

Конечные автоматы
Здравствуйте. Скажите пожалуйста, как вы понимаете все ниженаписанное: 1. Построить МП-автомат. Показать последовательность его...

Конечные автоматы
Помогите....требуется вычислить среднюю длину слова с точностью 2 знака после запятой. < a1b abc a234abd > 4.33 Составить...

Конечные автоматы
Вопрос, есть ли какие либо библиотеки на эту тему? Я сам ничего не нашёл. А пытался накидать, упорно выходит код полностью завёрнутый в...

Конечные автоматы
Помогите пожалуйста постоить графически НКА и ДКА по регулярному выражению 34(43343/44334)* и если можно еще пример программки на...

Конечные автоматы
в Pascal строки ограничены апострофами, а комментарии - символами {}, при этом скобка {, находящаяся внутри строки, не начинает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru