Tree Summing

例の、最近流行った奴です。コードを短くする方向で盛り上がってましたけど、それとは違う方向性で。
匠の技的な正規表現で書けないかと考えています。
上のエントリで書いたように、PerlRuby正規表現では、再帰的な構造は扱えないので、PCREを使わないとダメです。PCREを使っているものというと、PHPPythonがあるのですが、私のcygwin環境には、Pythonが入っているので、こちらを使って考えてみようと思います。

      • -

ところで、本格的に取り掛かる手ならしとして、Perlでなんとなく書き下したコードが以下です。Cのソースとは、全然違うアプローチになっちゃいました。

#!/usr/bin/perl

$_ = join('',<stdin>);

s/\r|\n|\s//g;
s/\)(\d+)\(/)\n$1(/g;
s/\(\)//g;
while(s/\(([^()]+)\)/pTree($1)/eg){};
s/(.+)/judge($1)/eg;

print $_."\n";

sub pTree
{
	@lst = split(/\s+/,(shift));
	if($#lst == 0){
		return ' '.$lst[0];
	}else{
		$s = shift @lst;
		return ' '.join(' ',map {$_+$s} @lst);
	}
}

sub judge
{
	@lst = split(/\s+/,(shift));
	$s = shift @lst;
	@res = grep {$s==$_} @lst;
	return ($#res >= 0)?"yes":"no";
}