X-Git-Url: http://git.scottworley.com/planeteer/blobdiff_plain/d07f3caa2ea66a0bb7311a6a09d8b32e6751839c..5a1593ab8a31d024658664769920cbd0d5438e34:/planeteer.go diff --git a/planeteer.go b/planeteer.go index fd697be..87c7448 100644 --- a/planeteer.go +++ b/planeteer.go @@ -25,22 +25,21 @@ import "fmt" 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_data struct { - Commodities []struct { - Name string - BasePrice int - CanSell bool - Limit int - } + 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 []struct { - Name string - Value int - } + RelativePrices map [string] int } } @@ -57,8 +56,63 @@ func ReadData() (data planet_data) { return } +func TradeValue(data planet_data, + from_index, to_index, commodity_index, quantity int) int { + + commodity := &data.Commodities[commodity_index] + if !commodity.CanSell { + return 0 + } + + from_planet := &data.Planets[from_index] + from_relative_price, from_available := from_planet.RelativePrices[commodity.Name] + if !from_available { + return 0 + } + + to_planet := &data.Planets[to_index] + to_relative_price, to_available := to_planet.RelativePrices[commodity.Name] + if !to_available { + return 0 + } + + from_absolute_price := from_relative_price * commodity.BasePrice + to_absolute_price := to_relative_price * commodity.BasePrice + buy_price := from_absolute_price + sell_price := int(float64(to_absolute_price) * 0.9) + return (sell_price - buy_price) * 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 { + best_gain := 0 + for commodity_index := range data.Commodities { + gain := TradeValue(data, from_index, to_index, commodity_index, 1) + if gain > best_gain { + best[from_index][to_index] = &data.Commodities[commodity_index] + gain = best_gain + } + } + } + } + return best +} + func main() { flag.Parse() data := ReadData() - fmt.Printf("%v", data) + best_trades := FindBestTrades(data) + 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 + } + fmt.Printf("%s to %s: %s\n", from_planet.Name, to_planet.Name, best_trade) + } + } }