- 論壇徽章:
- 6
|
本帖最后由 stanley_tam 于 2013-12-03 10:04 編輯
湊個(gè)熱鬧,這么多行,應(yīng)該能看得懂些把{:3_188:}- #!perl
- package Cut;
- use v5.12;
- use warnings;
- use Moose;
- use List::Util qw {max min sum};
- has 'sizes' => (
- is => 'rw',
- isa => 'ArrayRef',
- reader => 'get_sizes',
- writer => 'set_sizes',
- default => sub { [] },
- auto_deref => 1,
- required => 1,
- );
- has 'len' => (
- is => 'ro',
- isa => 'Num',
- reader => 'get_len',
- default => '10',
- required => 1,
- );
- sub min_cut_times {
- # not accurate....
- my ($self) = @_;
- my $max_size = max $self->get_sizes;
- return int ($self->get_len / $max_size);
- }
- sub max_cut_times {
- my ($self) = @_;
- my $max_size = min $self->get_sizes;
- return int ($self->get_len / $max_size);
- }
- sub possible_cut_times {
- my ($self) = @_;
- my $times_aref = [];
- my $pieces = @{$self->get_sizes};
- my $max_cut_times = $self->max_cut_times;
- my $min_cut_times = $self->min_cut_times;
- my $enumerate_max = join ',', 0 .. $max_cut_times;
- my $eval_str = '{$enumerate_max}:' x ($pieces-1) . '{$enumerate_max}';
- $eval_str = q{"} . $eval_str . q{"};
- my @possibles = glob eval $eval_str;
- for my $num (@possibles){
- my @nums = split /:/, $num;
- my $sum_of_nums = sum @nums;
- if ($sum_of_nums <= $max_cut_times and $sum_of_nums >= $min_cut_times) {
- push @{$times_aref}, \@nums;
- }
- }
- return $times_aref;
- }
- no Moose;
- 1;
- package main;
- use v5.12;
- use warnings;
- my $cut = Cut->new;
- # define your sizes here
- $cut->set_sizes([1.9, 2.5, 2.6]);
- my @sizes = $cut->get_sizes;
- my $times_aref = $cut->possible_cut_times;
- say join "\t", ('sum', 'remain', @sizes);
- for my $time_aref (@{$times_aref}){
- my $sum = 0;
- for my $i (0 .. $#sizes){
- $sum += $sizes[$i] * $time_aref->[$i];
- }
- if ($sum > 8.1 and $sum <= 10) {
- # body...
- my $remain = $cut->get_len - $sum;
- $remain = sprintf "%0.2f", $remain;
- say join "\t", ($sum, $remain, @{$time_aref});
- }
- }
- __END__
復(fù)制代碼 |
|