Longest palindromic substrings: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (→{{header|Raku}}: Add concurrency, useless for default, cuts pi digit time by nearly half) |
No edit summary |
||
Line 262: | Line 262: | ||
No palindromes of 2 or more letters found in "palindrome." |
No palindromes of 2 or more letters found in "palindrome." |
||
The longest palindromic substring of abaracadabra is: "ara" |
The longest palindromic substring of abaracadabra is: "ara" |
||
</pre> |
|||
=={{header|Perl}}== |
|||
The short one - find all palindromes with one regex. |
|||
<lang perl>#!/usr/bin/perl |
|||
use strict; # https://rosettacode.org/wiki/Longest_palindromic_substrings |
|||
use warnings; |
|||
print "Longest Palindrome For $_ = @{[ longestpalindrome($_) ]}\n" |
|||
for qw(babaccd rotator reverse forever several palindrome abaracadabra); |
|||
sub longestpalindrome |
|||
{ |
|||
my @best = {"''" => 0}; |
|||
pop =~ /(.+) .? (??{reverse $1}) (?{ $best[length $&]{$&}++ }) (*FAIL)/x; |
|||
keys %{pop @best}; |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
Longest Palindrome For babaccd = aba bab |
|||
Longest Palindrome For rotator = rotator |
|||
Longest Palindrome For reverse = rever |
|||
Longest Palindrome For forever = rever |
|||
Longest Palindrome For several = eve |
|||
Longest Palindrome For palindrome = '' |
|||
Longest Palindrome For abaracadabra = aba ara aca ada |
|||
</pre> |
|||
The faster one - does the million digits of Pi in under half a second. |
|||
<lang perl>#!/usr/bin/perl |
|||
use strict; # https://rosettacode.org/wiki/Longest_palindromic_substrings |
|||
use warnings; |
|||
#@ARGV = 'pi.dat'; # uncomment to use this file or add filename to command line |
|||
my $forward = lc do { local $/; @ARGV ? <> : <DATA> }; |
|||
$forward =~ s/\W+//g; |
|||
my $range = 10; |
|||
my $backward = reverse $forward; |
|||
my $length = length $forward; |
|||
my @best = {"''" => 0}; |
|||
my $len; |
|||
for my $i ( 1 .. $length - 2 ) |
|||
{ |
|||
do |
|||
{ |
|||
my $right = substr $forward, $i, $range; |
|||
my $left = substr $backward, $length - $i, $range; |
|||
( $right ^ $left ) =~ /^\0\0+/ and # evens |
|||
($len = 2 * length $&) >= $#best and |
|||
$best[ $len ]{substr $forward, $i - length $&, $len}++; |
|||
( $right ^ "\0" . $left ) =~ /^.(\0+)/ and # odds |
|||
($len = 1 + 2 * length $1) >= $#best and |
|||
$best[ $len ]{substr $forward, $i - length $1, $len}++; |
|||
} while $range < $#best and $range = $#best; |
|||
} |
|||
print "Longest Palindrome ($#best) : @{[ keys %{ $best[-1] } ]}\n"; |
|||
__DATA__ |
|||
this data borrowed from raku... |
|||
Never odd or even |
|||
Was it a car or a cat I saw? |
|||
Too bad I hid a boot |
|||
I, man, am regal - a German am I |
|||
toot |
|||
Warsaw was raw</lang> |
|||
{{out}} |
|||
<pre> |
|||
Longest Palindrome (27) : ootimanamregalagermanamitoo |
|||
</pre> |
</pre> |
||