2016-12-01 46 views
0

我正在爲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}") 

我的解決方法是錯誤的(對不起我沒有比這更多的信息),所以我必須在某處做出一些邏輯錯誤。我很想知道如何解決這個問題的一些技巧!

回答

4

您的錯誤是您正確摺疊,因此您按不正確的順序應用了方向。您應該使用foldLeft(或reversedirections列表)。

+0

你完全正確。我誤解了'foldX' - 我認爲它會在'X'方向上「摺疊」。 – erip

1

foldRight是你的問題。它從方向列表的最後一個元素開始,並通過它們後退。改爲使用foldLeft

你是怎麼測試你的代碼的?或者你是否?我在我的終端中打開scala,發現了你的問題,創建了一個名爲run的函數,它取得了一個directions: Seq[String]參數,並將你的代碼粘貼到函數體中。然後,我用一個簡單的測試情況下將其稱爲:

scala> run(Seq("R2", "R2", "R2", "L2")) 

你可以通過使用例如測試案例,他們提供想通了這一點。 R5 L5 R5 R3對您的代碼有誤。

+0

@emKaroly這聽起來好像是你最好採取以代碼的人的出現問題 – Zeimyth

相關問題