Programming performance/JasonWoof gforth

From HaskellWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Programming language: gforth (should work in other forths too)

Experience level with language: quite a bit. I only had to look up a few things

Time spent: 102 minutes

Notes:

1) I implemented this problem once before in ruby (Don't think that helped too much though. The two languages have little in common.)

2) I wrote this from scratch, including a number parser and array/list code. In the real world one would hopefully already have code for these things.

3) This program expects gspc.txt to come through on stdin, so run like so: gforth jasonwoof_gspc.fs < gspc.txt


#! /usr/bin/gforth

warnings off

fvariable bank 10000e bank f!
: p>f s>d d>f 100e f/ ;  ( pennies -- float )

\ make a FOR that makes sense, and can take 0 as count, and UNLOOP
: for 0 postpone literal postpone ?do ; immediate
: next postpone loop ; immediate

: ++ 1 swap +! ;  ( var -- )
: -- -1 swap +! ;  ( var -- )

\ kill the header
: dump-line key 10 = if exit then recurse ;
dump-line

: dump-word key 32 = if exit then recurse ;
: dump-others 6 for dump-word next ;

variable #fields
variable last-field

: field-pop last-field @ 4 - dup last-field ! @ ;  ( -- field ) \ return the next field


: -parse-close key dup 10 = if drop exit then dup [char] . = if drop recurse exit then 48 - swap 10 * + recurse ;
: parse-close 0 -parse-close ;   ( -- pennies ) \ parse digits until end of line (ignoring decimal point)
: parse-field dump-others parse-close , #fields ++ ;  ( -- )
: parse-fields begin key -1 = if exit then parse-field again ;
parse-fields
here last-field !

fvariable last-close
fvariable close
fvariable sell-thresh

\ initialize close
field-pop p>f close f!
#fields @ 1 - #fields !

variable #holds
create holds 1000 floats allot
: hold-close-a 2 * floats holds + ;
: hold-last-a #holds @ hold-close-a ;
: hold-last-close! hold-last-a f! ;
: hold-last-shares! hold-last-a float+ f! ;
: hold-close@ hold-close-a f@ ;
: hold-shares@ hold-close-a float+ f@ ;
: hold-push hold-last-shares! close f@ hold-last-close! #holds ++ ;  ( #shares -- )
: hold-cleanup #holds @ dup for 1 - dup hold-close@ f0= 0= if unloop drop exit then #holds -- next drop ;

: get-close close f@ last-close f! field-pop p>f close f! ;  ( -- )
: change close f@ last-close f@ f- last-close f@ f/ ;  ( -- % )
: withdraw bank f@ 10e f/ bank f@ fover f- bank f! ;  ( -- cash )
: deposit bank f@ f+ bank f! ;  ( money -- )
: buy withdraw close f@ f/ hold-push ;
: ?buy change -0.03e f< if buy then ;
: hold-sell dup float+ f@ close f@ f* deposit >r 0e r> f! ;  ( addr -- )
: -?hold-sell dup f@ sell-thresh f@ f> if drop exit then hold-sell ;  ( addr -- )
: ?hold-sell dup f@ f0= if drop exit then -?hold-sell ;  ( addr -- )
: set-sell-thresh close f@ 1.06e f/ sell-thresh f! ;
: -sell #holds @ for i hold-close-a ?hold-sell next ;
: sell set-sell-thresh -sell hold-cleanup ;
: trade #fields @ for get-close ?buy sell next ;
: sell-all 100000e sell-thresh f! -sell ;

trade
sell-all

bank f@ f. cr bye