Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 42

Без применения регулярных выражений

22.05.2018, 15:00. Показов 1506. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужна срочно помощь.Задание сделала,но преподователю не понравилось с формулировкой:-"Этого не было в нашей образовательной программе,сделай проще,убери регулярные ворожения".Программа работает.Нужно сделать проще,то есть,без применения регулярных выражений.Пожалуйста помогите....
Вот рабочая программа.


Pascal
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
var good, pattern: string; //good - строка с хорошими буквами, pattern - шаблон
    arr: array of string; //динамический массив строк
    n: integer;
 
begin
      readln(good); //вводим строку с хорошими буквами
      readln(pattern); //вводим шаблон
 
      pattern:=pattern.Replace('*', '[^'+good+']*'); //заменяем * на '[^хорошие буквы]*', 
                                                               //что означает символы не входящие в группу "хорошие буквы" могут повторяться 0 и более раз
      pattern:=pattern.Replace('?', '['+good+']{1}'); //заменяем ? на '[хорошие буквы]{1}', 
                                              //что означает символ входящий в группу "хорошие буквы" может повториться только 1 раз
      pattern:='^'+pattern+'$'; //добавляем обозначения начала и конца строки, 
                                          //это значит что полученный шаблон должен совпадать полностью от начала строки и до конца
                                         //writeln(reg);
 
      readln(n);             //вводим кол-во строк
      SetLength(arr, n); //задаем длину массива
 
for var i:=0 to n-1 do        //цикл от 0 (массив созданный через SetLength начинается с 0 и до n-1)
  readln(arr[i]);               //вводим строку
 
for var i:=0 to n-1 do            //цикл по массиву строк
  if Regex.IsMatch(arr[i], pattern) then        
    writeln('YES')         //выводим ДА
  else //иначе
    writeln('NO');        //выводим НЕТ
end.




Настали тяжелые времена. Сегодня Пете нужно набрать на экзамене по информатике 100 баллов. Все задачи на экзамене Пете кажутся простыми, но он боится, что не успеет сделать одну из них за такой маленький промежуток времени, поэтому он обратился к вам за помощью.

В условии даётся шаблон (строка, состоящая из строчных латинских букв, символов «?» и «*»). Известно, что символ «*» встречается в шаблоне не более одного раза.

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

Все было бы хорошо, но специальные символы в шаблоне в этой задаче действуют не так, как обычно!

Строка подходит под шаблон, если можно в шаблоне заменить каждый из символов «?» на одну хорошую строчную латинскую букву, а символ «*» (если он есть) — на любую, в том числе пустую, строку из плохих строчных латинских букв так, чтобы результат совпал со строкой.

В условии также даны буквы, считающиеся хорошими. Плохими являются все остальные буквы латинского алфавита.

Входные данные
В первой строке находится строка, содержащая от 1 до 26 различных строчных латинских букв. Это буквы, которые считаются в задаче хорошими. Все остальные буквы — плохие.

Во второй строке находится шаблон — строка s из строчных букв латинского алфавита, символов «?» и «*» (1 ≤ |s| ≤ 105). Гарантируется, что символ «*» встречается в s не более одного раза.

Во третьей строке находится целое число n (1 ≤ n ≤ 105) — количество строк-запросов.

Далее следуют n строк, в каждой из них находится по одной непустой строке, состоящей из строчных латинских букв — очередная строка-запрос.

Гарантируется, что сумма длин всех строк-запросов не превосходит 105.

Выходные данные
Выведите n строк: в i-й строке необходимо вывести «YES», если i-я строка-запрос удовлетворяет шаблону, и «NO» в противном случае.

Вы можете выводить каждую из букв в любом регистре.


Примеры
входные данные
ab
a?a
2
aaa
aab

выходные данные
YES
NO
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2018, 15:00
Ответы с готовыми решениями:

Переписать код без применения Break
есть программа но нам препод говорить что нельзя использовать Break как сделать без него??? var c, k, p: real; s, q, i, n, v:...

Найти сумму ряда без применения условного оператора
нужно найти сумму 2(2)+2(3)+2(4)+...+2(10) (x)<-степень ,БЕЗ ПРИМЕНЕНИЯ УСЛОВНОГО ОПЕРАТОРА

Проверка строки на соответствие определенному формату без применения регулярных выражений
Подскажите, пожалуйста, как проверить строку на соответствие определенному формату без применения регулярных выражений? К примеру, формат...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
22.05.2018, 16:58
Pascal
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
var
  s: array of string; // строка
  st: string; // шаблон
  good: set of char = ['a'];
  i, it, n: integer;
 
