diff --git a/auctionsim/summary.go b/auctionsim/summary.go index 2cdb311..1dae414 100644 --- a/auctionsim/summary.go +++ b/auctionsim/summary.go @@ -48,7 +48,9 @@ type ResultSummary struct { ValueDelta float64 /** * The rank of the bidder who actually had the highest value of the item. - * The winner of the auction has rank 1. + * The winner of the auction has rank 1. If all bidders had a true value of + * negative infinity for the item, this will be greater than the number of + * bidders. */ HighestValueRank int } @@ -73,7 +75,7 @@ func Summarize(price float64, allBidders []Bidder) *ResultSummary { } winner := allBidders[len(allBidders)-1] - rube := Bidder{} + rube := Bidder{Value: math.Inf(-1)} if maxIdx >= 0 { rube = allBidders[maxIdx] } diff --git a/main/main.go b/main/main.go index 993621d..d5fb960 100644 --- a/main/main.go +++ b/main/main.go @@ -32,54 +32,30 @@ func main() { log.Fatalf("can't run an auction with %d bidders", num) } - price, allBidders := auctionsim.RunAuctionVerbosely( + result := auctionSim.Summarize(auctionsim.RunAuctionVerbosely( &auctionsim.CappedBidderGenerator{ G: auctionsim.NormalestBidderGenerator(), Lim: num, }, - ) - bidder := allBidders[len(allBidders)-1] - - fmt.Printf("The auction winner paid ¤%f. They have %s.\n", price, deltaStr(bidder.Value-price)) - fmt.Printf("The item was worth ¤%f to them.\n", bidder.Value) - fmt.Printf("They would have paid up to ¤%f for it.\n", bidder.BidCeiling()) + )) + fmt.Printf("The auction winner paid ¤%f. They have %s.\n", summary.Price, deltaStr(summary.WinnerProfit)) + fmt.Printf("The item was worth ¤%f to them.\n", summary.WinnerValue) + fmt.Printf("They would have paid up to ¤%f for it.\n", summary.WinnerMaxBid) fmt.Println() - i := len(allBidders) - 2 - for i >= 0 && allBidders[i].Value < price { - i-- - } - - if i < 0 { - fmt.Printf("The item was not worth that to anybody.\n") + if summary.LosersWithRegrets < 1 { + fmt.Println("The item was not worth that to anybody.") } else { - rube := allBidders[i] - fmt.Printf("The highest bidder who would have made a profit at that price stopped bidding at ¤%f.\n", rube.BidCeiling()) - fmt.Printf("They should have kept bidding until ¤%f.\n", rube.Value) - if rankDelta := len(allBidders) - i - 1; rankDelta == 1 { - fmt.Println("They were outbid by 1 bidder.") - } else { - fmt.Printf("They were outbid by %d bidders.\n", rankDelta) - } - fmt.Printf("If they had paid the amount of the winning bid, they would have %s.\n", deltaStr(rube.Value-price)) + fmt.Printf("The item was worth that to %d bidders, who stopped bidding too soon.\n", summary.LosersWithRegrets) } fmt.Println() - maxValue := math.Inf(-1) - maxIdx := -1 - for i, b := range allBidders { - if b.Value > maxValue { - maxValue = b.Value - maxIdx = i - } - } - - if maxIdx == -1 { + if summary.HighestValueRank > summary.Bidders { fmt.Println("Wow! It was infinitely beyond worthless to everybody.") } else { - fmt.Printf("The bidder who would have gotten the most value was outbid by %d bidders.\n", len(allBidders)-maxIdx-1) - rube := allBidders[maxIdx] - fmt.Printf("The item was worth at most ¤%f to them. Their maximum bid was ¤%f.\n", rube.Value, rube.BidCeiling()) - fmt.Printf("If they had paid the winning bid, they would have %s.\n", deltaStr(rube.Value-price)) + fmt.Printf("The bidder who would have gotten the most value was outbid by %d bidders.\n", summary.HighestValueRank-1) + fmt.Printf("The item was worth at most ¤%f to them. Their maximum bid was ¤%f.\n", summary.HighestValue, summary.HighestValuatorBid) + fmt.Printf("If they had paid the winning bid, they would have %s.\n", deltaStr(summary.MissedProfit)) + fmt.Printf("They valued it ¤%f more than the winning bidder.\n", summary.ValueDelta) } }