Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Количество вхождений каждого слова в каждое предложение

Задача: во входном потоке дается число - количество предложений, содержащих слова и, возможно, какой-то разделяющий мусор; после числа на каждой строке расположены сами предложения; далее дается число - количество ключевых слов; после него на каждой строке расположены сами слова.
Нужно найти количество вхождений каждого ключевого слова в каждое предложение.
Определение слова:
A word made of a series of letters ( lower or upper ) or numerics or an underscore _ ( ascii value 95). We define a substring as follows. It is a part of a word. The given substring must be preceded and succeeded by letters or numerics or an underscore. A word will be surrounded by 1 or more occurrences of non-letter, non-numeric and non-underscore ( not an underscore ) characters - or the beginning or end of a line on one side.
Можно ли улучшить мой код? Сделать его короче и эффективнее по количеству операций. Может быть, при помощи функционального программирования можно сократить все это раза в два? Перл к этому располагает.
#!/usr/bin/perl use strict;
chomp(my $lines_count = <>); # read the number of centences my @words; for (1..$lines_count) { my $line = <>; push @words, split /[^\w]/, $line; }
my $pattern_count = <>; for (1..$pattern_count) { chomp(my $input = <>); my $result = 0; foreach (@words) { if (/\w+$input\w+/) { $result++; } } print $result, "
"; }
Sample Input 1 existing pessimist optimist this is 1 is Sample Output 3 Explanation 'existing' has 'is' as a substring and is both preceded and succeeded by words as defined above. 'pessimist' has 'is' as a substring for the same argument as above. 'optimist' has 'is' as a substring for the same argument as above. 'this' though has 'is' as a substring is only preceded by a word and is succeeded by a [blank space] which is non-letter, non-numeric and non-underscore
'is' is not included as it is preceded and succeeded by a [blank space] which is non-letter, non-numeric and non-underscore.


Ответ

#!/usr/bin/perl use strict; chomp(my $lines_count = <>); # read the number of centences my $text=""; $text.=<> for (1..$lines_count); # Собираем весь входной текст в единую строку my $pattern_count = <>; for (1..$pattern_count) { chomp(my $input = <>); print $text=~s/(\w$input\w)/$1/g, "
"; }
Главная строчка это конечно print. В нем мы делаем замену подходящих участков текста на саму себя. Оператор замены =~s/// возвращает количество произведенных замен, таким образом он возвращает как раз количество мест, где встретилась подстрока.
В принципе можно еще сильнее укоротить, но смысл написанного начинает ускользать ...:
#!/usr/bin/perl use strict; my $text=join('',map {$_=<>} 1..<>); print map {chomp($_=<>); $text=~s/\w$_\w/$&/g, "
"} 1..<>;

Комментариев нет:

Отправить комментарий