Skip to content

Commit

Permalink
Add wordy exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
keiravillekode committed Jan 1, 2024
1 parent 1a22420 commit 1ca95e5
Show file tree
Hide file tree
Showing 7 changed files with 368 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,14 @@
"prerequisites": [],
"difficulty": 6
},
{
"slug": "wordy",
"name": "Wordy",
"uuid": "a8449f36-4860-4934-9b32-8ce38faac5de",
"practices": [],
"prerequisites": [],
"difficulty": 6
},
{
"uuid": "c0a26fda-7ce7-43f0-8da1-cb5b5d5e434f",
"slug": "isbn-verifier",
Expand Down
59 changes: 59 additions & 0 deletions exercises/practice/wordy/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Instructions

Parse and evaluate simple math word problems returning the answer as an integer.

## Iteration 0 — Numbers

Problems with no operations simply evaluate to the number given.

> What is 5?
Evaluates to 5.

## Iteration 1 — Addition

Add two numbers together.

> What is 5 plus 13?
Evaluates to 18.

Handle large numbers and negative numbers.

## Iteration 2 — Subtraction, Multiplication and Division

Now, perform the other three operations.

> What is 7 minus 5?
2

> What is 6 multiplied by 4?
24

> What is 25 divided by 5?
5

## Iteration 3 — Multiple Operations

Handle a set of operations, in sequence.

Since these are verbal word problems, evaluate the expression from left-to-right, _ignoring the typical order of operations._

> What is 5 plus 13 plus 6?
24

> What is 3 plus 2 multiplied by 3?
15 (i.e. not 9)

## Iteration 4 — Errors

The parser should reject:

- Unsupported operations ("What is 52 cubed?")
- Non-math questions ("Who is the President of the United States")
- Word problems with invalid syntax ("What is 1 plus plus 2?")
19 changes: 19 additions & 0 deletions exercises/practice/wordy/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"keiravillekode"
],
"files": {
"solution": [
"wordy.v"
],
"test": [
"run_test.v"
],
"example": [
".meta/example.v"
]
},
"blurb": "Parse and evaluate simple math word problems returning the answer as an integer.",
"source": "Inspired by one of the generated questions in the Extreme Startup game.",
"source_url": "https://github.com/rchatley/extreme_startup"
}
58 changes: 58 additions & 0 deletions exercises/practice/wordy/.meta/example.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
module main

import strconv

fn add(a int, b int) int {
return a + b
}

fn subtract(a int, b int) int {
return a - b
}

fn multiply(a int, b int) int {
return a * b
}

fn divide(a int, b int) int {
return a / b
}

fn answer(question string) ?int {
if question.index_u8(u8(`?`)) + 1 != question.len {
return none
}
words := question#[0..-1].split(' ')
if words.len < 3 || words[0] != 'What' || words[1] != 'is' {
return none
}

mut a := 0
mut operation := add
mut index := 2
for index != words.len && index + 2 != words.len {
b := strconv.atoi(words[index]) or { return none }
a = operation(a, b)
index++
if index == words.len {
return a
}

if words[index] == 'plus' {
operation = add
index++
} else if words[index] == 'minus' {
operation = subtract
index++
} else if words[index] == 'multiplied' && words[index + 1] == 'by' {
operation = multiply
index += 2
} else if words[index] == 'divided' && words[index + 1] == 'by' {
operation = divide
index += 2
} else {
return none
}
}
return none
}
72 changes: 72 additions & 0 deletions exercises/practice/wordy/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# This is an auto-generated file. Regular comments will be removed when this
# file is regenerated. Regenerating will not touch any manually added keys,
# so comments can be added in a "comment" key.

[88bf4b28-0de3-4883-93c7-db1b14aa806e]
description = "just a number"

[bb8c655c-cf42-4dfc-90e0-152fcfd8d4e0]
description = "addition"

[79e49e06-c5ae-40aa-a352-7a3a01f70015]
description = "more addition"

[b345dbe0-f733-44e1-863c-5ae3568f3803]
description = "addition with negative numbers"

[cd070f39-c4cc-45c4-97fb-1be5e5846f87]
description = "large addition"

[0d86474a-cd93-4649-a4fa-f6109a011191]
description = "subtraction"

[30bc8395-5500-4712-a0cf-1d788a529be5]
description = "multiplication"

[34c36b08-8605-4217-bb57-9a01472c427f]
description = "division"

[da6d2ce4-fb94-4d26-8f5f-b078adad0596]
description = "multiple additions"

[7fd74c50-9911-4597-be09-8de7f2fea2bb]
description = "addition and subtraction"

[b120ffd5-bad6-4e22-81c8-5512e8faf905]
description = "multiple subtraction"

