2014-09-19 88 views
0

我的目标是创建一个代码,它将一个字符串中的字母和拼字游戏中的分数给出。它必须考虑双字分数(由!表示)和双字母分数(由#表示)。计算双字母和双字的拼字比分MATLAB

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.

+0

'strfind(word,doubleword-1)'应该被'strfind(word,doubleword)-1'替代。 (你想首先得到你的标记的索引,然后去掉'1'来得到这个字母的索引,对于'trouble'同样的东西。 – Hoki 2014-09-19 22:21:48

+0

它仍然标记我为“下标索引必须是真实的正整数或逻辑。 拼字错误(第29行) Origscore =(总和(值(ASCII)));“ 我不太确定该怎么办 – 2014-09-19 23:20:03

回答

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^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; 
+0

我认为我搞砸了一些东西。 – 2014-09-21 15:53:56

+0

@JessicaMarie - 别担心:)我正在修复它,只是做了一些修改,我很有信心,我没有测试我的代码哈哈,它现在可以工作,给我2分钟,很酷吗? – rayryeng 2014-09-21 15:55:20

+0

@JessicaMarie - 完成,这适用于所有的测试用例,只需更改一些变量,祝你好运! – rayryeng 2014-09-21 16:02:54