2014-09-19 96 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