33 lines
876 B
Plaintext
33 lines
876 B
Plaintext
pragma.enable("accumulator")
|
|
/** Single step. */
|
|
def forwardDifference(seq :List) {
|
|
return accum [] for i in 0..(seq.size() - 2) {
|
|
_.with(seq[i + 1] - seq[i])
|
|
}
|
|
}
|
|
|
|
/** Iterative implementation of the goal. */
|
|
def nthForwardDifference1(var seq :List, n :(int >= 0)) {
|
|
for _ in 1..n { seq := forwardDifference(seq) }
|
|
return seq
|
|
}
|
|
|
|
/** Imperative implementation of the goal. */
|
|
def nthForwardDifference2(seq :List, n :(int >= 0)) {
|
|
def buf := seq.diverge()
|
|
def finalSize := seq.size() - n
|
|
for lim in (finalSize..!seq.size()).descending() {
|
|
for i in 0..!lim {
|
|
buf[i] := buf[i + 1] - buf[i]
|
|
}
|
|
}
|
|
return buf.run(0, finalSize)
|
|
}
|
|
|
|
? def sampleData := [90, 47, 58, 29, 22, 32, 55, 5, 55, 73]
|
|
> for n in 0..10 {
|
|
> def r1 := nthForwardDifference1(sampleData, n)
|
|
> require(r1 == nthForwardDifference2(sampleData, n))
|
|
> println(r1)
|
|
> }
|