Longest palindromic substrings: Difference between revisions

no edit summary
(→‎{{header|Raku}}: Add concurrency, useless for default, cuts pi digit time by nearly half)
No edit summary
Line 262:
No palindromes of 2 or more letters found in "palindrome."
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>
 
Anonymous user