2016年代码问世:第1天

时间:2016-12-01 14:51:02

标签: algorithm scala

我正致力于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}")

我的解决方案是错误的(抱歉我没有比此更多的信息),所以我必须在某处发生一些逻辑错误。我喜欢一些如何解决这个问题的技巧!

2 个答案:

答案 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您的代码有问题。