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

アナリンの潜入

学習演習

はじめに

Cairoでは、真偽値はあらかじめ用意されている真偽値型boolで表します。boolがとる値は、trueかfalseのどちらかです。

let speeding = true;   // Boolean variable 'speeding' set to 'true'
let has_error = false; // Boolean variable 'has_error' set to 'false' 

Cairoには、式を真偽値に評価してtrueかfalseを返す論理演算子が3つあります。

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

説明

この演習では、友人が開発中の新しいRPGゲームのクエストロジックを実装します。 ゲームの主人公はAnnalynという、勇敢な少女で、獰猛で忠実な飼い犬を連れています。 ところが不幸にも、森で木の実を探しているときに親友が誘拐されてしまいます。 Annalynは親友を見つけて救い出そうとします。このクエストに飼い犬を連れて行ってもかまいません。

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

誘拐犯を見つけたAnnalynは、次のうちどの行動が取れるかを考えます。

  • 速攻: 騎士が眠っていれば速攻を仕掛けられます。鎧を着るのに時間がかかるため、騎士は無防備になるからです。
  • スパイ: 一味のうち少なくとも1人が起きていれば、スパイできます。 そうでなければ、スパイしても時間の無駄です。
  • 囚人に合図を送る: 囚人が起きていて弓使いが眠っていれば、鳥の鳴き声を使って囚人に合図を送れます。弓使いは鳥の鳴き声による合図を訓練されているので、メッセージを傍受されるおそれがあるからです。
  • 囚人を解放する: Annalynは野営地に忍び込んで囚人を解放しようと試みることができます。 しかしこれは危険な行動で、成功するのは次の2通りの場合だけです:
    • Annalynが飼い犬を連れている場合、弓使いが眠っていれば囚人を助け出せます。 騎士は犬を恐れており、弓使いが準備する前にAnnalynと囚人は逃げ出せるからです。
    • Annalynが犬を連れていない場合は、Annalynと囚人はとても慎重に行動しなければなりません! 囚人が起きていて、騎士と弓使いが両方とも眠っていれば、Annalynは囚人を解放できます。しかし囚人が眠っていると助け出せません。Annalynがいきなり現れると囚人が驚いて、騎士と弓使いを起こしてしまうからです。

取り組むタスクは4つです。森で見つけた3人の状態と、Annalynの飼い犬がいるかどうかに基づいて、上記の行動が実行できるかどうかを判定するロジックを実装します。

1. 速攻ができるかどうかを確認する

騎士が起きているかどうかを示す真偽値を受け取るcan_fast_attack()関数を定義しましょう。 この関数は、騎士の状態に基づいて速攻ができる場合にtrueを返します。 それ以外の場合はfalseを返します:

let knight_awake = true;
can_fast_attack(knight_awake); // false

2. 一味をスパイできるかどうかを確認する

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

let knight_awake = false;
let archer_awake = true;
let prisoner_awake = false;
can_spy(knight_awake, archer_awake, prisoner_awake); // true

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

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

let archer_awake = false;
let prisoner_awake = true;
can_signal_prisoner(archer_awake, prisoner_awake); // true

4. 囚人を解放できるかどうかを確認する

can_free_prisoner()関数を定義しましょう。この関数は4つの真偽値を受け取ります。 最初の3つの仮引数は、それぞれ騎士、弓使い、囚人が起きているかどうかを示します。 最後の仮引数は、Annalynの飼い犬がいるかどうかを示します。 この関数は、3人の状態とAnnalynの飼い犬の有無に基づいて囚人を解放できる場合にtrueを返します。 それ以外の場合はfalseを返します:

let knight_awake = false;
let archer_awake = true;
let prisoner_awake = false;
let dog_present = false;
can_free_prisoner(knight_awake, archer_awake, prisoner_awake, dog_present); // false
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Cairo Exercism

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

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