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

アナリンの潜入

学習演習

はじめに

真偽値

F#の真偽値はbool型で表され、その値はtrueかfalseのどちらかです。

F#では、not(NOT)、&&(AND)、||(OR)という3つの真偽値演算子を使えます。

説明

この演習では、友人が開発している新しいRPGゲームのクエストロジックを実装します。ゲームの主人公はAnnalynで、勇敢な少女であり、獰猛で忠実な飼い犬を連れています。残念ながら、親友が森でベリーを探しているときに誘拐されてしまい、災難が降りかかります。Annalynは親友を見つけて解放しようとし、このクエストに犬を連れて行くこともあります。

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

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

  • 速攻:騎士が眠っていれば速攻できます。鎧を着るのに時間がかかり、その間は無防備になるからです。
  • 偵察:少なくとも1人が起きていれば、集団を偵察できます。そうでなければ、偵察は時間の無駄です。
  • 囚人に合図を送る:囚人が起きていて弓使いが眠っていれば、鳥の鳴き声を使って囚人に合図を送れます。弓使いは鳥の鳴き声による合図の訓練を受けているため、メッセージを傍受される可能性があるからです。
  • 囚人を解放する:Annalynは囚人を解放するために野営地に忍び込むことを試せます。 これは危険な行動で、次の2つの方法のどちらかでしか成功しません。
    • Annalynが飼い犬を連れていれば、弓使いが眠っているときに囚人を救出できます。 騎士は犬を怖がり、Annalynと囚人が逃げる前に弓使いが準備する時間はありません。
    • Annalynが犬を連れていなければ、Annalynと囚人はとても慎重に行動しなければなりません。 Annalynは、囚人が起きていて騎士と弓使いがどちらも眠っていれば囚人を解放できますが、囚人が眠っていると救出できません。囚人はAnnalynの突然の登場に驚いて、騎士と弓使いを起こしてしまうからです。

4つのタスクがあります。森で見つけた3人のキャラクターの状態と、Annalynの飼い犬がいるかどうかに基づいて、上記の行動が可能かどうかを判断するロジックを実装します。

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

canFastAttack関数を実装します。この関数は、騎士が起きているかどうかを示す真偽値を受け取ります。この関数は、騎士の状態に基づいて速攻できる場合にtrueを返します。そうでなければfalseを返します。

let knightIsAwake = true
canFastAttack(knightIsAwake)
// => false

2. 集団を偵察できるかどうかを確認する

canSpy関数を実装します。この関数は3つの真偽値を受け取ります。それぞれ、騎士、弓使い、囚人が起きているかどうかを示します。この関数は、3人の状態に基づいて集団を偵察できる場合にtrueを返します。そうでなければfalseを返します。

let knightIsAwake = false
let archerIsAwake = true
let prisonerIsAwake = false
canSpy(knightIsAwake, archerIsAwake, prisonerIsAwake)
// => true

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

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

let archerIsAwake = false
let prisonerIsAwake = true
canSignalPrisoner(archerIsAwake, prisonerIsAwake)
// => true

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

canFreePrisoner関数を実装します。この関数は4つの真偽値を受け取ります。最初の3つの入力は、それぞれ騎士、弓使い、囚人が起きているかどうかを示します。最後の入力は、Annalynの飼い犬がいるかどうかを示します。この関数は、3人の状態とAnnalynの飼い犬の有無に基づいて囚人を解放できる場合にtrueを返します。そうでなければfalseを返します。

let knightIsAwake = false
let archerIsAwake = true
let prisonerIsAwake = false
let petDogIsPresent = false
canFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent)
// => false
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
F# Exercism

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

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