计算双字母和双字MATLAB的拼字游戏单词分数

时间:2014-09-19 22:12:41

标签: matlab indexing sum

我的目标是创建一个代码,该代码使用字符串中的字母并给出像Scrabble中的分数。它必须考虑双字分数(由a!决定)和双字母分数(由#指示)。

Example: If you input was 'Hel#lo!', then the first 'l' was played on a
double letter score space, and the final 'o' was played on a            
double word score space. The output score would be 18.

感谢rayryeng的帮助,如果没有双字或双字母,我终于得到它来读取分数值,但现在我似乎无法弄清楚那些。如果我能就如何实现这一目标提供一些指导,我将不胜感激。

doubleword = '#'; %// Here I labeled some things
doubleletter = '!';
doublew = strfind(word, doubleword-1); %// I want to find where the double words are
doublewb = 2;
trouble = strfind(word, doubleletter-1); %// I want to find where double letters are
troubleb = letterPoints*2;
Convert = word;
stringToConvert = lower(Convert);
ASCII = double(stringToConvert) - 96;
Origscore = (sum(values(ASCII)));
score = doublewb*(sum(Origscore)+troubleb);

最后一行给了我麻烦。我得到一个数组,现在只是一个很好的干净数字。此外,当我尝试运行我的简单字符串'matlab'时,它给了我一个错误。或者非常奇怪,不是简单的数字。我想我需要做一些进一步的索引,但我有点困惑。我知道这应该是最困难的问题,尽管我一直在努力解决这些问题。 'Q#阿联!TZ#ifer#OU的!'应该给220.“Ramblin!gwreck”应该给54.

1 个答案:

答案 0 :(得分:2)

为什么再次问好!让我们重新创建我们创建的查找in our previous post

string1point = 'aeionrtlsu';
string2point = 'dg';
string3point = 'bcmp';
string4point = 'fhvwy';
string5point = 'k';
string8point = 'jx';
string10point = 'qz';
lookup = zeros(1,26);
lookup(double(string1point) - 96) = 1;
lookup(double(string2point) - 96) = 2;
lookup(double(string3point) - 96) = 3;
lookup(double(string4point) - 96) = 4;
lookup(double(string5point) - 96) = 5;
lookup(double(string8point) - 96) = 8;
lookup(double(string10point) - 96) = 10;

在我们做任何其他事情之前,我们需要小写所有字母才能访问查找表。

lowerWord = lower(word);

一旦我们这样做,让我们弄清楚双字母和双字的位置。您几乎已经找到了想要找到哪些字母是双字母(#)和/或哪些图块符击双字拼贴(!)的位置。您需要移动括号外的1,以便弄清楚实际字母是什么,而不是符号所在的位置。换句话说:

doublew = strfind(lowerWord, '!') - 1;
doublel = strfind(lowerWord, '#') - 1;

我们现在需要做的是提取原始字符串,不带任何符号。我们可以通过以下方式实现:

originalWord = lowerWord;
originalWord([doublew + 1 doublel + 1]) = [];

我必须为每个位置添加1,因为我想访问符号所在的位置。我使用符号所在的两个位置,然后使用[]来消除这些符号。这应该给我们原来的字眼。现在,我们要做的是在查询表中访问每个字母的值,并总结点数。换句话说:

ASCII = double(originalWord) - 96;
basePoints = sum(lookup(ASCII));

现在,我们拥有的点数是:

basePoints =

 8

8分是我们在任何分数调整之前有多少分。现在,让我们一次解决一个案例:

双字母

如果您记得以前,doublewdoublel将包含受分数增加影响的字母的位置。

首先,让我们弄清楚哪些字母会使其点值加倍,并找出这些字母在查找表中的位置并加上这个分数的多少:

doublelettersInd = double(lowerWord(doublel)) - 96;
sumLetters = sum(lookup(doublelettersInd));

sumLetters将包含所有这些字母的总分,其值必须加倍。现在,这里变得棘手。我接下来要做的就是将这个分数存储在sumLetters添加这个基础分数之上(在我们的例子中为8)。这将有效地将那些要加倍的字母加倍。请记住,如果你自己添加一些东西,那么你的价值就会翻倍。因为在基础分数中,我已经添加了那些只是基本分数的字母,如果我然后找到那些要加倍的字母并得到那些分数并将它们添加到我们的原始分数之上,我将相应字母的分数加倍:

doublePoints = basePoints + sumLetters;

双字

您需要做的最后一件事是计算我们遇到双字拼图的次数。然后你可以使用这个数字,并且你必须使用它作为2的幂的指数,因为这将有效地显示你需要加倍的次数。如果您点击一次双重图块,则会使得分加倍(即2^1 = 2)。如果您按两次双字拼图,则会使分数翻倍(即2^2 = 4),依此类推。换句话说:

finalPoints = (2^numel(doublew))*doublePoints;

numel计算数组或矩阵中有多少个元素。因此,doublew的长度将告诉我们有多少次遇到双字拼贴。

^很重要,因为这会正确加倍。 ^代表取幂,这可以处理我们在正确加倍得分时所谈到的内容。这将能够处理我们不会遇到任何双字拼贴的情况,如2^0 = 1

完成所有这些操作后,当您使用上述代码执行word = 'Hel#lo!';时,我们会得到:

finalPoints =

 18

通过您的其他示例,我得到:

....很酷? :)

另外,对于上述测试用例,对于Ramblin!gwreck,我得到:

finalPoints = 

54

对于Q#uar!tz#ifer#ous!,我得到:

finalPoints = 

220

要使这一切都很好,以便您可以将其复制并粘贴到编辑器中以便运行它,这里的代码只需一个代码块:

%// Define word here
word = 'Ramblin!gwreck';
%word = 'Q#uar!tz#ifer#ous!';

%// Convert word to lower case
lowerWord = lower(word);

%// Create look up table
string1point = 'aeionrtlsu';
string2point = 'dg';
string3point = 'bcmp';
string4point = 'fhvwy';
string5point = 'k';
string8point = 'jx';
string10point = 'qz';
lookup = zeros(1,26);
lookup(double(string1point) - 96) = 1;
lookup(double(string2point) - 96) = 2;
lookup(double(string3point) - 96) = 3;
lookup(double(string4point) - 96) = 4;
lookup(double(string5point) - 96) = 5;
lookup(double(string8point) - 96) = 8;
lookup(double(string10point) - 96) = 10;

%// Find letters that are either double word or double letter
doublew = strfind(lowerWord, '!') - 1;
doublel = strfind(lowerWord, '#') - 1;

%// Get original word without symbols
originalWord = lowerWord;
originalWord([doublew + 1 doublel + 1]) = [];

%// Get the base points of the word
ASCII = double(originalWord) - 96;
basePoints = sum(lookup(ASCII));

%// Find those letters that need to be doubled in point value
%// and double their score
doublelettersInd = double(lowerWord(doublel)) - 96;
sumLetters = sum(lookup(doublelettersInd));
doublePoints = basePoints + sumLetters;

%// Finally, if we need to double the word score, do it
finalPoints = (2^numel(doublew))*doublePoints;