Skip to content

Instantly share code, notes, and snippets.

@begeric
Last active August 29, 2015 14:09
Show Gist options
  • Select an option

  • Save begeric/34b809ed804e649392e5 to your computer and use it in GitHub Desktop.

Select an option

Save begeric/34b809ed804e649392e5 to your computer and use it in GitHub Desktop.
def diff(xs: List[Float]): List[Float] = {
lazy val average = xs.foldRight((0.0f, 0))((c, acc) => (acc._1 + c, acc._2 + 1))
val avg = average._1 / average._2
xs.map(_ - avg)
}
def diff2(xs: List[Float]): List[Float] = {
val nil = (0.0f, 0, ((avg: Float) => Nil: List[Float]))
val average = xs.foldRight(nil){ (c, acc) =>
(acc._1 + c, acc._2 + 1, (avg: Float) => (c - avg) :: acc._3(avg))
}
val (sum, size, res) = average
res(sum / size)
}
def diff3(xs: List[Float]): List[Float] = {
val nil = (() => Nil: List[Float], (0.0f, 0))
def average(avg: => Float) =
xs.foldRight(nil){ (c, acc) =>
(() => (c - avg) :: acc._1(),
(acc._2._1 + c, acc._2._2 + 1))
}
lazy val (res,(sum: Float, size: Int)) = average(sum / size)
res()
}
def replaceByMin(xs: List[Float]): List[Float] = {
val nil = (() => Nil: List[Float], Float.MaxValue)
def minimum(min: => Float) =
xs.foldRight(nil){ (c, acc) =>
(() => min :: acc._1(),
Math.min(acc._2, c))
}
lazy val (res,min: Float) = minimum(min)
res()
}
println(diff(List(1,6,3,65)))
println(diff2(List(1,6,3,65)))
println(diff3(List(1,6,3,65)))
@cedricbastin
Copy link

thanks! "repMin" example with trees: https://gist.github.com/cedricbastin/a2aa1c81c92194b77cdf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment