in reply to Re: Uninitialized warnings trouble
in thread Uninitialized warnings trouble

Fun little problem. Here's another entry in my "The only data structure needed is a multi-line string" collection.

#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11148831 use warnings; sub quarterturn { my $new = ''; $new .= "\n" while s/.$/ $new .= $&; '' /gem; return $new; } my $forest = do { local (@ARGV, $/) = 'input8.txt'; <> }; my $visible = ''; for ( 0 .. 3 ) { $visible |= $forest =~ s{(.)(?=(.*))}{ $2 =~ /[$1-9]/ ^ 1 }ger; $_ = quarterturn for $forest, $visible; } my $totalvisible = $visible =~ tr/1//; # count ones print "$forest\n$visible\ntotal visible: $totalvisible\n";

Replies are listed 'Best First'.
Re^3: Uninitialized warnings trouble
by rsFalse (Chaplain) on Dec 14, 2022 at 22:53 UTC
    Nice code of yours!

    I will share an alternative to your regex, which is longer and uses (?{ ... }), but avoids repeated lookahead:
    for ( 0 .. 3 ) { my $max; $visible |= $forest =~ s { ^ (?{ $max = -1; }) (*FAIL) | (\d) } { length( $1 > $max and $max = $1 ) }germx; $_ = quarterturn for $forest, $visible; }
Re^3: Uninitialized warnings trouble
by jwkrahn (Abbot) on Dec 14, 2022 at 07:45 UTC
    $new .= "\n" while s/.$/ $new .= $&; '' /gem;

    Did you test this?

    $ time perl -e' use Data::Dumper; $Data::Dumper::Useqq = 1; my $x = "123456789\n"; print Dumper $x; my $new = ""; $new .= "\n" while $x =~ s/.$/ $new .= $&; '' /gem; print Dumper $new; ' $VAR1 = "123456789\n"; Out of memory! real 1m54.230s user 0m3.216s sys 0m9.332s

    BTW, my system has 32GB of RAM     ouch!

    Sorry, my mistake was leaving in the single quotes, oops.