use strict; for my $n (1..1000000) { #for my $n (1000..1090) { my $candidate = palindrome($n); print "$n: $candidate\n"; }; use strict; sub palindrome { my ($n) = @_; my $l = int ((length $n) / 2); $n =~ /^(\d{$l})(.?)(\d{$l})$/ or return $n; my ($left,$middle,$right) = ($1,$2,$3); my @parts = map { ($left ? $left + $_ : "") . $middle . ($left ? reverse $left + $_ : "") } (-1, 0, 1); for (@parts) { die "$n: $_ is no palindrome" if $_ ne reverse $_; }; my $result = $parts[0]; for (@parts) { $result = $_ if abs($n - $_) < abs($n - $result); }; die "$n: $result is no palindrome" if $result ne reverse $result; return $result };