我正在爲Advent of Code編碼挑戰。我對Scala相當陌生,無法弄清楚我的解決方案有什麼問題。代碼2016的問世:第1天
你在某個城市的復活節兔子總部附近空投。不幸的是,「附近」已經儘可能地接近了 - 復活節兔子招募文件中的精靈截獲的指令從這裏開始,沒有人有時間進一步解決它們。
該文件表明您應該從給定的座標(您剛剛着陸的地方)開始並面向北方。然後,按照提供的順序:左轉(L)或右轉(R)90度,然後向前行駛給定數量的街區,結束於新的路口。
雖然沒有時間步行這樣荒謬的指示,所以你花點時間找出目的地。考慮到你只能在城市的街道上行走,到目的地的最短路徑有多遠?
例如:
繼R2,L3讓你2個街區東,3個街區北,或5個街區。
R2,R2,R2留給你2個街區,由於你的起始位置南部,這是2個街區。
R5,L5,R5,R3讓你離開12個街區。 復活節兔子總部有幾個街區?
如果你開始北向左看然後走,你要去西;否則你要去東方。按照這一邏輯的基本方向的休息,我想出了下面的代碼(我評論邏輯的第一塊希望,其餘的後續):
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}")
我的解決方法是錯誤的(對不起我沒有比這更多的信息),所以我必須在某處做出一些邏輯錯誤。我很想知道如何解決這個問題的一些技巧!
你完全正確。我誤解了'foldX' - 我認爲它會在'X'方向上「摺疊」。 – erip