#! perl -slw use strict; sub log10{ log( $_[0] ) / log( 10 ) } sub tape { my( $start, $end ) = @_; my $n = log10( $end ); my @lines = split '', $start; for my $p ( $start + 1 .. $end -1 ) { for my $l ( 0 .. $n ) { $lines[ $n - $l ] .= $p % 10**$l ? ' ' : substr int( $p / 10**$l ), -1; } } $lines[ $_ ] .= substr $end, $_, 1 for 0 .. length( $end ) -1; unshift @lines, '-' x ( $end - $start + 1 ); push @lines, '-' x ( $end - $start ); substr $lines[ -1 ], ( $end - $start ) / 2, 0, 'v'; return @lines; } print for tape( 170, 230 ); print for tape( 1970, 2030 ); print for tape( 39_999_963, 40_000_041 ); __END__ c:\test>712774.pl ------------------------------------------------------------- 1 2 2 7 8 9 0 1 2 3 0123456789012345678901234567890123456789012345678901234567890 ------------------------------v------------------------------ ------------------------------------------------------------- 1 2 2 9 0 0 7 8 9 0 1 2 3 0123456789012345678901234567890123456789012345678901234567890 ------------------------------v------------------------------ ------------------------------------------------------------------------------- 3 4 4 9 0 0 9 0 0 9 0 0 9 0 0 9 0 0 6 7 8 9 0 1 2 3 44 3456789012345678901234567890123456789012345678901234567890123456789012345678901 ---------------------------------------v---------------------------------------