Язык последовательностей 0 и 1 с разделителем посередине. Сумма чисел слева и справа от разделителя одинакова и не превышает 2. Мое: S={Счастливый билет} Правила:1 2)<цифра>:={0,1} 3)<Разделитель>:={|} Правильно ли заданы правила языка? задан 17 Ноя '14 23:57 Dashka64 |
Можно сделать, например, так: $%S\mapsto S\space S\vee 1A1\vee 0S\vee S0\vee 0|0$% $%A\mapsto 1B1\vee A0\vee 0A\vee |$% $%B\mapsto B0\vee 0B\vee |$% Тогда слева и справа от каждого штриха будет непусто, а единиц не более 2 и поровну. Вот только в качестве терминального символа обязательно нужен ещё и пробел, если я правильно понял. отвечен 18 Ноя '14 0:59 trongsund Спасибо!!!
(18 Ноя '14 1:21)
Dashka64
А для чего нужен пробел?
(22 Ноя '14 19:31)
Dashka64
Как я понял, в итоге нужно получить последовательность пар строк из 0 и 1, отделённых вертикальной чертой. Чтобы перейти к следующей паре, и нужен пробел (ну, в записи строки в условии есть пробелы).
(22 Ноя '14 23:32)
trongsund
|
А как у Вас при этом учитывается то, что единиц справа и слева одинаковое количество, и при этом не более двух? По-моему, при таких правилах войдёт много чего лишнего. Скажем, 11111|11111.
Получается, 0 и 1 выписывать в разные правила?
Тут нужно нечто типа счётчика единиц. Я бы сделал так, что при окружении S единицами происходит замена S на новый символ, а потом ещё раз на новый. Дальше окружать можно уже только нулями. Тут ещё существенно, разрешены ли вещи типа 100|00001, когда длина слева и справа не одинаковая. В условии это вроде как допускается, но в примерах длина везде одна и та же.