爲什麼再次問候!讓我們重建我們創建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點是我們有多少個得分任何調整之前有。現在,讓我們來解決每一種情況下一次一個:
雙封
如果你還記得之前,doublew
和doublel
將包含字母是受制於評分增長的位置。
首先,讓我們弄清楚什麼字母都受到他們的點值加倍,並找出其中這些都是在查找表,加起來這個分數是多少:
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;
'strfind(word,doubleword-1)'應該被'strfind(word,doubleword)-1'替代。 (你想首先得到你的標記的索引,然後去掉'1'來得到這個字母的索引,對於'trouble'同樣的東西。 – Hoki 2014-09-19 22:21:48
它仍然標記我爲「下標索引必須是真實的正整數或邏輯。 拼字錯誤(第29行) Origscore =(總和(值(ASCII)));「 我不太確定該怎麼辦 – 2014-09-19 23:20:03