[4f4a5749-ef0c-4f60-841f-abcfaf05d2ae]
description = "subtraction then addition"

[312d908c-f68f-42c9-aa75-961623cc033f]
description = "multiple multiplication"

[38e33587-8940-4cc1-bc28-bfd7e3966276]
description = "addition and multiplication"

[3c854f97-9311-46e8-b574-92b60d17d394]
description = "multiple division"

[3ad3e433-8af7-41ec-aa9b-97b42ab49357]
description = "unknown operation"

[8a7e85a8-9e7b-4d46-868f-6d759f4648f8]
description = "Non math question"

[42d78b5f-dbd7-4cdb-8b30-00f794bb24cf]
description = "reject problem missing an operand"

[c2c3cbfc-1a72-42f2-b597-246e617e66f5]
description = "reject problem with no operands or operators"

[4b3df66d-6ed5-4c95-a0a1-d38891fbdab6]
description = "reject two operations in a row"

[6abd7a50-75b4-4665-aa33-2030fd08bab1]
description = "reject two numbers in a row"

[10a56c22-e0aa-405f-b1d2-c642d9c4c9de]
description = "reject postfix notation"

[0035bc63-ac43-4bb5-ad6d-e8651b7d954e]
description = "reject prefix notation"
148 changes: 148 additions & 0 deletions exercises/practice/wordy/run_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
module main

fn test_just_a_number() {
question := 'What is 5?'
assert answer(question)! == 5
}

fn test_addition() {
question := 'What is 1 plus 1?'
assert answer(question)! == 2
}

fn test_more_addition() {
question := 'What is 53 plus 2?'
assert answer(question)! == 55
}

fn test_addition_with_negative_numbers() {
question := 'What is -1 plus -10?'
assert answer(question)! == -11
}

fn test_large_addition() {
question := 'What is 123 plus 45678?'
assert answer(question)! == 45801
}

fn test_subtraction() {
question := 'What is 4 minus -12?'
assert answer(question)! == 16
}

fn test_multiplication() {
question := 'What is -3 multiplied by 25?'
assert answer(question)! == -75
}

fn test_division() {
question := 'What is 33 divided by -3?'
assert answer(question)! == -11
}

fn test_multiple_additions() {
question := 'What is 1 plus 1 plus 1?'
assert answer(question)! == 3
}

fn test_addition_and_subtraction() {
question := 'What is 1 plus 5 minus -2?'
assert answer(question)! == 8
}

fn test_multiple_subtraction() {
question := 'What is 20 minus 4 minus 13?'
assert answer(question)! == 3
}

fn test_subtraction_then_addition() {
question := 'What is 17 minus 6 plus 3?'
assert answer(question)! == 14
}

fn test_multiple_multiplication() {
question := 'What is 2 multiplied by -2 multiplied by 3?'
assert answer(question)! == -12
}

fn test_addition_and_multiplication() {
question := 'What is -3 plus 7 multiplied by -2?'
assert answer(question)! == -8
}

fn test_multiple_division() {
question := 'What is -12 divided by 2 divided by -3?'
assert answer(question)! == 2
}

fn test_unknown_operation() {
question := 'What is 52 cubed?'
if res := answer(question) {
assert false, 'unknown operation should be rejected'
} else {
assert true
}
}

fn test_non_math_question() {
question := 'Who is the President of the United States?'
if res := answer(question) {
assert false, 'Non math question should be rejected'
} else {
assert true
}
}

fn test_reject_problem_missing_an_operand() {
question := 'What is 1 plus?'
if res := answer(question) {
assert false, 'problem missing an operand should be rejected'
} else {
assert true
}
}

fn test_reject_problem_with_no_operands_or_operators() {
question := 'What is?'
if res := answer(question) {
assert false, 'problem with no operands or operators should be rejected'
} else {
assert true
}
}

fn test_reject_two_operations_in_a_row() {
question := 'What is 1 plus plus 2?'
if res := answer(question) {
assert false, 'two operations in a row should be rejected'
} else {
assert true
}
}

fn test_reject_two_numbers_in_a_row() {
question := 'What is 1 plus 2 1?'
if res := answer(question) {
assert false, 'two numbers in a row should be rejected'
} else {
assert true
}
}

fn test_reject_postfix_notation() {
question := 'What is 1 2 plus?'
if res := answer(question) {
assert false, 'postfix notation should be rejected'
} else {
assert true
}
}

fn test_reject_prefix_notation() {
question := 'What is plus 1 2?'
if res := answer(question) {
assert false, 'prefix notation should be rejected'
} else {
assert true
}
}
4 changes: 4 additions & 0 deletions exercises/practice/wordy/wordy.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module main

fn answer(question string) ?int {
}

0 comments on commit 1ca95e5

Please sign in to comment.