論理演算子 5. 論理の迷宮

論理演算子を使った総ざらいの設問です。NOT、AND、ORを使いこなしてクリアを目指しましょう。

ステージのポイントとしては、宝石と閉スイッチの両方があるマスでは右に脇道があって2マス先に宝石、というパターンが見て取れます。
次に曲がる位置ですが、行き止まりとは限らないのでisBlockedを条件にするのは適切ではないようですよ?

論理演算子 4. 一方でも正しければ合格

AND(&&)に続いてOR(||)です。

のように、2つの間に「||」を入れます。条件AとBのどちらかがtrueであれば全体としてはtrue扱いになります。整理すると以下のようになります。

条件Aの結果条件Bの結果(条件A && 条件B)の結果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

ANDが4パターンに1つしかtrueにならなかったのと比べるとORは逆に1パターンを除いてtrueという緩い論理演算という感じです。

ステージは、出題文でほぼ解説されています。「前が行き止まりの場合と左が行き止まりの場合を考えます」とあり、どちらの場合もやることは同じなので、ORを使ってどちらかが当てはまれば(真であるならば)その条件を実行します。「3 どちらも当てはまらない場合は、前に進みます」とありますが、実際のところは当てはまって曲がった場合も前に進むことにはかわらないなと思って、下のようにしてみました。もちろん普通にelseブロックにmoveForward()をしても良いでしょう。その場合はループの回数が少しかわってくるかも知れません。

論理演算子 3. 両方正しければ合格

NOTの次に登場する論理演算子がAND演算子です。trueかfalseのどちらかの結果いなる条件(ブール条件)を2つあわせて、その両方ともがtrueかどうかを判定します。書き方は、

のように、2つの間に「&&」を入れます。AND演算子という名前ですがSwiftではANDを2つ書くところに注意しましょう。
条件AとBの両方がtrueにならないといけないので、条件A/BとAND演算結果の関係を整理すると以下のようになります。

条件Aの結果条件Bの結果(条件A && 条件B)の結果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

狭き門ですね。

ステージの法則性としては、真っ直ぐ行き当たりまで進む中で、「宝石があってかつ左が行き止まりな時は右に脇道があって閉スイッチがある」というもののようです。左が行き止まりかどうかは新しい条件isBlockedLeftで確認できます。左が行き止まりならtrue、行き止まりでなければfalseが返ります。

つまり、

  1. 宝石がありかつ左が行き止まりならば、右へ進んで閉スイッチを切換に行きます。もちろん宝石もとります。
  2. 宝石だけならそれをとるだけです。
  3. 宝石すらない場合はなにもせずただ進みます。

論理演算子 2. NOTで周る

正面が行き止まりならtrue、行き止まりでなければ(moveFoward()可能なら)falseを返すisBlockedという条件が登場します。

このステージもisBlockedがtrueの時とfalseの時どちらにも処理があるので!を使って反転させる意味は薄いのですが、設問で使うことが指示されているので、きちっと使いましょう。強いて言えば、条件分岐isBlockedの結果はfalse(行き止まりでない)になることが基本なので、まずはそちらの処理を先に書いて、例外として行き止まった時の処理を後にする方が、「いけるとこまで行く、突き当たったら曲がる」という思考にマッチしてコードが読みやすい、という効果があると思います。

論理演算子 1. NOT演算子を使う

論理演算子はif文や後で出てくるwhile文などの条件により柔軟で複雑な指定をできるようにするテクニックです。最初はもっとも単純なNOT演算子。ブール値のtrueをfalseに、falseをtrueにと反転します。どんな時に役に立つのでしょう?
例えば、宝石の有無をチェックするisOnGemというのがありました。宝石があったらtrue、なければfalseとなるので、if文では

なんて書きます。ただし、宝石がなかった時にしかやりたいことがなかったらどうでしょう?最初のtrue処理のブロックを空にしてもいいんですが、ちょっと無駄っぽいです。そんな時にisOnGemの前に!をつけてtrueをfalseを逆転させてやるのです。

isOnGemがtrueだった時、!によってひっくり返ってif文にはfalseだと伝えられます。!は天邪鬼(あまのじゃく)な伝言係なのです。

さてステージの方は4マスの中心ルートを進みながら、宝石があったらとり、なかったら脇道へ降りていった先の宝石をとって戻ります。ぶっちゃけ!で反転しなくても全体の行数は変わらないのですが、練習だと思って!を使ってtrueブロックとfalseブロックの中身が逆になることを実感してみてください。