You're right; your version is easier on the eyes. Starting from 1 instead of 0 was deliberate, however. DZ's method involves multiplying N polynomials of degree X, where X is the number of sides on a die and N is the number of dice. So, 2d6 would be like this:
(x^1 + x^2 + x^3 + x^4 + x^5 + x^6) (x^1 + x^2 + x^3 + x^4 + x^5 + x^6) With the final exponents as the number rolled, and the final coefficients as the chance (out of 6^2) to roll it. Which is why I used alists, at first; I don't really need the 0 part of the vector. I think I will give hashes a try. tk On Wed, May 02, 2012 at 05:08:03PM -0400, Matthias Felleisen wrote: > > > I rewrote the thing to use vectors instead, and altered the polynomial > > multiplication function to use (begin) and (vector-set!): > > > > https://github.com/TurtleKitty/Dice/blob/67c2b49707132395f73b43afe111e3904b3898f2/dice.rkt > > > > It too now calculates three hundred dice without breaking a sweat, but... I > > feel dirty. > > > It's also wrong and stylistically bad: > > (define (poly-mul p1 p2) > (define deg1 (poly-deg p1)) > (define deg2 (poly-deg p2)) > (define noob (make-vector (- (+ deg1 deg2) 1))) > ;; MF: bug, these were 1s: > (for* ([i (in-range 0 deg1)] [j (in-range 0 deg2)]) > (define k (+ i j)) > (define a (* (vector-ref p1 i) (vector-ref p2 j))) > (vector-set! noob k (+ (vector-ref noob k) a))) > noob) > > > > > Can anyone recommend a functional approach that won't melt my motherboard? > > I'm considering hashes, since they have the immutable version of hash-set > > that vectors seem to lack, but I thought I'd ask the experts. > > > Do try hash and for/hash. I think you will be pleased with the performance. > -- Matthias > > p.s. Do report back. > > ____________________ Racket Users list: http://lists.racket-lang.org/users