begin
  readln(st); // хорошие буквы, заносим в множество good
  foreach var ch in st do Include(good, ch);
  
  readln(st); // шаблон
  readln(n); // количество строк для проверки
  SetLength(s, n);
  for var curr := 0 to n - 1 do readln(s[i]); // читаем строки
  
  for var curr := 0 to n - 1 do 
  begin
    i := 1;it := 1;
    while (i <= Length(s)) and (it <= Length(st)) do
    begin
      if st[it] = '?' then // следующая буква шаблона - "?", ей должна соответствовать одна из хороших букв в строке
      begin
        if s[curr][i] in good then // в строке - хорошая буква, все нормально
        begin
          inc(i);inc(it);
        end
        else i := length(s[curr]) + 2; // нет, буква в строке плохая, выходим из цикла
      end
      else if st[it] = '*' then // следующий символ шаблона - '*',ей может соответствовать 0 или больше плохих букв
      begin
        // так что пропускаем плохие буквы, пока не встретится хорошая, или пока не дойдем до конца строки
        while (i < Length(s[curr])) and (s[curr][i] in ['a'..'z'] - good) do inc(i);
        inc(it);
      end
      // просто буква - проверяем на равенство две буквы
      else 
      begin
        if s[curr][i] = st[it] then // буквы равны - все нормально
        begin
          inc(i);inc(it);
        end
        else i := length(s[curr]) + 2; // нет - выходим из цикла
      end;
    end;
    // совпадение строки и шаблона - только в том случае, если индекс очередного символа
    // и там и там на 1 больше длины соответствующей строки (то есть, мы только что
    // закончили обрабатывать как строку, так и шаблон)
    if (i = length(s[curr]) + 1) and (it = length(st) + 1) then writeln('YES')
    else writeln('NO');
  end;
end.
По-моему, нигде не ошибся, писал прямо здесь, так что тестируй... Если что - говори, поправим
1
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 42
22.05.2018, 19:49  [ТС]
Спасибо вам большое за участие.Сейчас тестировала,пишет,что " Нельзя преобразовать тип char к TypedSet".
Миниатюры
Без применения регулярных выражений  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
22.05.2018, 20:13
Какая версия компилятора? Мой 3.3.5 (сборка 1660) прекрасно компилирует этот код:
Миниатюры
Без применения регулярных выражений  
0
0 / 0 / 0
Регистрация: 04.07.2016
Сообщений: 42
22.05.2018, 20:43  [ТС]
Скачала вашу версию.Заработала.Но когда ввела входные данные появилась другая проблема(
Миниатюры
Без применения регулярных выражений  
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33187 / 21484 / 8232
Регистрация: 22.10.2011
Сообщений: 36,863
Записей в блоге: 12
22.05.2018, 21:05
Лучший ответ Сообщение было отмечено Евгения Кравец как решение

Решение

Да, мелкие огрехи. Вот, что значит, без проверки. Вот так:
Pascal
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
var
  s: array of string; // строка
  st: string; // шаблон
  good: set of char = ['a'];
  i, it, n: integer;
 
begin
  readln(st); // хорошие буквы, заносим в множество good
  foreach var ch in st do Include(good, ch);
  
  readln(st); // шаблон
  readln(n); // количество строк для проверки
  SetLength(s, n);
  for var curr := 0 to n - 1 do readln(s[curr]); // читаем строки
  
  for var curr := 0 to n - 1 do 
  begin
    i := 1; it := 1;
    while (i <= Length(s[curr])) and (it <= Length(st)) do
    begin
      if st[it] = '?' then // следующая буква шаблона - "?", ей должна соответствовать одна из хороших букв в строке
      begin
        if s[curr][i] in good then // в строке - хорошая буква, все нормально
        begin
          inc(i);inc(it);
        end
        else 
        begin
          i := length(s[curr]) + 2; // нет, буква в строке плохая, выходим из цикла
        end;
      end
      else if st[it] = '*' then // следующий символ шаблона - '*',ей может соответствовать 0 или больше плохих букв
      begin
        // так что пропускаем плохие буквы, пока не встретится хорошая, или пока не дойдем до конца строки
        while (i < Length(s[curr])) and (s[curr][i] in (['a'..'z'] - good)) do inc(i);
        inc(it);
      end
      // просто буква - проверяем на равенство две буквы
      else 
      begin
        if s[curr][i] = st[it] then // буквы равны - все нормально
        begin
          inc(i);inc(it);
        end
        else 
        begin
          i := length(s[curr]) + 2; // нет - выходим из цикла
        end;
      end;
    end;
    // совпадение строки и шаблона - только в том случае, если индекс очередного символа
    // и там и там на 1 больше длины соответствующей строки (то есть, мы только что
    // закончили обрабатывать как строку, так и шаблон)
    if (i = length(s[curr]) + 1) and (it = length(st) + 1) then writeln('YES')
    else writeln('NO');
  end;
end.
на приведенном примере отрабатывает как положено.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2018, 21:05
Помогаю со студенческими работами здесь

Результат применения регулярных выражений преобразовать в массив
Как результат применения регулярных выражений преобразовать или записать в массив, если такое вообще возможно? Pattern pattern =...

Grep без регулярных выражений
пытаюсь написать аналог grep из Linux, имеется вот такой код: static void Main(string args) { string text =...

Разборка URL. без регулярных выражений
Необходимо разобрать URL. Используя только строчные функции PHP, а также функции работы с массивами. Регулярными выражениями пользоваться...

Вывести информацию в заданном формате без регулярных выражений
Задан vector&lt;string&gt; содержащий url. Например: std::vector&lt;std::string&gt; url; url.push_back(&quot;http://example.com/index.html&quot;); ...

Использование регулярных выражений
Доброе утро, подскажите пожалуйста, совсем запуталась. У меня есть модуль, нужно, чтобы внутри процедуры Заполнить выполнялись процедуры...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru