August 5, 2018

Exercism Clojure Track - Bob

Bob is a lackadaisical teenager. In conversation, his responses are very limited.

  • Bob answers 'Sure.' if you ask him a question.
  • He answers 'Whoa, chill out!' if you yell at him.
  • He answers 'Calm down, I know what I'm doing!' if you yell a question at him.
  • He says 'Fine. Be that way!' if you address him without actually saying anything.
  • He answers 'Whatever.' to anything else.

Inspired by the 'Deaf Grandma' exercise in Chris Pine's Learn to Program tutorial: http://pine.fm/LearnToProgram/?Chapter=06

(ns bob
  (:require [cljs.test :refer-macros [deftest is run-tests]]
            [clojure.string :as str]))

(defn response-for [s]
  (let [uc (and (= (str/upper-case s) s) (re-find #"[A-Z]+" s))
        q (= (last s) \?)]
    (cond (and q uc) "Calm down, I know what I'm doing!"
          uc "Whoa, chill out!"
          q "Sure."
          (empty? (str/trim s)) "Fine. Be that way!"
          :else "Whatever.")))

(deftest responds-to-something
  (is (= "Whatever." (bob/response-for "Tom-ay-to, tom-aaaah-to."))))

(deftest responds-to-shouts
  (is (= "Whoa, chill out!" (bob/response-for "WATCH OUT!"))))

(deftest responds-to-questions
  (is (= "Sure."
         (bob/response-for "Does this cryogenic chamber make me look fat?"))))

(deftest responds-to-forceful-talking
  (is (= "Whatever." (bob/response-for "Let's go make out behind the gym!"))))

(deftest responds-to-acronyms
  (is (= "Whatever."
         (bob/response-for "It's OK if you don't want to go to the DMV."))))

(deftest responds-to-forceful-questions
  (is (= "Calm down, I know what I'm doing!"
         (bob/response-for "WHAT THE HELL WERE YOU THINKING?"))))

(deftest responds-to-shouting-with-special-characters
  (is (= "Whoa, chill out!"
         (bob/response-for "ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!"))))

(deftest responds-to-shouting-numbers
  (is (= "Whoa, chill out!" (bob/response-for "1, 2, 3 GO!"))))

(deftest responds-to-shouting-with-no-exclamation-mark
  (is (= "Whoa, chill out!" (bob/response-for "I HATE YOU"))))

(deftest responds-to-statement-containing-question-mark
  (is (= "Whatever." (bob/response-for "Ending with ? means a question."))))

(deftest responds-to-silence
  (is (= "Fine. Be that way!" (bob/response-for ""))))

(deftest responds-to-prolonged-silence
  (is (= "Fine. Be that way!" (bob/response-for "    "))))

(deftest responds-to-only-numbers
  (is (= "Whatever." (bob/response-for "1, 2, 3"))))

(deftest responds-to-number-question
  (is (= "Sure." (bob/response-for "4?"))))

(run-tests)
Tags: coding exercises Exercism Clojure