diff --git a/config.json b/config.json index 6b18bb9..25a0ba1 100644 --- a/config.json +++ b/config.json @@ -226,6 +226,14 @@ "practices": [], "prerequisites": [], "difficulty": 4 + }, + { + "slug": "bob", + "name": "Bob", + "uuid": "c17ed683-e851-4b45-a4a7-f127dadb1b01", + "practices": [], + "prerequisites": [], + "difficulty": 2 } ] }, diff --git a/exercises/practice/bob/.docs/instructions.md b/exercises/practice/bob/.docs/instructions.md new file mode 100644 index 0000000..bb702f7 --- /dev/null +++ b/exercises/practice/bob/.docs/instructions.md @@ -0,0 +1,19 @@ +# Instructions + +Your task is to determine what Bob will reply to someone when they say something to him or ask him a question. + +Bob only ever answers one of five things: + +- **"Sure."** + This is his response if you ask him a question, such as "How are you?" + The convention used for questions is that it ends with a question mark. +- **"Whoa, chill out!"** + This is his answer if you YELL AT HIM. + The convention used for yelling is ALL CAPITAL LETTERS. +- **"Calm down, I know what I'm doing!"** + This is what he says if you yell a question at him. +- **"Fine. Be that way!"** + This is how he responds to silence. + The convention used for silence is nothing, or various combinations of whitespace characters. +- **"Whatever."** + This is what he answers to anything else. diff --git a/exercises/practice/bob/.docs/introduction.md b/exercises/practice/bob/.docs/introduction.md new file mode 100644 index 0000000..ea4a807 --- /dev/null +++ b/exercises/practice/bob/.docs/introduction.md @@ -0,0 +1,10 @@ +# Introduction + +Bob is a [lackadaisical][] teenager. +He likes to think that he's very cool. +And he definitely doesn't get excited about things. +That wouldn't be cool. + +When people talk to him, his responses are pretty limited. + +[lackadaisical]: https://www.collinsdictionary.com/dictionary/english/lackadaisical diff --git a/exercises/practice/bob/.meta/config.json b/exercises/practice/bob/.meta/config.json new file mode 100644 index 0000000..198b7a4 --- /dev/null +++ b/exercises/practice/bob/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "IsaaG" + ], + "files": { + "solution": [ + "bob.gd" + ], + "test": [ + "bob_test.gd" + ], + "example": [ + ".meta/example.gd" + ] + }, + "blurb": "Bob is a lackadaisical teenager. In conversation, his responses are very limited.", + "source": "Inspired by the 'Deaf Grandma' exercise in Chris Pine's Learn to Program tutorial.", + "source_url": "https://pine.fm/LearnToProgram/chap_06.html" +} diff --git a/exercises/practice/bob/.meta/example.gd b/exercises/practice/bob/.meta/example.gd new file mode 100644 index 0000000..3862c2f --- /dev/null +++ b/exercises/practice/bob/.meta/example.gd @@ -0,0 +1,13 @@ +func response(message: String) -> String: + message = message.strip_edges() + if message == "": + return "Fine. Be that way!" + if message.ends_with("?"): + if message.to_upper() == message and message.to_upper() != message.to_lower(): + return "Calm down, I know what I'm doing!" + return "Sure." + if message.to_upper() == message.to_lower(): + return "Whatever." + if message.to_upper() == message: + return "Whoa, chill out!" + return "Whatever." diff --git a/exercises/practice/bob/.meta/template.j2 b/exercises/practice/bob/.meta/template.j2 new file mode 100644 index 0000000..be5a1ba --- /dev/null +++ b/exercises/practice/bob/.meta/template.j2 @@ -0,0 +1,7 @@ +{% for case in cases %} +func test_{{ case["func_name"] }}(solution_script): + var want = "{{ case["expected"] }}" + var got = solution_script.{{ case["property"] }}("{{ case["input"]["heyBob"] }}") + return [got, want] + +{% endfor %} diff --git a/exercises/practice/bob/.meta/tests.toml b/exercises/practice/bob/.meta/tests.toml new file mode 100644 index 0000000..c6a4649 --- /dev/null +++ b/exercises/practice/bob/.meta/tests.toml @@ -0,0 +1,93 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[8a2e771d-d6f1-4e3f-b6c6-b41495556e37] +description = "asking a question" + +[73a966dc-8017-47d6-bb32-cf07d1a5fcd9] +description = "shouting" + +[a5193c61-4a92-4f68-93e2-f554eb385ec6] +description = "forceful question" + +[bc39f7c6-f543-41be-9a43-fd1c2f753fc0] +description = "silence" + +[e162fead-606f-437a-a166-d051915cea8e] +description = "stating something" + +[81080c62-4e4d-4066-b30a-48d8d76920d9] +description = "asking a numeric question" + +[2a02716d-685b-4e2e-a804-2adaf281c01e] +description = "asking gibberish" + +[bb0011c5-cd52-4a5b-8bfb-a87b6283b0e2] +description = "question with no letters" + +[9bfc677d-ea3a-45f2-be44-35bc8fa3753e] +description = "non-letters with question" + +[8608c508-f7de-4b17-985b-811878b3cf45] +description = "prattling on" + +[05b304d6-f83b-46e7-81e0-4cd3ca647900] +description = "ending with whitespace" + +[66953780-165b-4e7e-8ce3-4bcb80b6385a] +description = "multiple line question" +include = false + +[2c7278ac-f955-4eb4-bf8f-e33eb4116a15] +description = "multiple line question" +reimplements = "66953780-165b-4e7e-8ce3-4bcb80b6385a" + +[d6c98afd-df35-4806-b55e-2c457c3ab748] +description = "shouting gibberish" + +[3c954328-86fb-4c71-8961-e18d6a5e2517] +description = "shouting a statement containing a question mark" + +[a20e0c54-2224-4dde-8b10-bd2cdd4f61bc] +description = "shouting numbers" + +[496143c8-1c31-4c01-8a08-88427af85c66] +description = "shouting with special characters" + +[e6793c1c-43bd-4b8d-bc11-499aea73925f] +description = "shouting with no exclamation mark" + +[d6c47565-372b-4b09-b1dd-c40552b8378b] +description = "prolonged silence" + +[4428f28d-4100-4d85-a902-e5a78cb0ecd3] +description = "alternate silence" + +[72bd5ad3-9b2f-4931-a988-dce1f5771de2] +description = "other whitespace" + +[c02f9179-ab16-4aa7-a8dc-940145c385f7] +description = "talking forcefully" + +[153c0e25-9bb5-4ec5-966e-598463658bcd] +description = "using acronyms in regular speech" + +[f7bc4b92-bdff-421e-a238-ae97f230ccac] +description = "no letters" + +[aa8097cc-c548-4951-8856-14a404dd236a] +description = "statement containing question mark" + +[5371ef75-d9ea-4103-bcfa-2da973ddec1b] +description = "starting with whitespace" + +[12983553-8601-46a8-92fa-fcaa3bc4a2a0] +description = "non-question ending with whitespace" diff --git a/exercises/practice/bob/bob.gd b/exercises/practice/bob/bob.gd new file mode 100644 index 0000000..0537bdd --- /dev/null +++ b/exercises/practice/bob/bob.gd @@ -0,0 +1,2 @@ +func response(message: String) -> String: + pass diff --git a/exercises/practice/bob/bob_test.gd b/exercises/practice/bob/bob_test.gd new file mode 100644 index 0000000..c3db614 --- /dev/null +++ b/exercises/practice/bob/bob_test.gd @@ -0,0 +1,157 @@ +func test_asking_a_question(solution_script): + var want = "Sure." + var got = solution_script.response("Does this cryogenic chamber make me look fat?") + return [got, want] + + +func test_shouting(solution_script): + var want = "Whoa, chill out!" + var got = solution_script.response("WATCH OUT!") + return [got, want] + + +func test_forceful_question(solution_script): + var want = "Calm down, I know what I'm doing!" + var got = solution_script.response("WHAT'S GOING ON?") + return [got, want] + + +func test_silence(solution_script): + var want = "Fine. Be that way!" + var got = solution_script.response("") + return [got, want] + + +func test_stating_something(solution_script): + var want = "Whatever." + var got = solution_script.response("Tom-ay-to, tom-aaaah-to.") + return [got, want] + + +func test_asking_a_numeric_question(solution_script): + var want = "Sure." + var got = solution_script.response("You are, what, like 15?") + return [got, want] + + +func test_asking_gibberish(solution_script): + var want = "Sure." + var got = solution_script.response("fffbbcbeab?") + return [got, want] + + +func test_question_with_no_letters(solution_script): + var want = "Sure." + var got = solution_script.response("4?") + return [got, want] + + +func test_non_letters_with_question(solution_script): + var want = "Sure." + var got = solution_script.response(":) ?") + return [got, want] + + +func test_prattling_on(solution_script): + var want = "Sure." + var got = solution_script.response("Wait! Hang on. Are you going to be OK?") + return [got, want] + + +func test_ending_with_whitespace(solution_script): + var want = "Sure." + var got = solution_script.response("Okay if like my spacebar quite a bit? ") + return [got, want] + + +func test_multiple_line_question(solution_script): + var want = "Sure." + var got = solution_script.response(" +Does this cryogenic chamber make + me look fat?") + return [got, want] + + +func test_shouting_gibberish(solution_script): + var want = "Whoa, chill out!" + var got = solution_script.response("FCECDFCAAB") + return [got, want] + + +func test_shouting_a_statement_containing_a_question_mark(solution_script): + var want = "Whoa, chill out!" + var got = solution_script.response("DO LIONS EAT PEOPLE? AHHHHH.") + return [got, want] + + +func test_shouting_numbers(solution_script): + var want = "Whoa, chill out!" + var got = solution_script.response("1, 2, 3 GO!") + return [got, want] + + +func test_shouting_with_special_characters(solution_script): + var want = "Whoa, chill out!" + var got = solution_script.response("ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!") + return [got, want] + + +func test_shouting_with_no_exclamation_mark(solution_script): + var want = "Whoa, chill out!" + var got = solution_script.response("I HATE THE DENTIST") + return [got, want] + + +func test_prolonged_silence(solution_script): + var want = "Fine. Be that way!" + var got = solution_script.response(" ") + return [got, want] + + +func test_alternate_silence(solution_script): + var want = "Fine. Be that way!" + var got = solution_script.response(" ") + return [got, want] + + +func test_other_whitespace(solution_script): + var want = "Fine. Be that way!" + var got = solution_script.response(" + ") + return [got, want] + + +func test_talking_forcefully(solution_script): + var want = "Whatever." + var got = solution_script.response("Hi there!") + return [got, want] + + +func test_using_acronyms_in_regular_speech(solution_script): + var want = "Whatever." + var got = solution_script.response("It's OK if you don't want to go work for NASA.") + return [got, want] + + +func test_no_letters(solution_script): + var want = "Whatever." + var got = solution_script.response("1, 2, 3") + return [got, want] + + +func test_statement_containing_question_mark(solution_script): + var want = "Whatever." + var got = solution_script.response("Ending with ? means a question.") + return [got, want] + + +func test_starting_with_whitespace(solution_script): + var want = "Whatever." + var got = solution_script.response(" hmmmmmmm...") + return [got, want] + + +func test_non_question_ending_with_whitespace(solution_script): + var want = "Whatever." + var got = solution_script.response("This is a statement ending with whitespace ") + return [got, want]