$| = 1; my %marked = (); my @dir = ( [+2, 0], [-1,+1], [-1,-1] ); my $x = 0; my $y = 0; sub move { my $n = shift; my $dx = $dir[($n-1)%3][0]; my $dy = $dir[($n-1)%3][1]; $marked{$x,$y} = $n; my $steps = 0; while (exists $marked{$x,$y}) { $steps++; $x += $dx; $y += $dy; } return $steps; } foreach my $n (1..10_000) { my $a = move($n); print "$n $a\n"; }