❏ ⅶ アルゴリズム

⒈ 右手法
whille ループの !isOnGem → !isOnClosedSwitch に変更し、 if 関数を追加する。

解答例

解説

func navigateAroundWall() {
    if isBlockedRight {
        moveForward( )
    } else {
       turnRight()
       moveForward()
    }
}

while !isOnClosedSwitch {
    navigateAroundWall()
    if isOnGem {
        collectGem ()
        turnRight()
    }
}
toggleSwitch()
壁を周って進む {
     もし、右が壁なら {
        前に進む
     } そうでなければ {
        右を向く
        前に進む
     }
}

(ループ)切れてるスイッチの上にいない限り {
     壁を周って進む
     もし、宝石の上にいるなら {
        宝石を取る
        右を向く
     }
}
スイッチを入れる


⒉ アルゴリズムを直す
疑似コードを作り、2つの宝石とスイッチの場所に行くにはどのように動けばよいかを考えます。
すでに書かれているコードを直し 実行して、うまくいくように工夫しましょう。

解答例

解説

func navigateAroundWall() {
  if isBlockedRight && isBlocked {
      turnLeft()
  } else if isBlockedRight {
      moveForward()
  } else {
      turnRight()
      moveForward()
  }
}

while !isOnClosedSwitch {
    navigateAroundWall()
    if isOnGem {
        collectGem()
    }
}
toggleSwitch()
navigateAroundWall()の定義 {
  もし、右が壁 そして 前が行き止まり なら {
      左を向く
  } そうでなく もし、右が壁なら {
      前に進む
  } そのいずれでもない場合 {
      右を向く
      前に進む
  }
}

(ループ)切れてるスイッチの上でない限り {
     navigateAroundWall()を実行
     もし、宝石の上にいるなら {
         宝石を取る
     }
}
スイッチを入れる

⒊ 迷路を解く

解答例

解説

func navigateAroundWoll() {
  if isBlockedRight && isBlocked {
        turnLeft()
    } else if isBlockedRight {
        moveForward()
    } else {
        turnRight()
        moveForward()
    }
}

while !isOnGem {
    navigateAroundWoll()
}
collectGem()
navigateAroundWall()の定義 {
  もし、右が壁 そして 前が行き止まり なら {
      左を向く
  } そうでなく もし、右が壁なら {
      前に進む
  } そのいずれでもない場合 {
      右を向く
      前に進む
  }
}

(ループ)宝石の上でない限り {
     navigateAroundWall()を実行
}
宝石を取る

⒋どっちの手を使う?

解答例

解説

while !isOnGem {
  while !isOnClosedSwitch && !isOnGem {
     moveForward()
     if isOnClosedSwitch && isBlocked {
            toggleSwitch()
            turnLeft()
      } else if isOnClosedSwitch {
            toggleSwitch()
            turnRight()
            collectGem()
        }
    }
}
collectGem()
(ループ)宝石の上でない限り {
     (ループ)スイッチが切れて無く更に宝石の上で無い限り {
        前に進む
        もし、スイッチが切れて行き止まりの時は { 
        スイッチを入る
        左に曲がる
    そうで無く もし、スイッチが切れている場合 {
        スイッチを入れる
        左を向く
        宝石を取る
      }
   }
}
宝石を取る

⒌右に行くか、左に行くか

解答例

解説

while !isOnOpenSwitch {
  moveForward()
  if isOnGem {
    collectGem()
    turnRight()
    moveForward()
    collectGem()
  } else if isOnClosedSwitch {
    toggleSwitch()
    turnLeft()
    moveForward()
    toggleSwitch()
  }
  while !isBlocked {
    moveForward()
  }
  if !isBlockedRight {
    turnRight()
  } else {
    turnLeft()
  }
}
(ループ)スイッチの上でない限り {
   前に進む
   もし、宝石の上なら {
     宝石を取る
     右を向く
     前に進む
     宝石を取る
   } そうで無く もし、消えたスイッチの上なら {
     スイッチを入れる
     左を向く
     前に進む
     スイッチを入れる
   }
   (ループ)行き止まりでない限り {
     前に進む
   }
   もし、右が壁で無いなら {
     右を向く
   } そうで無いなら {
     左を向く
   }
}

コメント