## Code Abbey -- Arithmetic progression

Oforth examples. Feel free to post your own code.

### Code Abbey -- Arithmetic progression

When we speak about arithmetic progression (or arithmetic sequence) we mean a series of numbers with a special property - each value is followed by the other, greater by predefined amount (step).

I.e. difference of (K+1)-th and K-th values is a constant. Here are examples of sequences

1 2 3 4 5 6 7 ...
4 6 8 10 12 14 16...
10 13 16 19 22 25 28...

Since so, arithmetic sequence is completely defined by the first member (A) and the increment value - step size - (B). First few members could be expressed as

A + (A + B) + (A + 2B) + (A + 3B) + ...

Here we could of course write loops and solve the problem that way, but it gets a lot simpler if we factor out our solution a bit, and get some method to the madnes,

since we have A, B ad N as shown up we can reduce this to A*N + (1+2+...+b-1) * b the only not so obvious part here is the parenthesized part but it turns out it's rather easy to get in oforth, since we have #seq the part then becomes A N * B 1 - seq sum B * + in proper reverse notation, we just need to get this to deal with the stack, and it doesn't need much stack juggling so that means we get to not use locals  Code: Select all
`: getLn { System.Console askln }                                                : getNumber { getLn asInteger }                                                 : pprint { apply(#.) printcr }                                                  : getInput { [] getNumber #[ getLn + ] times }                                  : parseLine { words map(#asInteger) }                                           : 3list>st { dup first swap dup second swap third } // [a,b,n] -- a b n: arithseq { tuck   1 - seq sum  *   tor  *  + }    // a * n + (1 + 2 + ... [b-1] )b: solveline { parseLine 3list>st arithseq }getInput map(#solveline) pprint`
sotolf

Posts: 55
Joined: 30 Jul 2015 15:53 