diff --git a/exercises/solutions-5.md b/exercises/solutions-5.md deleted file mode 100644 index bc65596b48a279b447b50bd64480bb05321ce7e9..0000000000000000000000000000000000000000 --- a/exercises/solutions-5.md +++ /dev/null @@ -1,118 +0,0 @@ -# Exercise 1 : Message Processing Semantics - -For the `Client1` actor, the only possible output is 1. The reason is that messages between two actors are guaranteed to be received in the order they were sent. - -For the `Client2` actor, either 0 or 1 can be printed. There are no restrictions on the order in which messages are processed in this case. It might be the case that the `Memory` actor receives the `Write` message from the `Client2` first, or the Read message from the `Proxy` first. The order in which the messages are sent by the `Client2` doesn't change the possible behaviours of the system. In the case both messages are sent through the `Proxy`, then the only possible output is 1, since in this case the messages between the `Client2` and `Proxy`, as well as between `Proxy` and `Memory`, are guaranteed to be handled in the same order they were sent. - -## Exercise 2 : The Josephus Problem - -```scala -import akka.actor._ - -class Soldier(number: Int) extends Actor { - - import Soldier._ - - def receive: Receive = behavior(None, None, false) - - def behavior(next: Option[ActorRef], - killer: Option[ActorRef], - mustAct: Boolean): Receive = { - - case Death => next match { - case Some(myNext) => - sender ! Next(myNext) - myNext ! Act - println("Soldier " + number + " dies.") - self ! PoisonPill - - case None => - context.become(behavior( - next = None, - killer = Some(sender), - mustAct = mustAct)) - } - - case Next(newNext) => - if (newNext == self) { - println("Soldier " + number + " is last !") - } else if (!killer.isEmpty) { - killer.get ! Next(newNext) - newNext ! Act - println("Soldier " + number + " dies.") - self ! PoisonPill - } else if (mustAct) { - newNext ! Death - context.become(behavior( - next = None, - killer = None, - mustAct = false)) - } else { - context.become(behavior( - next = Some(newNext), - killer = None, - mustAct = false)) - } - } - - - case Act => next match { - case Some(myNext) => - myNext ! Death - context.become(behavior( - next = None, - killer = killer, - mustAct = false)) - - case None => - context.become(behavior( - next = None, - killer = killer, - mustAct = true)) - } - } -} - - -object Soldier { - // The different messages that can be sent between the actors: - - // The recipient should die. - case object Death - - // The recipient should update its next reference. - case class Next(next: ActorRef) - - // The recipient should act. - case object Act - - def props(number: Int): Props = Props(new Soldier(number)) -} - - -object Simulation { - - import Soldier._ - - // Initialization - val system = ActorSystem("mySystem") - - def start(n: Int) { - require(n >= 1) - - // Creation of the actors. - val actors = Seq.tabulate(n) { (i: Int) => - system.actorOf(Soldier.props(i), "Soldier" + i) - } - - // Inform all actors of the next actor in the circle. - for (i <- 0 to (n - 2)) { - actors(i) ! Next(actors(i + 1)) - } - actors(n - 1) ! Next(actors(0)) - - // Inform the first actor to start acting. - actors(0) ! Act - } -} -```