Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

inco 2019 wa 46: комментарии к ответам

1 view
Skip to first unread message

Ivan Shmakov

unread,
Nov 28, 2019, 11:07:34 PM11/28/19
to
[Оригинал — в news:relcom.comp.os.unix; копия — авторам ответов.]

Комментарии к ответам на вопросы (решениям задач) по курсу на
неделю 46 [1]. Получено в общей сложности 7 ответов: 5 на
варианты задания 1, 2 на варианты задания 2.

Оценки (в порядке уменьшения): 5 5 4 3 3 3 -.


[1] http://am-1.org/~ivan/inco-2019/wa/46.ru.xhtml

1. Регулярные выражения.

Строка начинается на произвольное (включая 0) количество
пробельных символов, за которыми следует одна или более цифр и
хотя бы один пробельный символ.

В решении почему-то напрочь отсутствуют /символы повторения/ (*,
\{\}, etc.) Очевидно, такое регулярное выражение не реализует
условие выше.

С другой стороны, используются \S, \d, \s — которые являются
распространенными расширениями, но, строго говоря, POSIX не
описываются.

Итог: 3.

Строка содержит хотя бы один символ из множества aeiou, но не
заканчивается ни на такой, ни на пробельный символы.

В решении оба регулярных выражения даны в контексте программы на
Awk. Однако, POSIX Awk всегда использует (вариант) ERE, и никогда
не BRE [2]. Кроме того, не использована обязательная в этом RE
форма «$» («конец строки»); список исключений [^…] (?) использован
неверно; форма (нечто){0} не имеет смысла.

Итог: 3.

[2] http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html

Строка не соответствует регулярному выражению ^$.

В ответе приведен верный анализ выражения ^$ — но /не/ приведено
требуемого заданием регулярного выражения, реализующего данное
условие («строка не соответствует выражению ^$».)

Итог: 3.

Строка начинается с целого положительного числа в десятичной
записи, за которым следует запятая и произвольное (включая 0)
количество произвольных символов.

В решении ошибочно заявлено, что нет различий между BRE и ERE.
Однако, символ «+» является особым только в ERE; в BRE, напротив,
он понимается буквально [3], и вместо него следует использовать
\{1,\}.

Кроме того, решение буквально реализует критерий «произвольное
количество произвольных символов» из задания — что неоптимально.
На самом деле, регулярному выражению «,.*» соответствуют ровно
те же строки, что и более простому «,».

Итог: 4.

[3] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_03

Строка начинается с косой черты (/) и состоит исключительно из
разделенных ею же непустых алфавитноцифровых последовательностей
(например: /привет/мир.)

В тексте выше, точка после «мир» не является частью примера
(идет после элемента <code /> в документе.) В остальном — в
предложенных BRE, ERE ошибок не нахожу.

Итог: 5.

2. Преобразование текста.

Исходный текст: Целевой текст:

1571374521 wa/42.ru.xhtml wa/42.ru.xhtml
1571973477 wa/43.ru.xhtml wa/43.ru.xhtml
1573184146 wa/45.ru.xhtml wa/45.ru.xhtml

В предложенном решении, команда echo $varname сформирует
единственную строку текста (если не менять IFS — чего сделано
не было) — при требуемых выше трех.

Тем не менее, команда GNU Sed применена верно. (Хотя на зачете
мне бы хотелось видеть POSIX Sed.)

Итог: 5.

Исходный текст: Целевой текст:

<ol> <ol>
<li><p>Привет, мир!</p></li> <li ><p >Привет, мир!</p></li>
</ol> </ol>

В задании требуется расставить определенным образом пробелы
в открывающих тегах XML (для улучшения читаемости кода.)

Особенность здесь в том, что соответствующее POSIX RE обязательно
«захватит» текст, следующий за тегом — которым, в свою очередь,
может оказаться еще один открывающий тег — <li>< → <li >< — который,
тем самым, «потеряется» для следующей итерации s///g.

Решение — повторить команду s///g дважды. (Или использовать
PCRE — где они доступны.)

В предложенном решении сделана попытка извлечь содержимое
элемента — что во-первых не соответствует заданию; во-вторых
— задача куда как более сложная (поскольку элемент XML может
занимать более одной строки — что, по-видимому, придется
учитывать в Sed-коде явно); в-третьих — задачу извлечения
предложенный код тоже не решает.

Итог: не зачтено.

--
FSF associate member #7257 http://am-1.org/~ivan/
0 new messages