X-Git-Url: http://git.scottworley.com/planeteer/blobdiff_plain/d07f3caa2ea66a0bb7311a6a09d8b32e6751839c..12bc2cd7978b665b549616b9c36c8e83ab3cc608:/planeteer.go?ds=inline diff --git a/planeteer.go b/planeteer.go index fd697be..57f00ec 100644 --- a/planeteer.go +++ b/planeteer.go @@ -25,23 +25,22 @@ 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 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 []struct { - Name string - BasePrice int - CanSell bool - Limit int - } - 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 - } - } + Commodities []Commodity + Planets []Planet } func ReadData() (data planet_data) { @@ -57,8 +56,61 @@ func ReadData() (data planet_data) { return } +func TradeValue(from, to *Planet, + commodity *Commodity, + quantity int) int { + if !commodity.CanSell { + return 0 + } + from_relative_price, from_available := from.RelativePrices[commodity.Name] + if !from_available { + return 0 + } + to_relative_price, to_available := to.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.Planets[from_index], + &data.Planets[to_index], + &data.Commodities[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) + } + } }