Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.86 KB | None | 0 0
  1. package ru.jcorp.coins
  2.  
  3. import java.util.Date
  4. import collection.Set
  5. import collection.mutable
  6.  
  7. object Runner {
  8.  
  9.   class CoinsCounter(components: Set[Int]) {
  10.     val cache: mutable.Map[Int, Set[Map[Int, Int]]] = mutable.Map()
  11.     var cacheLimit = 0
  12.  
  13.     def add(map: Map[Int, Int], i: Int): Map[Int, Int] = {
  14.       val option = map.get(i)
  15.       map + (i -> (if (None == option) 1 else option.get + 1))
  16.     }
  17.  
  18.     def decompose(value: Int) : Set[Map[Int, Int]] = value match {
  19.       case t if (t <= 0) => Set(Map[Int, Int]())
  20.       case t if (cache.contains(t)) => cache(value)
  21.       case _ => {
  22.  
  23.         def getVariants(subtracted: Int): Set[Map[Int, Int]] = {
  24.           val remain: Int = value - subtracted
  25.           val variants: Set[Map[Int, Int]] = decompose(remain)
  26.  
  27.           if ((variants.size > 0) && ((cacheLimit > cache.size) || (cacheLimit <= 0)))
  28.             cache.put(remain, variants)
  29.  
  30.           val result: Set[Map[Int, Int]] = variants.map(variant => add(variant, subtracted))
  31.           result
  32.         }
  33.  
  34.         val variants: Set[Set[Map[Int, Int]]] = components.map(component => getVariants(component))
  35.         ((Set[Map[Int, Int]]() /: variants)(_ ++ _))
  36.       }
  37.     }
  38.  
  39.     def setCacheLimit(value : Int) = {
  40.       cacheLimit = value
  41.       this
  42.     }
  43.  
  44.     def getCacheLimit = cacheLimit
  45.   }
  46.  
  47.   def main(args: Array[String]) {
  48.  
  49.     print("Sum: ")
  50.     val sum = readInt()
  51.  
  52.     print("Coins: ")
  53.     var coins = Set[Int]()
  54.     readLine().split(' ').foreach( f => { coins += f.toInt } )
  55.  
  56.     print("Cache: ")
  57.     val cacheLimit = readInt()
  58.     println()
  59.  
  60.     val now = new Date()
  61.     val counts = new CoinsCounter(coins).setCacheLimit(cacheLimit).decompose(sum)
  62.     println("Time: " + (new Date().getTime - now.getTime) + " ms")
  63.     println()
  64.  
  65.     for {variant <- counts} {
  66.       print(variant)
  67.       println()
  68.     }
  69.   }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement