aboutsummaryrefslogtreecommitdiff
path: root/challenge-084/polettix/perl/ch-1.pl
blob: 8dfd26d25e9498de702f963daff05e81bf1b1001 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env perl
use 5.024;
use warnings;
use experimental qw< postderef signatures >;
no warnings qw< experimental::postderef experimental::signatures >;

sub reverse_integer ($N) {
   state $max_int = 0x7fffffff;
   my ($s, $x) = $N > 0
      ? ('', scalar reverse("$N"))
      : ('-', scalar reverse(''.(-$N)));
   $x =~ s{0+\z}{}mxs;
   my ($lx, $lm) = (length($x), length($max_int));
   return $s . $x
      if ($lx < $lm)
      || ($lx == $lm) && (substr($x, 0, 1) < 2);
   return 0
      if ($lx > $lm) # too long
      || substr($x, 0, 1) > 2; # highest digit too high
   # same length, first digit is 2...
   return $s
      ? ($x <= $max_int + 1 ? $s . $x : 0)
      : ($x <= $max_int     ?      $x : 0);
}

my $x = shift || -1234;
say reverse_integer($x);