fork download
  1. object Main extends App {
  2. case class State(a: Int, b: Int, sum:Int, mul:Int)
  3.  
  4. val allPossibleStates:Seq[State] = for {
  5. i <- 2 to 99;
  6. j <- i to 99
  7. } yield State(i,j,i+j,i*j)
  8.  
  9. //Atlasām kopu ar visiem reizinājumiem, kuri ir iespējami - iegūstami vismaz 2 veidos
  10. val allPossibleMultiplications:Set[Int] = allPossibleStates
  11. .groupBy(_.mul)
  12. .collect{ case (key, seq) if seq.size >= 2 => key}
  13. .toSet
  14.  
  15. //Tā kā Pēteris zināja, ka Jānis nezin, tad iespējami ir tikai tie varianti,
  16. //kuru summas var sadalīt saskaitāmajos, kuru reizinājumi ir iegūstami vismaz 2 veidos
  17. val petersStates:Seq[State] = allPossibleStates
  18. .groupBy(_.sum)
  19. .collect{case (key, seq) if seq.forall { el => allPossibleMultiplications.contains(el.mul) } => seq}
  20. .flatten
  21. .toSeq
  22.  
  23. //Tā kā Jānis tagad zin atbildi, tas nozīmē, ka derīgi ir tikai tie stāvokļi,
  24. //kuros reizinājumu var iegūt tikai vienā veidā.
  25. val allPossibleStatesWhenJohnKnows:Seq[State] = petersStates
  26. .groupBy(_.mul)
  27. .collect{case (key, seq) if seq.size==1 => seq}
  28. .flatten
  29. .toSeq
  30.  
  31. //Tā kā Pēteris tagad zin atbildi, tas nozīmē, ka derīgi ir tikai tie stāvokļi,
  32. //kuros summu var iegūt tikai vienā veidā.
  33. val allPossibleStatesWhenPeterKnows:Seq[State] = allPossibleStatesWhenJohnKnows
  34. .groupBy(_.sum)
  35. .collect{case (key, seq) if seq.size==1 => seq}
  36. .flatten
  37. .toSeq
  38.  
  39. println(allPossibleStatesWhenPeterKnows)
  40. }
Success #stdin #stdout 0.54s 322240KB
stdin
Standard input is empty
stdout
List(State(4,13,17,52))