# vonnenaut's solution

## to Scrabble Score in the Ruby Track

Published at Dec 26 2019 · 0 comments
Instructions
Test suite
Solution

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.

For installation and learning resources, refer to the Ruby resources page.

For running the tests provided, you will need the Minitest gem. Open a terminal window and run the following command to install minitest:

gem install minitest

If you would like color output, you can require 'minitest/pride' in the test file, or note the alternative instruction, below, for running the test file.

Run the tests from the exercise directory using the following command:

ruby scrabble_score_test.rb

To include color from the command line:

ruby -r minitest/pride scrabble_score_test.rb

## 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.rb

require 'minitest/autorun'
require_relative 'scrabble_score'

class ScrabbleTest < Minitest::Test
def test_empty_word_scores_zero
assert_equal 0, Scrabble.new('').score
end

def test_whitespace_scores_zero
skip
assert_equal 0, Scrabble.new(" \t\n").score
end

def test_nil_scores_zero
skip
assert_equal 0, Scrabble.new(nil).score
end

def test_scores_very_short_word
skip
assert_equal 1, Scrabble.new('a').score
end

def test_scores_other_very_short_word
skip
assert_equal 4, Scrabble.new('f').score
end

def test_simple_word_scores_the_number_of_letters
skip
assert_equal 6, Scrabble.new('street').score
end

def test_complicated_word_scores_more
skip
assert_equal 22, Scrabble.new('quirky').score
end

def test_scores_are_case_insensitive
skip
assert_equal 41, Scrabble.new('OXYPHENBUTAZONE').score
end

def test_convenient_scoring
skip
assert_equal 13, Scrabble.score('alacrity')
end
end
# scrabble_score.rb
# PEDAC practice #43

# Problem
# Examples/Test Cases
# Data Structure
# Algorithm
# Code

# Problem & Examples
#####################
=begin
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.
=end

# Data Structure
##################
# input -- a string
# output -- a score totaled from the values of each letter in the string

# Algorithm
###############
=begin
1. Create a hash with a string containing all the letters of one value as the key and that value as its value.
2. Instantiate total = 0
3. split the string into letters and iterate through them, checking which key string contains each letter and retrieving its value, adding it to score.
4. return the total score
=end

# Code
#########
class Scrabble
def initialize(string)
@string = string
end

def self.get_score(letter)
scores = {
'AEIOULNRST' => 1,
'DG'  => 2,
'BCMP' => 3,
'FHVWY' => 4,
'K' => 5,
'JX' => 8,
'QZ' => 10
}

scores.keys.each do |key|
return scores[key] if key.include? letter.upcase
end
return 0
end

def self.score(string = @string)
return 0 if ['', nil].include? string
total = 0
letters = string.split(//)
letters.map! { |letter| self.get_score(letter) }
letters.each { |score| total += score }
total
end

def get_score(letter)
scores = {
'AEIOULNRST' => 1,
'DG'  => 2,
'BCMP' => 3,
'FHVWY' => 4,
'K' => 5,
'JX' => 8,
'QZ' => 10
}

scores.keys.each do |key|
return scores[key] if key.include? letter.upcase
end
return 0
end

def score(string = @string)
return 0 if ['', nil].include? string
total = 0
letters = string.split(//)
letters.map! { |letter| get_score(letter) }
letters.each { |score| total += score }
total
end
end

# Test Cases
#############
p Scrabble.new('').score == 0
p Scrabble.new(" \t\n").score == 0
p Scrabble.new(nil).score == 0
p Scrabble.new('a').score == 1
p Scrabble.new('f').score == 4
p Scrabble.score('alacrity') == 13