ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# bonus's solution

## to Scrabble Score in the Nim Track

Published at Jul 20 2020 · 0 comments
Instructions
Test suite
Solution

#### Note:

This exercise has changed since this solution was written.

Given a word, compute the Scrabble score for that word.

## Letter Values

You'll need these:

``````Letter                           Value
A, E, I, O, U, L, N, R, S, T       1
D, G                               2
B, C, M, P                         3
F, H, V, W, Y                      4
K                                  5
J, X                               8
Q, Z                               10
``````

## Examples

"cabbage" should be scored as worth 14 points:

• 3 points for C
• 1 point for A, twice
• 3 points for B, twice
• 2 points for G
• 1 point for E

And to total:

• `3 + 2*1 + 2*3 + 2 + 1`
• = `3 + 2 + 6 + 3`
• = `5 + 9`
• = 14

## Extensions

• You can play a double or a triple letter.
• You can play a double or a triple word.

## Running the tests

To compile and run the tests, just run the following in your exercise directory:

``````\$ nim c -r scrabble_score_test.nim
``````

## Submitting Exercises

Note that, when trying to submit an exercise, make sure the solution is in the `\$EXERCISM_WORKSPACE/nim/scrabble-score` directory.

You can find your Exercism workspace by running `exercism debug` and looking for the line that starts with `Exercises Directory`.

## Source

Inspired by the Extreme Startup game https://github.com/rchatley/extreme_startup

## Submitting Incomplete Solutions

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

### scrabble_score_test.nim

``````import unittest
import scrabble_score

# version 1.1.0

suite "Scrabble Score":
test "lowercase letter":
check score("a") == 1

test "uppercase letter":
check score("A") == 1

test "valuable letter":
check score("f") == 4

test "short word":
check score("at") == 2

test "short, valuable word":
check score("zoo") == 12

test "medium word":
check score("street") == 6

test "medium, valuable word":
check score("quirky") == 22

test "long, mixed-case word":
check score("OxyphenButazone") == 41

test "english-like word":
check score("pinata") == 8

test "empty input":
check score("") == 0

test "entire alphabet available":
check score("abcdefghijklmnopqrstuvwxyz") == 87``````
``````import tables, strutils

const cost_of_char = {
'a': 1,
'e': 1,
'i': 1,
'o': 1,
'u': 1,
'l': 1,
'n': 1,
'r': 1,
's': 1,
't': 1,
'd': 2,
'g': 2,
'b': 3,
'c': 3,
'm': 3,
'p': 3,
'f': 4,
'h': 4,
'v': 4,
'w': 4,
'y': 4,
'k': 5,
'j': 8,
'x': 8,
'q': 10,
'z': 10,
}.toTable

proc score*(word: string): int =
for c in word.toLowerAscii:
result += cost_of_char[c]``````