|
Location : Home > Languages > Perl > Package Title : Math::TotalBuilder |
![]() |
Math::TotalBuilder -- 単位つきの量の計算
version 1.10
use Math::TotalBuilder;
my %lsd = ( pound => 240, shilling => 20, penny => 1 );
# 952 ペンスを変換
my %tender = build(\%lsd, 952);
# 3ポンド 21シリング 98ペニーでは全部でいくらになるか
my $wealth = total(\%lsd, { pound => 3, shilling => 21, penny => 98 });
# 18ポンド 6シリング 40ペニーの最も適切な表現は
my %moolah = build(\%lsd,
total (\%lsd, { pound => 18, shilling => 6, penny => 40 }));
本モジュールには単位つきの量を扱うための2つのサブルーチン build 及び total がある。固有の通貨単位をお金の量に変換したり、質量を標準的な重さの単位に変換したり、秒による時間差を時間単位の組に変換したり、またはその他の同様の計算を行うために用いられる。
build(\%pieces, $total, \@code)
my %nicetime = build (
{ days => 86400, hours => 3600, minutes => 60, seconds => 1 },
39102
);
本ルーチンは単位と全体量のハッシュを引数にとり、単位ごとの値を返す。もし総量を構成できない場合にはルーチンは総量を超えない範囲で最も近い構成を返す。特別な値 _remainder は不足量を示す。
本モジュールはナップサック問題を解かないし、解こうともしていない。微妙な問題を与えると失敗するかも知れない。例えば以下のような例がそうである。
my $difficult = build (
{ kroener => 30, talen => 7 },
49
);
# { talen => 7 } ではなく
# { kroener => 1, talen => 2, _remainder => 5 } を得る。
build に対する3つ目のオプショナルな引数は、 \%pieces 及び $total を引数とする coderef または coderef の配列への参照でなければならない。build はサブルーチンを用いて生成した結果を返す。coderef の配列参照が通れば build は各サブルーチンを通じて最も小さい残りを返す。
もし3つ目のオプションがなければ最も簡単なアルゴリズム &build_basic が採用されたとみなす。
build_basic(\%pieces, $total)
これは総量を計算するための基本的なアルゴリズムである。一番大きい単位が満たされれば次に大きい単位を満たすように計算し、値を使い尽くすまでこの作業を続けるものである。
total(\%pieces, \%set)
my $total = total(
{ ten => 10, five => 5, one => 1 },
{ ten => 2, five => 6 }
);
# 50 を返す。
%set で指定された単位と %pieces における定義に従って値を返す。
本モジュールはまだまだ使用に耐えない。さらに多くのエラー処理が必要である。
サブルーチンの名称は、単純な名前を充てているのでコンフリクトを避けるためにも将来的に変更されるかも知れない。(ただしその場合でもエクスポート可能なものとするだろう。)
Ricardo SIGNES, <rjbs@cpan.org>
Copyright (C) 2004, Ricardo SIGNES.
本ソフトウェアはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。
![]() |
Updated : 2006/10/17 |