in reply to Homework help
Firstly, grep is excessive. Since your keys are upper-case, simply use uc to upper-case things before matching.
Note that it reads STDIN until EOF -- Ctrl-D on Unix/Linux and Ctrl-Z on Windows (followed by Enter on some of both types of systems). Or you can pipe in a word list... but you needn't have one word per line, as long as you use space between them.#!/usr/bin/perl use strict; use warnings; my @words; while (<STDIN>) { push @words, split /\s/ } my %wordscore = scrabble_score(@words); for (sort keys %wordscore) { print qq/"$_" = $wordscore{$_} points\n/; } sub scrabble_score { my %value = ( A => 1, F => 4, K => 5, P => 3, U => 1, Z => 1 +0, B => 2, G => 2, L => 1, Q => 10, V => 4, C => 3, H => 4, M => 3, R => 1, W => 4, D => 2, I => 1, N => 1, S => 1, X => 8, E => 1, J => 8, O => 1, T => 1, Y => 4 ); my %score; for (@_) { my @letter = split "", uc $_; my $word = $_; $score{$word} = 0; for (@letter) { $score{$word}+=$value{$_} } } return %score; }
Also, because of how hashes function, it will only print one instance of each word.
By the way, you aren't checking to make sure the word is possible in Scrabble: there are a limited quantity of each letter... :)
|
|---|