我正致力于Advent of Code的编码挑战。我是Scala的新手,无法弄清楚我的解决方案有什么问题。
你在某个城市的复活节兔子总部附近空投了。不幸的是,在#34;附近,你已经尽可能接近了 - 精灵截获的复活节兔子招募文件上的说明从这里开始,没有人有时间进一步解决这些问题。
文档表明你应该从给定的坐标(你刚刚降落的地方)开始并面向北方。然后,按照提供的顺序:向左(L)或向右(R)向左转90度,然后向前走,给定数量的块,在新的交叉点结束。
但是,现在没有时间徒步地遵循这些荒谬的指示,所以你需要花一点时间来完成目的地。鉴于你只能在城市的街道上行走,到达目的地的最短路径到底有多远?
例如:
在R2之后,L3离开你东2个街区,向北3个街区,或5个街区之外。
R2,R2,R2离开你的起始位置南边的2个街区,距离2个街区。
R5,L5,R5,R3让你离开12个街区。 距离Easter Bunny HQ有几个街区?
如果你从北方开始往左看然后走,你就往西走;否则你会去东方。按照其余主要方向的逻辑,我提出了以下代码(我已经评论了第一个逻辑块,希望其余部分遵循):
object Facing extends Enumeration {
val North, South, East, West = Value
}
// We're at (0, 0) facing north to begin with.
// directions is a list of instructions (i.e., ((LN)|(RM))+)
val (x, y, _) = directions.foldRight((0,0, Facing.North)){(d, prev) =>
println(s"Instruction is $d")
val dir = d(0)
val dist = d.substring(1).toInt
val (x, y, looking) = prev
println(s"x = ${x}, y = ${y}")
println(s"Prior is = $prev")
looking match {
case Facing.North => {
if(dir == 'R') {
// If we're facing north and told to go R<dist>, we face east
// then update the x to dist away. etc.
val res = (x + dist, y, Facing.East)
println(res)
res
} else {
val res = (x - dist, y, Facing.West)
println(res)
res
}
}
case Facing.South => {
if(dir == 'L') {
val res = (x + dist, y, Facing.East)
println(res)
res
} else {
val res = (x - dist, y, Facing.West)
println(res)
res
}
}
case Facing.East => {
if(dir == 'L') {
val res = (x, y + dist, Facing.North)
println(res)
res
} else {
val res = (x, y - dist, Facing.South)
println(res)
res
}
}
case Facing.West => {
if(dir == 'L') {
val res = (x, y - dist, Facing.South)
println(res)
res
} else {
val res = (x, y + dist, Facing.North)
println(res)
res
}
}
}
}
println(s"Distance is ${x.abs + y.abs}")
我的解决方案是错误的(抱歉我没有比此更多的信息),所以我必须在某处发生一些逻辑错误。我喜欢一些如何解决这个问题的技巧!
答案 0 :(得分:4)
您的错误是您向右折叠,因此您按照错误的顺序应用说明。您应该使用foldLeft
(或reverse
directions
列表。)
答案 1 :(得分:1)
foldRight
是你的问题。它从方向列表的最后一个元素开始,然后通过它们向后退。请改用foldLeft
。
您是如何测试代码的?或者你去过吗?我在终端中打开scala
找到了您的问题,创建了一个名为run
的函数,该函数接受directions: Seq[String]
参数并将代码粘贴到函数体中。然后我用一个简单的测试用例调用它:
scala> run(Seq("R2", "R2", "R2", "L2"))
您可以通过使用他们提供的示例测试用例来解决这个问题。 R5 L5 R5 R3
您的代码有问题。