Avatar of 4d47
0
0
Genius
0
0

4d47's solution

to Bob in the Perl 6 Track

0
0
Genius
0
0
Instructions
Test suite
Solution

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.

Bob's conversational partner is a purist when it comes to written communication and always follows normal rules regarding sentence punctuation in English.

Resources

Remember to check out the Perl 6 documentation and resources pages for information, tips, and examples if you get stuck.

Running the tests

There is a test suite and module included with the exercise. The test suite (a file with the extension .t) will attempt to run routines from the module (a file with the extension .pm6). Add/modify routines in the module so that the tests will pass! You can view the test data by executing the command perl6 --doc *.t (* being the name of the test suite), and run the test suite for the exercise by executing the command prove6 . in the exercise directory.

Source

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

Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

bob.t

#!/usr/bin/env perl6
use v6;
use Test;
use JSON::Fast;
use lib $?FILE.IO.dirname; #`[Look for the module inside the same directory as this test file.]
use Bob;
plan 26; #`[This is how many tests we expect to run.]

#`[Check that the class 'Bob' can use all of the methods
needed in the tests (only 'hey' for this one).]
subtest 'Class methods', {
  can-ok Bob, $_ for <hey>;
}

my $c-data = from-json $=pod.pop.contents;
# Go through the cases and check that Bob gives us the correct responses.
is Bob.?hey(.<input><heyBob>), |.<expected description> for @($c-data<cases>);

=head2 Canonical Data
=begin code
{
  "exercise": "bob",
  "version": "1.2.0",
  "cases": [
    {
      "description": "stating something",
      "property": "response",
      "input": {
        "heyBob": "Tom-ay-to, tom-aaaah-to."
      },
      "expected": "Whatever."
    },
    {
      "description": "shouting",
      "property": "response",
      "input": {
        "heyBob": "WATCH OUT!"
      },
      "expected": "Whoa, chill out!"
    },
    {
      "description": "shouting gibberish",
      "property": "response",
      "input": {
        "heyBob": "FCECDFCAAB"
      },
      "expected": "Whoa, chill out!"
    },
    {
      "description": "asking a question",
      "property": "response",
      "input": {
        "heyBob": "Does this cryogenic chamber make me look fat?"
      },
      "expected": "Sure."
    },
    {
      "description": "asking a numeric question",
      "property": "response",
      "input": {
        "heyBob": "You are, what, like 15?"
      },
      "expected": "Sure."
    },
    {
      "description": "asking gibberish",
      "property": "response",
      "input": {
        "heyBob": "fffbbcbeab?"
      },
      "expected": "Sure."
    },
    {
      "description": "talking forcefully",
      "property": "response",
      "input": {
        "heyBob": "Let's go make out behind the gym!"
      },
      "expected": "Whatever."
    },
    {
      "description": "using acronyms in regular speech",
      "property": "response",
      "input": {
        "heyBob": "It's OK if you don't want to go to the DMV."
      },
      "expected": "Whatever."
    },
    {
      "description": "forceful question",
      "property": "response",
      "input": {
        "heyBob": "WHAT THE HELL WERE YOU THINKING?"
      },
      "expected": "Calm down, I know what I'm doing!"
    },
    {
      "description": "shouting numbers",
      "property": "response",
      "input": {
        "heyBob": "1, 2, 3 GO!"
      },
      "expected": "Whoa, chill out!"
    },
    {
      "description": "only numbers",
      "property": "response",
      "input": {
        "heyBob": "1, 2, 3"
      },
      "expected": "Whatever."
    },
    {
      "description": "question with only numbers",
      "property": "response",
      "input": {
        "heyBob": "4?"
      },
      "expected": "Sure."
    },
    {
      "description": "shouting with special characters",
      "property": "response",
      "input": {
        "heyBob": "ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!"
      },
      "expected": "Whoa, chill out!"
    },
    {
      "description": "shouting with no exclamation mark",
      "property": "response",
      "input": {
        "heyBob": "I HATE YOU"
      },
      "expected": "Whoa, chill out!"
    },
    {
      "description": "statement containing question mark",
      "property": "response",
      "input": {
        "heyBob": "Ending with ? means a question."
      },
      "expected": "Whatever."
    },
    {
      "description": "non-letters with question",
      "property": "response",
      "input": {
        "heyBob": ":) ?"
      },
      "expected": "Sure."
    },
    {
      "description": "prattling on",
      "property": "response",
      "input": {
        "heyBob": "Wait! Hang on. Are you going to be OK?"
      },
      "expected": "Sure."
    },
    {
      "description": "silence",
      "property": "response",
      "input": {
        "heyBob": ""
      },
      "expected": "Fine. Be that way!"
    },
    {
      "description": "prolonged silence",
      "property": "response",
      "input": {
        "heyBob": "          "
      },
      "expected": "Fine. Be that way!"
    },
    {
      "description": "alternate silence",
      "property": "response",
      "input": {
        "heyBob": "\t\t\t\t\t\t\t\t\t\t"
      },
      "expected": "Fine. Be that way!"
    },
    {
      "description": "multiple line question",
      "property": "response",
      "input": {
        "heyBob": "\nDoes this cryogenic chamber make me look fat?\nno"
      },
      "expected": "Whatever."
    },
    {
      "description": "starting with whitespace",
      "property": "response",
      "input": {
        "heyBob": "         hmmmmmmm..."
      },
      "expected": "Whatever."
    },
    {
      "description": "ending with whitespace",
      "property": "response",
      "input": {
        "heyBob": "Okay if like my  spacebar  quite a bit?   "
      },
      "expected": "Sure."
    },
    {
      "description": "other whitespace",
      "property": "response",
      "input": {
        "heyBob": "\n\r \t"
      },
      "expected": "Fine. Be that way!"
    },
    {
      "description": "non-question ending with whitespace",
      "property": "response",
      "input": {
        "heyBob": "This is a statement ending with whitespace      "
      },
      "expected": "Whatever."
    }
  ]
}
=end code
unit class Bob;

method hey(Str $input --> Str) {
    given $input.trim {
        when / <:Letter> / && .uc eq $_ { 'Whoa, chill out!' }
        when .ends-with('?') { 'Sure.' }
        when '' { 'Fine. Be that way!' }
        default { 'Whatever.' }
    }
}

What can you learn from this solution?

A huge amount can be learnt from reading other people’s code. This is why we wanted to give exercism users the option of making their solutions public.

Here are some questions to help you reflect on this solution and learn the most from it.

  • What compromises have been made?
  • Are there new concepts here that I could read more about to develop my understanding?