Задача: во входном потоке дается число - количество предложений, содержащих слова и, возможно, какой-то разделяющий мусор; после числа на каждой строке расположены сами предложения; далее дается число - количество ключевых слов; после него на каждой строке расположены сами слова.
Нужно найти количество вхождений каждого ключевого слова в каждое предложение.
Определение слова:
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..<>;
Комментариев нет:
Отправить комментарий