chiark / gitweb /
Complete rewrite to not be crap.
authormdw <mdw>
Wed, 26 Feb 2003 00:03:08 +0000 (00:03 +0000)
committermdw <mdw>
Wed, 26 Feb 2003 00:03:08 +0000 (00:03 +0000)
elite-prices

index c22ffb0..e5c6c50 100755 (executable)
 #! /usr/bin/tclsh
 #
-# $Id: elite-prices,v 1.2 2003/02/25 00:25:38 mdw Exp $
+# $Id: elite-prices,v 1.3 2003/02/26 00:03:08 mdw Exp $
 
 package require "elite" "1.0.0"
 
-# --- An optimal trading pair ---
-
-set lezaer   "1598f98a6581"
-set esmaonbe "7997d18a0d89"
-
-set np [expr {[llength $products]/2}]
-puts -nonewline stderr "\[[string repeat { } $np]\] "
-puts -nonewline stderr "\[[string repeat { } 32]\]"
-puts -nonewline stderr "\r\[[string repeat { } $np]\] \["
-flush stderr
-foreach {a s} [list l $lezaer e $esmaonbe] {
-  for {set f 0} {$f < 256} {incr f} {
-    elite-market m $s $f
-    foreach {t p} $products { destructure [list ${a}($f:$t) .] $m($t) }
-    if {($f & 15) == 15} { puts -nonewline stderr "."; flush stderr }
+foreach-world $galaxy1 p {
+  set econame $eco($p(economy))
+  if {[info exists rep($econame)]} { continue }
+  set rep($econame) $p(seed)
+}
+unset p
+
+set from $rep(poor-agri)
+set to   $rep(rich-ind)
+
+proc loavghi {l} {
+  set lo 10000
+  set hi -10000
+  set tot 0
+  set n 0
+  foreach x $l {
+    incr tot $x
+    incr n
+    if {$x < $lo} { set lo $x }
+    if {$x > $hi} { set hi $x }
+  }
+  return [list $lo [expr {$tot/double($n)}] $hi]
+}
+
+proc get-world {p} {
+  global rep g argv0
+  if {[info exists rep($p)]} { return $rep($p) }
+  set s [parse-planet-spec $g $p]
+  if {[string equal $s ""]} {
+    puts stderr "$argv0: bad planet spec `$p'"
+    exit 1
   }
+  return $s
 }
-foreach {t p} $products {
-  set tot($t) 0
-  set min($t) 100000
-  set max($t) -100000
-}
-set i 0
-foreach {t p} $products {
-  incr i
-  puts -nonewline stderr "\r\[[string repeat . $i]"
-  puts -nonewline stderr "[string repeat { } [expr {$np - $i}]]\] "
-  puts -nonewline stderr "\[[string repeat { } 32]\]"
-  puts -nonewline stderr "\r\[[string repeat . $i]"
-  puts -nonewline stderr "[string repeat { } [expr {$np - $i}]]\] \["
-  set ll {}
-  set ee {}
-  for {set f 0} {$f < 256} {incr f} {
-    lappend ll $l($f:$t)
-    lappend ee $e($f:$t)
+
+proc check-profits {from to} {
+  global products
+  set np [expr {[llength $products]/2}]
+  puts -nonewline stderr "Thinking: \[[string repeat { } 32]\] "
+  puts -nonewline stderr "\[[string repeat { } $np]\] "
+  puts -nonewline stderr "\rThinking: \["
+  flush stderr
+  foreach {a s} [list l $from e $to] {
+    for {set f 0} {$f < 256} {incr f} {
+      elite-market m $s $f
+      foreach {t p} $products { destructure [list ${a}($f:$t) .] $m($t) }
+      if {($f & 15) == 15} { puts -nonewline stderr "."; flush stderr }
+    }
   }
-  set j 0
-  foreach pl $ll {
-    foreach pe $ee {
-      set pr [expr {$pl - $pe}]
-      if {$pr < $min($t)} { set min($t) $pr }
-      if {$pr > $max($t)} { set max($t) $pr }
-      incr tot($t) $pr
-    }
-    incr j
-    if {($j & 7) == 0} { puts -nonewline stderr "."; flush stderr }
+  puts -nonewline stderr "\] \["
+  flush stderr
+  set r {}
+  foreach {t p} $products {
+    set ll {}
+    set ee {}
+    for {set f 0} {$f < 256} {incr f} {
+      lappend ll $l($f:$t)
+      lappend ee $e($f:$t)
+    }
+    destructure {llo lavg lhi} [loavghi $ll]
+    destructure {elo eavg ehi} [loavghi $ee]
+    lappend r [list $t \
+       [expr {$elo - $lhi}] \
+       [expr {int($eavg - $lavg)}] \
+       [expr {$ehi - $llo}]]
+    puts -nonewline stderr "."; flush stderr
   }
+  puts stderr "\] done"
+  return $r
 }
-puts stderr ""
 
-foreach {t p} $products {
-  puts [format "%-15s %5d %4d %4d" $t \
-      $min($t) [expr {$tot($t)/65536}] $max($t)]
+set g $galaxy1
+set sortcol 0
+set usage "usage: $argv0 \[-g GALAXY\] \[-s SORT\] \[FROM TO\]"
+for {set i 0} {$i < [llength $argv]} {incr i} {
+  switch -glob -- [lindex $argv $i] {
+    "-g" {
+      incr i
+      set a [lindex $argv $i]
+      set g [parse-galaxy-spec $a]
+      if {[string equal $g ""]} {
+       puts stderr "$argv0: bad galaxy string `$a'"
+       exit 1
+      }
+      destructure {. g} $g
+    }
+    "-s" {
+      incr i
+      set a [lindex $argv $i]
+      switch -- $a {
+       "min" - "minimum" { set sortcol 1 }
+       "avg" - "average" { set sortcol 2 }
+       "max" - "maximum" { set sortcol 3 }
+       default {
+         puts stderr "$argv0: unknown sort type: `$a' (must be `min', `max' or `avg'"
+         exit 1
+       }
+      }
+    }
+    "--" {
+      incr i
+      break
+    }
+    "-*" {
+      puts stderr $usage
+      exit 1
+    }
+    default {
+      break
+    }
+  }
+}
+
+set argv [lrange $argv $i end]
+switch -exact -- [llength $argv] {
+  0 { }
+  2 {
+    destructure {fp tp} $argv
+    set from [get-world $fp]
+    set to [get-world $tp]
+    foreach {p s} [list $fp $from $tp $to] {
+      if {[string equal $s ""]} {
+       puts stderr "$argv0: bad planet spec `$p'"
+       exit 1
+      }
+    }
+  }
+  default {
+    puts stderr $usage
+    exit 1
+  }
+}
+
+set pp [check-profits $from $to]
+if {$sortcol} {
+  set pp [lsort -index $sortcol -real -decreasing $pp]
+}
+foreach i $pp {
+  destructure {t min avg max} $i
+  puts [format "%-15s %6.1f %5.1f %5.1f" $t \
+      [expr {$min/10.0}] [expr {$avg/10.0}] [expr {$max/10.0}]]
 }