2008-05-07

もっといいアルゴリズムないかなあ

@oo[2, 5, 8, 11] = (' ', ' ', ' ', ' ');
$xx[5] = ' ';
for($s=4; $s < 201; $s++){
	for($i = 2; $i <= ($s+1) / 2; $i++){
		next if $i == 3;
		$j = $s - $i;
		&amp;test_base($i, $j);
		&amp;test_base($j, $i) if $i <=> $j;
	}
	print "$s\[$oo[$s]]\n" if $oo[$s] ne '';
	$min = length $oo[$s] || 999;
	if($ox[$s] ne '' and length $ox[$s] < $min){
		print "$s\[$ox[$s]>\n";
		$min = length $ox[$s];
	}if($xo[$s] ne '' and length $xo[$s] < $min){
		print "$s<$ox[$s]]\n";
		$min = length $xo[$s];
	}if($xx[$s] ne '' and length $xx[$s] < $min){
		print "$s<$xx[$s]>\n";
	}
}
sub test_base{
	my ($i, $j);
	($i, $j) = @_;
	if($oo[$i] ne ''){
		&amp;test($oo[$i], $oo[$j], \$oo[$s]);
		&amp;test($oo[$i], $xo[$j], \$oo[$s]);
		&amp;test($oo[$i], $ox[$j], \$ox[$s]);
		&amp;test($oo[$i], $xx[$j], \$ox[$s]);
	}if($ox[$i] ne ''){
		&amp;test($ox[$i], $oo[$j], \$oo[$s]);
		&amp;test($ox[$i], $ox[$j], \$ox[$s]);
	}if($xo[$i] ne ''){
		&amp;test($xo[$i], $oo[$j], \$xo[$s]);
		&amp;test($xo[$i], $xo[$j], \$xo[$s]);
		&amp;test($xo[$i], $ox[$j], \$xx[$s]);
		&amp;test($xo[$i], $xx[$j], \$xx[$s]);
	}if($xx[$i] ne ''){
		&amp;test($xx[$i], $oo[$j], \$xo[$s]);
		&amp;test($xx[$i], $ox[$j], \$xx[$s]);
	}
}

sub test{
	return if $_[1] eq '';
	my($a, $b, $c, $tmp);
	($a, $b, $c) = @_;
	$tmp = "$a$b";
	${$c} = $tmp if ${$c} eq '' or (length $tmp) < (length ${$c});
	return;
}
  • アルゴリズムはそれで良いと思うが実装はまだまだ綺麗に書けるし高速化もできる。

    • 十分なお礼ができないから独学でがんばるか http://anond.hatelabo.jp/20080508000230

  • なにしようとしているのかさっぱりわからね。 つーか、ぐねぐねしてて…なんかperlって感じ。 for($i = 2; $i &lt;= ($s+1) / 2; $i++){ 単純なはなしだけど、ループの中で計算させないほうがい...

    • 任意ドット幅の空白を少ないバイト数で生成したい。&ensp;は2ドット以下略。しかし特殊ルールがあって、半角空白は連続できない。また行頭の空白も無視されることもあって、...

    • 全然perlっぽくないよ!! perl的にはforeach!map!and/or!って感じ。 別にperl的でなくてよいけどね。 気になった点 スコープが不明確。やっぱりmyは使うべき。 関数呼び出しに&はいら...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん