case class State
(a
: Int, b
: Int, sum
:Int, mul
:Int
)
val allPossibleStates
:Seq
[State
] = for { i <- 2 to 99;
j <- i to 99
} yield State
(i,j,i+j,i
*j
)
//Atlasām kopu ar visiem reizinājumiem, kuri ir iespējami - iegūstami vismaz 2 veidos
val allPossibleMultiplications
:Set
[Int
] = allPossibleStates
.groupBy(_.mul)
.
collect{ case (key, seq
) if seq.
size >= 2 => key
} .toSet
//Tā kā Pēteris zināja, ka Jānis nezin, tad iespējami ir tikai tie varianti,
//kuru summas var sadalīt saskaitāmajos, kuru reizinājumi ir iegūstami vismaz 2 veidos
val petersStates
:Seq
[State
] = allPossibleStates
.groupBy(_.sum)
.
collect{case (key, seq
) if seq.
forall { el
=> allPossibleMultiplications.
contains(el.
mul) } => seq
} .flatten
.toSeq
//Tā kā Jānis tagad zin atbildi, tas nozīmē, ka derīgi ir tikai tie stāvokļi,
//kuros reizinājumu var iegūt tikai vienā veidā.
val allPossibleStatesWhenJohnKnows
:Seq
[State
] = petersStates
.groupBy(_.mul)
.
collect{case (key, seq
) if seq.
size==1 => seq
} .flatten
.toSeq
//Tā kā Pēteris tagad zin atbildi, tas nozīmē, ka derīgi ir tikai tie stāvokļi,
//kuros summu var iegūt tikai vienā veidā.
val allPossibleStatesWhenPeterKnows
:Seq
[State
] = allPossibleStatesWhenJohnKnows
.groupBy(_.sum)
.
collect{case (key, seq
) if seq.
size==1 => seq
} .flatten
.toSeq
println(allPossibleStatesWhenPeterKnows)
}
b2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewoJY2FzZSBjbGFzcyBTdGF0ZShhOiBJbnQsIGI6IEludCwgc3VtOkludCwgbXVsOkludCkKICAgIAogICAgdmFsIGFsbFBvc3NpYmxlU3RhdGVzOlNlcVtTdGF0ZV0gPSBmb3IgewogICAgICBpIDwtIDIgdG8gOTk7CiAgICAgIGogPC0gaSB0byA5OQogICAgfSB5aWVsZCBTdGF0ZShpLGosaStqLGkqaikKICAgIAogICAgLy9BdGxhc8SBbSBrb3B1IGFyIHZpc2llbSByZWl6aW7EgWp1bWllbSwga3VyaSBpciBpZXNwxJNqYW1pIC0gaWVnxatzdGFtaSB2aXNtYXogMiB2ZWlkb3MKICAgIHZhbCBhbGxQb3NzaWJsZU11bHRpcGxpY2F0aW9uczpTZXRbSW50XSA9IGFsbFBvc3NpYmxlU3RhdGVzCiAgICAgIC5ncm91cEJ5KF8ubXVsKQogICAgICAuY29sbGVjdHsgY2FzZSAoa2V5LCBzZXEpIGlmIHNlcS5zaXplID49IDIgPT4ga2V5fQogICAgICAudG9TZXQKICAgICAgCiAgICAvL1TEgSBrxIEgUMSTdGVyaXMgemluxIFqYSwga2EgSsSBbmlzIG5lemluLCB0YWQgaWVzcMSTamFtaSBpciB0aWthaSB0aWUgdmFyaWFudGksCiAgICAvL2t1cnUgc3VtbWFzIHZhciBzYWRhbMSrdCBzYXNrYWl0xIFtYWpvcywga3VydSByZWl6aW7EgWp1bWkgaXIgaWVnxatzdGFtaSB2aXNtYXogMiB2ZWlkb3MKICAgIHZhbCBwZXRlcnNTdGF0ZXM6U2VxW1N0YXRlXSA9IGFsbFBvc3NpYmxlU3RhdGVzCiAgICAgIC5ncm91cEJ5KF8uc3VtKQogICAgICAuY29sbGVjdHtjYXNlIChrZXksIHNlcSkgaWYgc2VxLmZvcmFsbCB7IGVsID0+IGFsbFBvc3NpYmxlTXVsdGlwbGljYXRpb25zLmNvbnRhaW5zKGVsLm11bCkgfSA9PiBzZXF9CiAgICAgIC5mbGF0dGVuCiAgICAgIC50b1NlcQogICAgICAKICAgIC8vVMSBIGvEgSBKxIFuaXMgdGFnYWQgemluIGF0YmlsZGksIHRhcyBub3rEq23Ekywga2EgZGVyxKtnaSBpciB0aWthaSB0aWUgc3TEgXZva8S8aSwKICAgIC8va3Vyb3MgcmVpemluxIFqdW11IHZhciBpZWfFq3QgdGlrYWkgdmllbsSBIHZlaWTEgS4KICAgIHZhbCBhbGxQb3NzaWJsZVN0YXRlc1doZW5Kb2huS25vd3M6U2VxW1N0YXRlXSA9IHBldGVyc1N0YXRlcwogICAgICAuZ3JvdXBCeShfLm11bCkKICAgICAgLmNvbGxlY3R7Y2FzZSAoa2V5LCBzZXEpIGlmIHNlcS5zaXplPT0xID0+IHNlcX0KICAgICAgLmZsYXR0ZW4KICAgICAgLnRvU2VxCiAgICAKICAgIC8vVMSBIGvEgSBQxJN0ZXJpcyB0YWdhZCB6aW4gYXRiaWxkaSwgdGFzIG5vesSrbcSTLCBrYSBkZXLEq2dpIGlyIHRpa2FpIHRpZSBzdMSBdm9rxLxpLAogICAgLy9rdXJvcyBzdW1tdSB2YXIgaWVnxat0IHRpa2FpIHZpZW7EgSB2ZWlkxIEuCiAgICB2YWwgYWxsUG9zc2libGVTdGF0ZXNXaGVuUGV0ZXJLbm93czpTZXFbU3RhdGVdID0gYWxsUG9zc2libGVTdGF0ZXNXaGVuSm9obktub3dzCiAgICAgIC5ncm91cEJ5KF8uc3VtKQogICAgICAuY29sbGVjdHtjYXNlIChrZXksIHNlcSkgaWYgc2VxLnNpemU9PTEgPT4gc2VxfQogICAgICAuZmxhdHRlbgogICAgICAudG9TZXEKICAgICAgCiAgICBwcmludGxuKGFsbFBvc3NpYmxlU3RhdGVzV2hlblBldGVyS25vd3MpCn0=