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

アナリンの潜入

学習演習

はじめに

Clojureの真偽値は、trueかfalseで表します。

述語関数(真偽値を返す関数)は、ふつう疑問符(?)で終わりますが、これはあくまで慣習です。

コアライブラリには、not、and、orなどの論理演算子のための関数が用意されています。

説明

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

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

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

  • 速攻:騎士が眠っていれば速攻できます。騎士が鎧を着るには時間がかかり、その間は無防備になるからです。
  • スパイ:グループの少なくとも1人が起きていれば、偵察できます。そうでなければ、スパイは時間の無駄です。
  • 囚人に合図を送る:囚人が起きていて弓兵が眠っていれば、鳥のさえずりで囚人に合図を送れます。弓兵は鳥の合図の訓練を受けているので、起きていればメッセージを傍受されるおそれがあります。
  • 囚人を解放する:Annalynは囚人を解放するために、野営地に忍び込もうとします。 これは危険な行動で、次の2つの方法のどちらかでしか成功しません。
    • Annalynがペットの犬を連れている場合、弓兵が眠っていれば囚人を救出できます。 騎士は犬を恐れており、Annalynと囚人が逃げる前に弓兵が準備する時間はありません。
    • Annalynが犬を連れていない場合は、Annalynと囚人はとても慎重に行動しなければなりません! 囚人が起きていて、騎士と弓兵がどちらも眠っていれば、Annalynは囚人を解放できます。しかし囚人が眠っていると救出できません。Annalynがいきなり現れると囚人が驚いて、騎士と弓兵を起こしてしまうからです。

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

1. 速攻できるか確認する

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

(def knight-awake? true)

(can-fast-attack? knight-awake?)
;;=> false

2. グループを偵察できるか確認する

騎士、弓兵、囚人がそれぞれ起きているかどうかを示す3つの真偽値を受け取るcan-spy?関数を実装します。この関数は、3人の状態に基づいてグループを偵察できる場合はtrueを返します。そうでなければfalseを返します。

(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)

(can-spy? knight-awake? archer-awake? prisoner-awake?)
;;=> true

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

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

(def archer-awake? false)
(def prisoner-awake? true)

(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true

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

4つの真偽値を受け取るcan-free-prisoner?関数を実装します。最初の3つの仮引数は、騎士、弓兵、囚人がそれぞれ起きているかどうかを示します。最後の仮引数は、Annalynのペットの犬がいるかどうかを示します。この関数は、3人の状態とAnnalynのペットの犬がいるかどうかに基づいて囚人を解放できる場合はtrueを返します。そうでなければfalseを返します。

(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(def dog-present? false)

(can-free-prisoner? knight-awake? archer-awake? prisoner-awake? dog-present?)
;;=> false
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Clojure Exercism

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

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