#! /usr/bin/perl -w use strict; use POSIX qw(ceil); sub elgon { my $string = shift; my @answers; my %char_hash = map { $_ => 1} split //, $string; foreach my $key (keys %char_hash) { my @appearances; for (my $i = 0; $i < length($string); $i++) { push (@appearances, $i) if substr($string, $i,+ 1) eq $key; } foreach my $start(@appearances) { foreach my $finish(reverse @appearances) { next if $start >= $finish; my $half_length = ceil(($finish - $start + 1) / 2); push @answers, substr($string , ($start) , ($finish - $start + 1) ) if substr($string, $start , $half_length) eq reverse substr ($string, ($finish - $half_length + 1), $half_length); } } } return "FAILED!" if ! scalar(@answers); my $longest = ""; map { $longest = $_ if length($longest) < length($_) } @answers; return $longest; }