Advertisement
Guest User

riddle

a guest
May 30th, 2011
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.07 KB | None | 0 0
  1. /**
  2.  * Developed with pleasure :)<br>
  3.  * User: HoD<br>
  4.  * Date: 27.05.11<br>
  5.  * Time: 20:22<br>
  6.  */
  7. object Riddle {
  8.  
  9.   implicit def enhance(t: (Int, Int)) = new {
  10.     def sum = t._1 + t._2
  11.  
  12.     def product = t._1 * t._2
  13.  
  14.     def difference = math.abs(t._1 - t._2)
  15.   }
  16.  
  17.   implicit def enhance[T](t: Traversable[T]) = new {
  18.     def hasOneElement = t.size == 1
  19.  
  20.     def hasMoreThanOneElement = t.size > 1
  21.   }
  22.  
  23.   def main(args: Array[String]) {
  24.  
  25.     val allPossiblePairs = {
  26.       for (first <- 1 to 1000; second <- first to 1000) yield {
  27.         first -> second
  28.       }
  29.     }
  30.  
  31.     //peter: don't know the solution
  32.     val afterStep1 = {
  33.       allPossiblePairs.groupBy(_.product).filter(_._2.hasMoreThanOneElement)
  34.     }
  35.     println("remaining " + afterStep1.values.flatten.size)
  36.  
  37.     //simon: i already knew
  38.     val afterStep2 = {
  39.       //simon: i don't know the solution
  40.       val bySum = allPossiblePairs.groupBy(_.sum).filter(_._2.hasMoreThanOneElement)
  41.       // -> every pair must not have a unique product
  42.       val ambiguousProducts = afterStep1.keySet
  43.       bySum.filter(_._2.forall(e => ambiguousProducts.contains(e.product)))
  44.     }
  45.     println("remaining " + afterStep2.values.flatten.size)
  46.     //peter: now i know
  47.     val afterStep3 = {
  48.       // -> find all groups that contain a pair that has a unique product inside that group
  49.       afterStep2.values.flatten.groupBy(_.product).filter(_._2.hasOneElement)
  50.     }
  51.  
  52.     println("remaining " + afterStep3.values.flatten.size)
  53.     //simon: now i know, too
  54.     val afterStep4 = {
  55.       // -> find all groups that contain a pair that has a unique sum inside that group
  56.       afterStep3.values.flatten.groupBy(_.sum).filter(_._2.hasOneElement)
  57.     }
  58.     println("remaining " + afterStep4.values.flatten.size)
  59.     //daniel: still not sure    
  60.     val afterStep5 = {
  61.       val diff2Pairs = afterStep4.values.flatten.map(e => e.difference -> e).groupBy(_._1).map(e => e._1 -> e._2.map(_._2))
  62.       diff2Pairs.filter(_._2.hasMoreThanOneElement)
  63.     }
  64.     println("possible differences daniel might know: " + afterStep5.keys)
  65.     //to be able to suspect a number, there has to be a number that appears more often than all others
  66.     val diff2NumberCount = {
  67.       val diff2Numbers = afterStep5.map(e => e._1 -> e._2.flatMap(e => List(e._1, e._2)))
  68.       afterStep5.map(e => e._1 -> diff2Numbers(e._1).groupBy(e => e).map(e => e._1 -> e._2.size))
  69.     }
  70.     println("candidates: " + diff2NumberCount)
  71.  
  72.     val mapWithHighestCount = diff2NumberCount.values.toList.sortBy(_.values.max).last
  73.     val danielsSuspect = {
  74.       val highestCount = mapWithHighestCount.values.max
  75.       mapWithHighestCount.find(_._2 == highestCount).get
  76.     }
  77.     println("daniels suspect is: " + danielsSuspect._1)
  78.     //since we know daniels suspect, we know the difference he knows
  79.     val danielsDiff = {
  80.       diff2NumberCount.find(_._2.exists(_ == danielsSuspect)).get
  81.     }
  82.     println("daniels diff: " + danielsDiff._1)
  83.     println("solution:" + afterStep5(danielsDiff._1).find(!_.productIterator.contains(danielsSuspect._1)).get)
  84.   }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement