Sha256: 9df3fc85ef2760d97b688c7b715893db54094c3315ded441185355375c836acb

Contents?: true

Size: 1.38 KB

Versions: 73

Compression:

Stored size: 1.38 KB

Contents

object BookStore {
  private val bookPrice = 800
  private val discounts =
    Map((1, 0.0),
      (2, 5.0),
      (3, 10.0),
      (4, 20.0),
      (5, 25.0))

  def total(books: List[Int]): Double = total(books, 0)

  private def total(books: List[Int], acc: Double): Double = {
    if (books.isEmpty) {
      acc
    } else {
      val bookNums = books.distinct

      (1 to bookNums.size).foldLeft(Double.MaxValue)((minPrice, groupSize) => {
        val itemsToRemove = bookNums.take(groupSize)
        val remainingBooks = getRemainingBooks(books, itemsToRemove)
        val price = total(remainingBooks, acc + groupCost(groupSize))
        scala.math.min(price, minPrice)
      })
    }
  }

  private def groupCost(groupSize: Int): Double = {
    discounts get groupSize match {
      case Some(discount) => bookPrice * groupSize * (100.0 - discount) / 100.0
      case _ => bookPrice * groupSize
    }
  }

  private def getRemainingBooks(books: List[Int], itemsToRemove: List[Int]): List[Int] = {
    var remainingBooks = books

    for (item <- itemsToRemove) {
      remainingBooks = removeFirst(remainingBooks)(_ == item)
    }

    remainingBooks
  }

  // drops the first item in the passed in list that matches the predicate.
  private def removeFirst[T](list: List[T])(pred: (T) => Boolean): List[T] = {
    val (before, atAndAfter) = list span (x => !pred(x))
    before ::: atAndAfter.drop(1)
  }
}

Version data entries

73 entries across 73 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.179 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.178 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.177 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.176 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.175 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.174 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.173 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.172 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.171 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.170 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.169 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.167 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.166 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.165 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.164 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.163 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.162 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.161 tracks/scala/exercises/book-store/example.scala
trackler-2.2.1.160 tracks/scala/exercises/book-store/example.scala