Matt Owen

source code for "files/pe/pe_033.pl"

return to portfolio
  1.  #!/usr/bin/perl
  2.  
  3.  use strict;
  4.  use warnings;
  5.  
  6.  
  7.  # compute gcd
  8.  sub gcd {
  9.   my ($down, $up) = sort { $a <=> $b } (shift, shift);
  10.   my $r;
  11.   do {
  12.   return $up if not $down;
  13.   $r = $up % $down;
  14.   $up = $down;
  15.   $down = $r;
  16.   } while ($r);
  17.   return $up;
  18.  }
  19.  
  20.  
  21.  # reduce
  22.  sub reduce {
  23.   my ($n, $d) = (shift, shift);
  24.   my $gcd = gcd($n, $d);
  25.   return ($n, $d) if not $gcd;
  26.   return ($n/$gcd, $d/$gcd);
  27.  }
  28.  
  29.  
  30.  # remove common digit
  31.  sub remove_common_digit {
  32.   my ($down, $up) = sort { $a <=> $b } (shift, shift);
  33.   my @down = split //, $down;
  34.   my @up = split //, $up;
  35.  
  36.   for (0..int @down -1) {
  37.   my $n = index $up, $down[$_];
  38.   return ($down[($_+1)%2], $up[($n+1)%int @up]) if $n != -1;
  39.   }
  40.  
  41.   return (0,0);
  42.  }
  43.  
  44.  
  45.  # store good ones
  46.  my ($big_n, $big_d) = (1, 1);
  47.  
  48.  
  49.  # work
  50.  for my $n (10..99) {
  51.   for my $d ($n+1..99) {
  52.   next if $n%10 == 0 && $d % 10 == 0;
  53.   next if gcd($n, $d) == 1;
  54.  
  55.   my $left = join '/', reduce $n, $d;
  56.   my $right = join '/', reduce remove_common_digit($n, $d);
  57.  
  58.   print "$n/$d -> $left -> $right\n" if $left eq $right;
  59.   ($big_n, $big_d) = ($big_n*$n, $big_d*$d) if $left eq $right;
  60.   }
  61.  }
  62.  
  63.  
  64.  #
  65.  print join(' ', reduce ($big_n, $big_d)); # answer after space