Skip to content

Commit baf9be5

Browse files
committed
Refactoring. Calculate from which rooms and doors we could come into each room.
1 parent 9f7aa0b commit baf9be5

File tree

3 files changed

+34
-21
lines changed

3 files changed

+34
-21
lines changed

build.sbt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ libraryDependencies ++= Seq(
44
"com.softwaremill.sttp.client4" %% "upickle" % "4.0.10",
55
"org.scalatest" %% "scalatest" % "3.2.19" % Test
66
)
7+
8+
scalacOptions ++= Seq("-explain")

src/main/scala/ru/org/codingteam/icfpc_2025/Domain.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ case class SolutionDefinition(
4141
case class ConnectionDefinition(from: Door, to: Door) derives ReadWriter
4242
case class Door(room: Int, door: Int) derives ReadWriter
4343

44-
case class KnowledgeHolder(visitedRoutes: Vector[Vector[Int]], results: Vector[Vector[Int]]) derives ReadWriter {
44+
case class KnowledgeHolder(visitedRoutes: Vector[Vector[Int]], visitedRooms: Vector[Vector[Int]]) derives ReadWriter {
4545
def incorporateKnowledge(plans: Seq[Seq[Int]], results: Seq[Seq[Int]]): KnowledgeHolder =
4646
KnowledgeHolder(
4747
this.visitedRoutes ++ plans.map(_.toVector),
48-
this.results ++ results.map(_.toVector)
48+
this.visitedRooms ++ visitedRooms.map(_.toVector)
4949
)
5050
}
5151

5252
enum Step:
5353
case ExploreStep(plans: Seq[Seq[Int]])
5454
case GuessStep(solution: SolutionDefinition)
55-
case StopGuessing()
55+
case StopGuessing()

src/main/scala/ru/org/codingteam/icfpc_2025/Solver.scala

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,32 +37,43 @@ object Solver {
3737
}
3838

3939
private def nextStep(problem: ProblemDefinition, knowledge: KnowledgeHolder): Step =
40-
var ede = Map.empty[(Int, Int), Seq[Int]]
40+
// (room, door in that room) -> (possible destination rooms)
41+
var roomAndDoorToPossibleRooms = Map.empty[(Int, Int), Seq[Int]]
4142

4243
for (j <- knowledge.visitedRoutes.indices) {
4344
val plan = knowledge.visitedRoutes(j)
44-
val rooms = knowledge.results(j)
45+
val rooms = knowledge.visitedRooms(j)
4546

4647
for (i <- plan.indices) {
4748
val door = plan(i)
48-
val enter = rooms(i)
49-
val exit = rooms(i + 1)
49+
val roomFrom = rooms(i)
50+
val roomTo = rooms(i + 1)
5051

51-
val key = (enter, door)
52+
val key = (roomFrom, door)
5253

53-
if (!ede.contains(key)) {
54-
ede += (key -> Seq(exit))
55-
} else if (!ede(key).contains(exit)) {
56-
ede += (key -> (ede(key) :+ exit))
54+
if (!roomAndDoorToPossibleRooms.contains(key)) {
55+
roomAndDoorToPossibleRooms += (key -> Seq(roomTo))
56+
} else if (!roomAndDoorToPossibleRooms(key).contains(roomTo)) {
57+
roomAndDoorToPossibleRooms += (key -> (roomAndDoorToPossibleRooms(key) :+ roomTo))
5758
}
5859
}
5960
}
60-
61-
val eded: Map[(Int, Int), Seq[(Int, Int)]] =
62-
ede.map { case (key @ (a, b), exits) =>
63-
val relatedKeys = ede.keys.filter { case (x, y) => exits.contains(x) && ede(x, y).contains(a) }.toSeq
64-
key -> relatedKeys
65-
}
61+
//for ((key, roomsTo) <- roomAndDoorToPossibleRooms)
62+
// println(s"$key => $roomsTo")
63+
64+
// (room) -> (room from which we could come into room in key, door in source room)
65+
var roomToPossibleRoomAndDoorFrom = Map.empty[Int, Set[(Int,Int)]]
66+
for ((key, roomsTo) <- roomAndDoorToPossibleRooms) {
67+
val roomFrom = key._1
68+
val relatedKeys : Set[(Int,Int)] = roomAndDoorToPossibleRooms.keys.filter { case (room, door) => roomsTo.contains(room) && roomAndDoorToPossibleRooms(room, door).contains(roomFrom) }.toSet
69+
if (!roomToPossibleRoomAndDoorFrom.contains(roomFrom)) {
70+
roomToPossibleRoomAndDoorFrom += (roomFrom -> relatedKeys)
71+
} else {
72+
roomToPossibleRoomAndDoorFrom += (roomFrom -> (roomToPossibleRoomAndDoorFrom(roomFrom) ++ relatedKeys))
73+
}
74+
}
75+
//for ((key, value) <- roomToPossibleRoomAndDoorFrom)
76+
// println(s"$key => $value")
6677

6778
// I did not implemented it, but someone moore clever than me can implement the following approach:
6879
// 1) make a walk using routes and map of exit-door <-> possible enter-doors (eded var)
@@ -88,6 +99,6 @@ object Solver {
8899
private def explore(problem: ProblemDefinition, knowledge: KnowledgeHolder, plans: Seq[Seq[Int]]): KnowledgeHolder =
89100
println("Exploring the labyrinth...")
90101
println("Plans:\n" + plans.map(_.mkString(" ")).mkString(start = "- ", sep = "\n", end = ""))
91-
val results = Ædificium.explore(plans)
92-
println("Exploration results:\n" + results.map(_.mkString(" ")).mkString(start = "- ", sep = "\n", end = ""))
93-
knowledge.incorporateKnowledge(plans, results)
102+
val visitedRooms = Ædificium.explore(plans)
103+
println("Exploration results:\n" + visitedRooms.map(_.mkString(" ")).mkString(start = "- ", sep = "\n", end = ""))
104+
knowledge.incorporateKnowledge(plans, visitedRooms)

0 commit comments

Comments
 (0)