Текст пока отсутствует.
Конструктор new
создаёт ссылку на двухэлементный
массив. Оба его элемента — ссылки на массивы слов — левый и правый:
Perlsub new() { return bless [[], []], shift; }
Метод copy
осуществляет глубокое копирование объекта.
Недостаточно скопировать в новый объект ссылки на левый и правый списки. Нужно
создать новые левый и правый списки и скопировать в них содержимое старых:
Perlsub copy() { my $self=shift; my $copy=Palindrome->new; @{$copy->[$_]}=@{$self->[$_]} for 0, 1; return $copy; }
Эти методы устроены довольно просто. Приводим их код без пояснений:
Perlsub totalWords() { my $self=shift; return @{$self->[0]}+@{$self->[1]}; } sub isPalindrome() { my $self=shift; my $string=join '', @{$self->[0]}, @{$self->[1]}; return $string eq reverse $string; } sub toString() { my $self=shift; return join ' ', @{$self->[0]}, @{$self->[1]}; }
Для вычисления качества палиндрома нужно поделить суммарную длину уникальных слов на общее количество слов. Для составления списка уникальных слов воспользуемся техникой, использующей ассоциативный массив. Каждое слово, встречающееся в палиндроме, используем в качестве ключа в ассоциативном массиве, увеличивая каждый раз соответствующее значение на единицу. В итоге получится ассоциативный массив, где ключами служат слова, а значениями — количества, в которых они представлены в палиндроме (эта информация нам не понадобится). Дальше всё просто:
Perlsub quality() { my $self=shift; my %words; $words{$_}++ for @{$self->[0]}, @{$self->[1]}; return (length join '', keys %words)/$self->totalWords; }