X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=ypp-restock-rum;h=3d9eb21e25da7f6899d21e792143c625681ef8f9;hp=ce76aa794d8eeb11189b0c5d4a8a8e05df829e6f;hb=5d464fa9b2f9af36a87b84b2dda0175ab4d78501;hpb=ed817cf1be071a52992d8dd9fabc2437472d8085 diff --git a/ypp-restock-rum b/ypp-restock-rum index ce76aa7..3d9eb21 100755 --- a/ypp-restock-rum +++ b/ypp-restock-rum @@ -14,15 +14,20 @@ where is price [] Each of which may appear only once, except \`have' which may appear -more than once which case we calculate the differences and the profit -for each one. - -If / is not specified at all, relevant information about shot is -not reported. For have and want, specifying an empty string means -zero. Entirely Missing // is taken as if both were -specified and zero. - -In price, missing entries mean the commodity is unavailable. +more than once which case we calculate the financial implications +at each stage. + +Missing entries count as zero (and zeroes are not displayed in the output). +In price, \`x' means the commodity is unavailable. + +The intended use is that at the start of the pillage you run: + ypp-restock-rum have ... want ... +to check that stocks are sufficient, or perhaps: + ypp-restock-rum have ... want ... price ... +if you want to stock up some more. At the end of the pillage, +run the same thing again with some extra parameters: + ypp-restock-rum have .. want ... have ... price ... +and it will tell you how you did and what the restock should be like. END ; @@ -35,7 +40,7 @@ sub parse_info ($$$\@$) { badusage("$what: specified more than once") if defined $storeary->[2]; my (@v) = (); - while (@ARGV and $ARGV[0] =~ m/^\d/) { + while (@ARGV and $ARGV[0] =~ m/^\d|^x$/) { $_ = shift @ARGV; push @v, $_; } @@ -53,13 +58,17 @@ sub parse_info ($$$\@$) { push @v, $default; } if (@v != 4) { - badusage("$what: invalid syntax (wrong number of /s)"); + badusage("$what: invalid syntax (wrong number of parameters)"); } my $i=0; foreach $_ (@v) { - $_ = $default if !length; - m/^0*(\d+)$/ or badusage("$what: $kinds[$i] \`$_': bad syntax"); - $_= $1; + if ($default>0 and m/^x$/) { + $_ = $default; + } elsif (m/^0*(\d+)$/) { + $_= $1; + } else { + badusage("$what: $kinds[$i] \`$_': bad syntax"); + } $i++; } @$storeary = @v; @@ -75,7 +84,7 @@ sub parse_args () { parse_info(1,0,1, @{ $have[@have] }, 'have'); } elsif (m/^want$/) { parse_info(1,0,0, @want, 'want'); - } elsif (m/^price$/) { + } elsif (m/^prices?$|^costs?$/) { parse_info(0,1e7,0, @price, 'price'); } else { badusage("unknown information argument \`$_'"); @@ -193,9 +202,14 @@ sub pr1s ($) { sub compute_stock_values() { return unless @have; - print <1 ? <[3]; + print ' ' if @have==1; + printf "%6s", $stocks->[3] ? $stocks->[3] : ''; pr1s($shot_value); pr1s($total_value); @@ -223,21 +239,13 @@ END $last_value= $total_value; print "\n"; } - print <1; + print "\n"; } sub pr2 ($$$) { my ($k,$v1,$v2) = @_; - printf "%-20s %-23s %s\n", "$k:", $v1, $v2; -} - -sub pr3 ($$$$) { - my ($k,$v1,$v2,$v3) = @_; - printf "%-20s %-23s %-20s %s\n", "$k:", $v1, $v2, $v3; + printf "%-25s %-23s %s\n", "$k:", $v1, $v2; } sub pr2rs ($$$) { @@ -269,21 +277,34 @@ sub compute_restock_requirements () { if (@price) { my ($rum_buy,$shot_buy) = ('',''); my ($rum_bill,$shot_bill) = qw(0 0); - if (defined $best and $rum_need > 0) { - my $rum_qty= $rum_need * 100 / $proofs[$best]; - $rum_qty= ceil($rum_qty); - $rum_buy= sprintf('%12s %-11s ',"** $rum_qty","$kinds[$best] **"); - $rum_bill= $rum_qty * $price[$best]; + my $ok=1; + if ($rum_need > 0) { + if (defined $best) { + my $rum_qty= $rum_need * 100 / $proofs[$best]; + $rum_qty= ceil($rum_qty); + $rum_buy= sprintf('%12s %-11s ', + "** $rum_qty","$kinds[$best] **"); + $rum_bill= $rum_qty * $price[$best]; + } else { + $rum_buy= ' (rum unavailable)'; + $ok= 0; + } } - if ($shot_need > 0 and valid($price[3])) { - $shot_buy= sprintf('%7s shot **', "** $shot_need"); - $shot_bill= $shot_need * $price[3]; + if ($shot_need > 0) { + if (valid($price[3])) { + $shot_buy= sprintf('%7s shot **', "** $shot_need"); + $shot_bill= $shot_need * $price[3]; + } else { + $shot_buy= ' (shot unavailable)'; + $ok= 0; + } } if (length($rum_buy) or length($shot_buy)) { - pr3('for', + pr2($ok + ? sprintf('for a total of %d poe', $rum_bill + $shot_bill) + : 'for', $rum_bill ? sprintf("%12d poe ", $rum_bill) : '', - $shot_bill ? sprintf("%10d poe", $shot_bill) : '', - sprintf("%7d total", $rum_bill + $shot_bill)); + $shot_bill ? sprintf("%10d poe", $shot_bill) : ''); pr2('BUY', $rum_buy, $shot_buy); } else { print "stocks are sufficient.\n"; @@ -298,38 +319,5 @@ compute_cheapest_rum(); compute_stock_values(); compute_restock_requirements(); -__DATA__ - -# if (defined $price{Swill}) { -# map { $price{$_}= undef if $price{$_} eq 'x' } @rums; -# } -# if (defined $have{Swill}) { -# $have_proof= 0; -# map { $have_proof += $have{$_} * $proof{$_} } @rums; -# } - -our ($best); - -our $have_proof; - -our ($need_proof, %need, %buy); - - -sub compute_restock_cheapest_rum() { - my %bill; - map { - $bill{$_} = $buy{$_} * $price{$_} if defined $price{$_}; - } @rums; - prf('nominal bill', %bill, 'poe'); - print "\n"; - if ($need_proof < 0) { - printf "stocks are sufficient"; - } else { - my $buy= ceil($buy{$best}); - printf "buy %d %s at %d poe each for %d poe", - $buy, $best, $price{$best}, $buy * $price{$best}; - } - print "\n\n"; -} - -main(); +STDOUT->error and die $!; +close STDOUT or die $!;