[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 メーリングリストの案内