use strict; use warnings; use PDL; sub turn_tables { my ( $pdl, $dir ) = @_; # dir = 0 => cw # 1 => ccw my @s = ( undef, map $pdl-> slice( "X, X, $_" ), 1 .. 3 ); my @a = $dir ? ( 1, 2, 3 ) : ( 3, 2, 1 ); $s[ $a[0]] .= $s[ $a[0]]-> copy -> transpose-> slice( '-1:0, X' ); # 90 $s[ $a[1]] .= $s[ $a[1]]-> copy -> slice( '-1:0, -1:0' ); # 180 $s[ $a[2]] .= $s[ $a[2]]-> copy -> slice( '-1:0, X' )-> transpose; # 270 } my $trees = 1 + rcols *DATA, { COLSEP => qr//, KEEP => qr/^\d+$/ }, []; my $size = max shape $trees; $trees-> reshape(( $size ) x 2 ); my $SLTM = identity( $size ) -> cumusumover -> xor( identity $size ) -> transpose; my $t4 = $trees-> dummy( -1, 4 )-> copy; turn_tables( $t4 ); my $cummax = maxover $SLTM * $t4-> dummy( 1 ); my $seen = $t4 > $cummax; turn_tables( $seen, 1 ); print $seen-> mv( -1, 0 )-> orover-> sum; __END__ 002100030222341303232115221524311502200403234452204125251345024423544443305142410110142101223120110 ... skipped, see 11148843