トラック
/
Go
Go
/
演習
/
アナリンの潜入
アナリンの潜入

アナリンの潜入

学習演習

はじめに

Goでは、真偽値はあらかじめ宣言された真偽値型boolで表します。値はtrueまたはfalseのどちらかです。 これは定義型です。

var closed bool    // boolean variable 'closed' implicitly initialized with 'false'
speeding := true   // boolean variable 'speeding' initialized with 'true'
hasError := false  // boolean variable 'hasError' initialized with 'false' 

Goには、式を真偽値まで評価し、trueまたはfalseを返す3つの論理演算子があります。

演算子 意味
&&(論理積) 両方の命題が真であれば真になります。
||(論理和) 少なくとも一方の命題が真であれば真になります。
!(否定) 命題が偽である場合にのみ真になります。

説明

この演習では、友人が開発している新しいRPGゲームのクエストロジックを実装します。 ゲームの主人公はアナリン。勇敢な女の子で、獰猛で忠実なペットの犬を連れています。 ところが不幸にも、森でベリーを探していた親友が誘拐されてしまいます。 アナリンは親友を見つけて助け出そうとします。このクエストでは、ペットの犬を連れて行くこともできます。

親友の足跡をしばらく追ったあと、親友が囚われている野営地を見つけます。 誘拐犯は2人いました。強大な騎士と、ずる賢い弓使いです。

誘拐犯を見つけたアナリンは、次のうちどの行動が取れるかを考えます:

  • 速攻:騎士が眠っていれば速攻を仕掛けられます。鎧を着るには時間がかかるので、騎士は無防備になるからです。
  • スパイ:3人のうち少なくとも1人が起きていれば、スパイできます。 そうでなければ、スパイは時間の無駄です。
  • 囚人への合図:囚人が起きていて、弓使いが眠っていれば、鳥のさえずりで囚人に合図を送れます。弓使いは鳥の合図を訓練で身につけているので、メッセージを傍受されるおそれがあるからです。
  • 囚人の救出:アナリンは野営地に忍び込んで囚人を解放しようとします。 これは危険な行為で、次の2つのうち、どちらかの方法でしか成功しません:
    • ペットの犬を連れている場合、弓使いが眠っていれば囚人を救出できます。 騎士は犬を怖がり、弓使いはアナリンと囚人が逃げ出す前に準備する時間がありません。
    • 犬を連れていない場合は、アナリンと囚人がとても慎重に行動する必要があります! 囚人が起きていて、騎士と弓使いがどちらも眠っていれば、アナリンは囚人を救出できます。しかし囚人が眠っていると救出できません。囚人はアナリンの突然の登場に驚いて、騎士と弓使いを起こしてしまうからです。

この演習には4つのタスクがあります。森で見つけた3人の状態と、アナリンのペットの犬がいるかどうかに基づいて、上記の行動が可能かどうかを判定するロジックを実装します。

1. 速攻を仕掛けられるか確認する

騎士が起きているかどうかを示す真偽値を受け取るCanFastAttack()関数を定義します。 この関数は、騎士の状態に基づいて速攻を仕掛けられるならtrueを返します。 そうでなければfalseを返します:

var knightIsAwake = true
fmt.Println(CanFastAttack(knightIsAwake))
// Output: false

2. 3人をスパイできるか確認する

騎士、弓使い、囚人がそれぞれ起きているかどうかを示す3つの真偽値を受け取るCanSpy()関数を定義します。 この関数は、3人の状態に基づいてスパイできるならtrueを返します。 そうでなければfalseを返します:

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
fmt.Println(CanSpy(knightIsAwake, archerIsAwake, prisonerIsAwake))
// Output: true

3. 囚人に合図を送れるか確認する

弓使いと囚人がそれぞれ起きているかどうかを示す2つの真偽値を受け取るCanSignalPrisoner()関数を定義します。 この関数は、2人の状態に基づいて囚人に合図を送れるならtrueを返します。 そうでなければfalseを返します:

var archerIsAwake = false
var prisonerIsAwake = true
fmt.Println(CanSignalPrisoner(archerIsAwake, prisonerIsAwake))
// Output: true

4. 囚人を救出できるか確認する

4つの真偽値を受け取るCanFreePrisoner()関数を定義します。 最初の3つの入力は、騎士、弓使い、囚人がそれぞれ起きているかどうかを示します。 最後の入力は、アナリンのペットの犬がいるかどうかを示します。 この関数は、3人の状態とアナリンのペットの犬がいるかどうかに基づいて囚人を救出できるならtrueを返します。 そうでなければfalseを返します:

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
var petDogIsPresent = false
fmt.Println(CanFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent))
// Output: false
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Go Exercism

アナリンの潜入を始める準備はできましたか?

Exercismに登録すれば、34個のコンセプト165個の演習、そして本物の人間によるメンタリングとともに、Goを学んでマスターできます。すべて無料です。