X-Git-Url: http://git.scottworley.com/planeteer/blobdiff_plain/5a1593ab8a31d024658664769920cbd0d5438e34..5f1a50e1c7d4ae2908197673d5dbf948b3509a8f:/planeteer.go diff --git a/planeteer.go b/planeteer.go index 87c7448..bc47c3d 100644 --- a/planeteer.go +++ b/planeteer.go @@ -26,21 +26,20 @@ var datafile = flag.String("planet_data_file", "planet-data", "The file to read planet data from") type Commodity struct { - Name string BasePrice int CanSell bool Limit int } - +type Planet struct { + Name string + BeaconOn bool + /* Use relative prices rather than absolute prices because you + can get relative prices without traveling to each planet. */ + RelativePrices map [string] int +} type planet_data struct { - Commodities []Commodity - Planets []struct { - Name string - BeaconOn bool - /* Use relative prices rather than absolute prices because you - can get relative prices without traveling to each planet. */ - RelativePrices map [string] int - } + Commodities map [string] Commodity + Planets []Planet } func ReadData() (data planet_data) { @@ -56,44 +55,56 @@ func ReadData() (data planet_data) { return } +/* What is the value of hauling 'commodity' from 'from' to 'to'? + * Take into account the available funds and the available cargo space. */ func TradeValue(data planet_data, - from_index, to_index, commodity_index, quantity int) int { - - commodity := &data.Commodities[commodity_index] - if !commodity.CanSell { + from, to *Planet, + commodity string, + initial_funds, max_quantity int) int { + if !data.Commodities[commodity].CanSell { return 0 } - - from_planet := &data.Planets[from_index] - from_relative_price, from_available := from_planet.RelativePrices[commodity.Name] + from_relative_price, from_available := from.RelativePrices[commodity] if !from_available { return 0 } - - to_planet := &data.Planets[to_index] - to_relative_price, to_available := to_planet.RelativePrices[commodity.Name] + to_relative_price, to_available := to.RelativePrices[commodity] if !to_available { return 0 } - from_absolute_price := from_relative_price * commodity.BasePrice - to_absolute_price := to_relative_price * commodity.BasePrice + base_price := data.Commodities[commodity].BasePrice + from_absolute_price := from_relative_price * base_price + to_absolute_price := to_relative_price * base_price buy_price := from_absolute_price sell_price := int(float64(to_absolute_price) * 0.9) - return (sell_price - buy_price) * quantity - + var can_afford int = initial_funds / buy_price + quantity := can_afford + if quantity > max_quantity { + quantity = max_quantity + } + return (sell_price - buy_price) * max_quantity } -func FindBestTrades(data planet_data) [][]*Commodity { - best := make([][]*Commodity, len(data.Planets)) - for from_index := range data.Planets { - best[from_index] = make([]*Commodity, len(data.Planets)) - for to_index := range data.Planets { +func FindBestTrades(data planet_data) [][]string { + best := make([][]string, len(data.Planets)) + for from_index, from_planet := range data.Planets { + best[from_index] = make([]string, len(data.Planets)) + for to_index, to_planet := range data.Planets { best_gain := 0 - for commodity_index := range data.Commodities { - gain := TradeValue(data, from_index, to_index, commodity_index, 1) + price_list := from_planet.RelativePrices + if len(to_planet.RelativePrices) < len(from_planet.RelativePrices) { + price_list = to_planet.RelativePrices + } + for commodity := range price_list { + gain := TradeValue(data, + &from_planet, + &to_planet, + commodity, + 10000000, + 1) if gain > best_gain { - best[from_index][to_index] = &data.Commodities[commodity_index] + best[from_index][to_index] = commodity gain = best_gain } } @@ -109,8 +120,8 @@ func main() { for from_index, from_planet := range data.Planets { for to_index, to_planet := range data.Planets { best_trade := "(nothing)" - if best_trades[from_index][to_index] != nil { - best_trade = best_trades[from_index][to_index].Name + if best_trades[from_index][to_index] != "" { + best_trade = best_trades[from_index][to_index] } fmt.Printf("%s to %s: %s\n", from_planet.Name, to_planet.Name, best_trade) }