aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Mochan <mochan@fis.unam.mx>2021-12-28 18:29:12 -0600
committerLuis Mochan <mochan@fis.unam.mx>2021-12-28 18:29:12 -0600
commit674bf026e245a455b8fc923b40a9f08a2ce1fbd0 (patch)
tree63387dca6a678316bbbb6074d0435ed152ca1787
parent75fc94618c6390ef3afc87d2b5c8bcfe4584d59c (diff)
downloadperlweeklychallenge-club-674bf026e245a455b8fc923b40a9f08a2ce1fbd0.tar.gz
perlweeklychallenge-club-674bf026e245a455b8fc923b40a9f08a2ce1fbd0.tar.bz2
perlweeklychallenge-club-674bf026e245a455b8fc923b40a9f08a2ce1fbd0.zip
Fix mistake in algorithm
-rwxr-xr-xchallenge-145/wlmb/perl/ch-2.pl19
1 files changed, 11 insertions, 8 deletions
diff --git a/challenge-145/wlmb/perl/ch-2.pl b/challenge-145/wlmb/perl/ch-2.pl
index 52bca78943..4b0d431cb1 100755
--- a/challenge-145/wlmb/perl/ch-2.pl
+++ b/challenge-145/wlmb/perl/ch-2.pl
@@ -18,7 +18,7 @@ foreach(@ARGV){
$root={size=>0, edges=>{}};
$current=$root;
$_->{suffix}=$imaginary_root foreach($root, $imaginary_root);
- @letters=grep {!/[[:punct]|\s/} split '', lc $_; #ignore spaces and case
+ @letters=grep {!/\s/} split '', lc $_; #ignore spaces and case
foreach(0..@letters-1){
add_letter($_);
}
@@ -26,7 +26,8 @@ foreach(@ARGV){
palindromes($imaginary_root->{edges}->{$_}, $_, $output)
foreach keys $imaginary_root->{edges}->%*;
palindromes($root, "", $output);
- say "Input: $_\nOutput: ", wrap("", " ", join ", ", sort {$a cmp $b} $output->@*);
+ say "Input: $_\nOutput: ", wrap("", " ",
+ join ", ", sort {length $a <=> length $b or $a cmp $b} $output->@*);
}
sub add_letter {
my $index=shift;
@@ -34,13 +35,15 @@ sub add_letter {
$current=$current->{suffix}
while $index-$current->{size}-1<0
|| $letters[$index-$current->{size}-1] ne $letter;
- $current=$current->{edges}{$letter}, return if defined $current->{edges}{letter};
- my $suffix=$current;
- $current=$current->{edges}->{$letter}={size=>$current->{size}+2, edges=>{}};
+ $current=$current->{edges}{$letter}, return
+ if defined $current->{edges}{$letter};
+ my $suffix=$current->{suffix};
+ $current=$current->{edges}->{$letter}
+ ={size=>$current->{size}+2, edges=>{}};
$current->{suffix}=$root, return if $current->{size}==1;
- $suffix=$suffix->{suffix} while $letters[$index-$suffix->{size}-1] ne $letter;
- $suffix=$suffix->{edges}->{$letter} if $suffix->{size}==-1;
- $current->{suffix}=$suffix;
+ $suffix=$suffix->{suffix}
+ while $letters[$index-$suffix->{size}-1] ne $letter;
+ $current->{suffix}=$suffix->{edges}->{$letter};
return;
}