[Tokyo.pm] today's one-liner quiz

scozens @ pwj.co.jp scozens @ pwj.co.jp
2000年 2月 8日 (火) 21:23:44 CST





カズンズです。

M: perl -l040e 'for($_="x"x shift,s/././;/x/;s/($x)./$1./g){print
length($x=$`)+1}' 100
S: perl -l040e 'for($_="x"x shift,s/././;/x/;s/($`)./$1./g){print
length($`)+1}' 100

Regexpについて、最近 Text::Balanced のような bracket matchingをしたかった
。こういうことが
かいてしまいました:

sub p {my $b=1;$_=shift;s{(?{$b=1}){((?:(?:{(?{$b++}))+|(?:}(?{--$b}))+|
(?(?{$b}).))+)}}{"OPEN (".(1+$b).") {".p($1)." } (".(1+$b).") CLOSE"}sexg;
return $_; }

print p(<<EOF);
    do {
        if (&foo) {
            bar;
        } else {
            baz;
        }
    }
EOF

難しい?もう少しゆっくりにしましょう:

sub p {my $b=1;$_=shift;
s{(?{$b=1}) # Initialise $b
     {                       # Match `{'
     (                       # Keep everything between {}
     (?:                     # Either
          (?:{             # Match another {
               (?{$b++}) # (Increment counter)
          )+
     |                       # Or
          (?:}             # Match a }
               (?{--$b}) # Decrement counter
          )+
     |
          (?(?{$b}).)      # Stop if necessary, or match anything
     )+
     )
     }
}{                             # Replace with:
     "OPEN (".(1+$b).") {".  # Commented version
     p($1).                  # Recurse!
     " } (".(1+$b).") CLOSE"
}sexg;
return $_; }

素数のあと、行列は?このregexpは3x3の行列のreflectionとrotationを全部見つけ
ています:
my @magic; my $pat="(.)"x9; # You are not expected to understand this.
my
$magic="147258369321654987369258147741852963789456123963852741987654321";
push @magic,'"$'.(join '$',split //,substr($magic,0,9,"")).'"' while
$magic;

sub display { my $matrix = shift; $matrix=~s/(.)/$1 /g;
    print substr($matrix,0,6,"")."\n" while $matrix;
    print "\n";
}

$matrix = "abcdefghi"; display($matrix);
for (@magic) {
    my $reflection = $matrix;
    $reflection=~s/$pat/$_/ee;
    display($reflection);
}

お楽しみに。

Simon

--
Just Another Perl Hacker





Tokyo-pm メーリングリストの案内