in reply to Difference between two arrays

There are a number of possibilities: a) The number could have been moved to the edge of the array
b) The number could have been swapped with the one next to it
c) The number could have been moved to some other random position

The problem is that you have to be able to test for all these and return the proper answer - preferably with a linear algorithm that does not require a hash. Here is my solution:

use strict; use warnings; my ($l, $r, $before, $after); $before = [qw(1 2 3 4 5 6 7 8 9 10)]; while (<DATA>) { chomp; $after = [split / /]; for ($l = 0; $before->[$l] == $after->[$l]; $l++) {} for ($r = $#$before; $before->[$r] == $after->[$r]; $r--) {} if ($l == $r - 1) { print "Either $after->[$l] moved to position $l, or $after->[$ +r] to position $r.\n"; } elsif ($before->[$l] == $after->[$l+1]) { print "$after->[$l] moved to position $l\n"; } else { print "$after->[$r] moved to position $r\n"; } } __DATA__ 10 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 10 1 1 10 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 1 10 1 2 3 4 5 6 8 7 9 10