Skip to content

Instantly share code, notes, and snippets.

@tomatophobia
Last active June 26, 2020 11:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomatophobia/7584cca459aae1315a3ec7e8eb49e2c0 to your computer and use it in GitHub Desktop.
Save tomatophobia/7584cca459aae1315a3ec7e8eb49e2c0 to your computer and use it in GitHub Desktop.
package Speed
case class World(containers: Map[Symbol, Container]) {
def getAmount(key: Symbol): Double = {
containers(key).group.amountPerContainer
}
def addWater(key: Symbol, amount: Double): World = {
val group = containers(key).group
val members = group.members
val amountPerContainer = amount / members.size
val group1 = group.copy(amountPerContainer = group.amountPerContainer + amountPerContainer)
World(members.foldLeft(containers){ (containers, member) =>
containers.updated(member, Container(group1))
})
}
def connetTo(key1: Symbol, key2: Symbol): World = {
val group1 = containers(key1).group
val group2 = containers(key2).group
if (group1 == group2) this
else {
val size1: Int = group1.members.size
val size2: Int = group2.members.size
val tot1: Double = group1.amountPerContainer * size1
val tot2: Double = group2.amountPerContainer * size2
val newAmount: Double = (tot1 + tot2) / (size1 + size2)
val newGroup: Group = Group(newAmount, group1.members ++ group2.members)
World(newGroup.members.foldLeft(containers){ (containers, member) =>
containers.updated(member, Container(newGroup))
})
}
}
}
case class Container(group: Group)
object Container {
def apply(name: Symbol): Container = Container(Group(0.0, Set(name)))
}
case class Group(amountPerContainer: Double, members: Set[Symbol])
object Speed1 extends App {
val world = World(Map(
'a -> Container('a),
'b -> Container('b),
'c -> Container('c),
'd -> Container('d),
))
val world1 = world
.addWater('a, 12)
.addWater('d, 8)
.connetTo('a, 'b)
.connetTo('b, 'c)
println(world1)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment