Правая линейная грамматика - ∞ баллов
S->ε
S->1A
S->0S
S->9I
S->3C
S->5E
S->4D
S->2B
S->7G
S->6F
S->8H
F->3K
K->0F
A->2L
K->1G
A->5B
A->0J
B->7A
J->5A
G->6K
G->8S
H->9K
F->5S
K->2H
I->6E
I->5D
J->4S
D->8I
B->6S
K->9B
F->6A
G->9A
K->6L
K->4J
C->1E
L->8K
E->5C
B->4K
C->0D
J->2K
D->2C
A->9F
J->7C
C->6J
C->8L
E->0K
L->0C
B->9C
E->2S
L->6I
I->0L
J->0I
B->2I
I->3B
H->1C
I->7F
C->4H
F->1I
G->4I
I->0G
C->3G
F->8C
D->0A
E->3A
I->9H
A->7D
C->2F
H->7I
A->8E
F->9D
E->8F
A->6C
D->6G
G->0E
D->5F
E->9G
H->2D
D->7H
H->3E
I->2A
K->3I
C->9S
C->7K
E->4B
D->1B
L->1D
J->9E
I->1S
E->1L
J->8D
D->9J
L->2E
J->3L
B->5L
B->8B
L->7J
L->9L
G->1F
A->4A
K->5K
B->3J
H->6H
E->7E
J->1J
D->4E
G->2G
J->6B
D->3D
E->6D
H->4F
I->4C
C->5I
F->0H
H->5G
K->7S
G->3H
L->5H
H->8J
A->3S
H->0B
B->1H
G->7L
K->8A
F->2J
F->7B
L->4G
F->4L
A->1K
B->0G
G->5J
L->3F
Затем, в зависимости от того, как вы решите «запустить» его, он выдаст «да» или «нет».
Не серьезная запись, просто веселье;)
РЕДАКТИРОВАТЬ:
Возможно, я должен объяснить немного.
Грамматика является набором правил (производства) , которые определяют язык . Язык можно рассматривать как все возможные строки, образованные алфавитом, которые соответствуют правилам его грамматики.
Здесь алфавит - это набор всех десятичных цифр. Правила грамматики заключаются в том, что все строки должны образовывать десятичные целые числа, которые делятся на 13.
Мы можем использовать приведенную выше грамматику, чтобы проверить, принадлежит ли строка нашему языку.
Правила грамматики содержат терминальные символы (которые являются элементами языка), а также нетерминальные символы, которые заменяются рекурсивно.
Проще объяснить, что происходит на примере:
Скажем, например, что тестируемая строка - 71955.
Всегда есть начальный символ (который не является терминальным), в случае грамматики выше это 'S'. На данный момент мы не прочитали никаких символов из нашей строки:
current pattern symbol read
S ε
Теперь мы читаем первый символ в нашей строке, который равен '7', затем мы ищем правило в грамматике, которое имеет любой из нетерминалов в нашем текущем шаблоне в левой части '->', и это имеет наш символ в правой части '->'. К счастью, есть один (S-> 7G), поэтому мы заменяем нетерминальные символы в нашем текущем паттерне правой частью нового правила:
current pattern symbol read
7G 7
Теперь у нас есть нетерминальная буква «G» в нашем шаблоне, и следующий символ, который нужно прочитать, это «1», поэтому мы ищем правило в нашей грамматике, которое начинается с «G-> 1». Мы находим, что есть один (G-> 1F), поэтому мы заменим нетерминал RHS нашего нового правила:
current pattern symbol read
71F 1
Продолжайте повторять этот процесс:
Следующее правило: F-> 9D
current pattern symbol read
719D 9
Следующее правило: D-> 5F
current pattern symbol read
7195F 5
Следующее правило: F-> 5S
current pattern symbol read
71955S 5
На данный момент у нас больше нет символов в нашей строке, но у нас есть еще один нетерминальный символ там. Из первого правила в грамматике мы видим, что мы можем заменить 'S' пустой строкой (ε): S-> ε
Это дает нам текущую скороговорку: 71955ε, что эквивалентно 71955.
Мы прочитали все символы в нашей строке, и шаблон не содержит нетерминальных символов. Это означает, что строка принадлежит языку и, следовательно, 71955 фактически делится на 13.
Т.е. цель состоит в том, чтобы pattern = string. Если у вас остались какие-либо нетерминальные символы, после прочтения всех символов в вашей строке строка не принадлежит языку. Аналогично, если в вашей строке еще есть символы для чтения, но в грамматике нет правил, позволяющих вам двигаться вперед, тогда строка не принадлежит языку.