diff --git a/RandomWriter/RandomWriter.pro b/RandomWriter/RandomWriter.pro index 85bdbce..4570e8d 100644 --- a/RandomWriter/RandomWriter.pro +++ b/RandomWriter/RandomWriter.pro @@ -110,7 +110,7 @@ win32 { QMAKE_LFLAGS += -Wl,--stack,536870912 LIBS += -lDbghelp LIBS += -lbfd - LIBS += -liberty +# LIBS += -liberty LIBS += -limagehlp } macx { diff --git a/RandomWriter/res/Hamlet.txt b/RandomWriter/res/h.txt similarity index 100% rename from RandomWriter/res/Hamlet.txt rename to RandomWriter/res/h.txt diff --git a/RandomWriter/res/Middlemarch.txt b/RandomWriter/res/m.txt similarity index 100% rename from RandomWriter/res/Middlemarch.txt rename to RandomWriter/res/m.txt diff --git a/RandomWriter/res/r.txt b/RandomWriter/res/r.txt new file mode 100644 index 0000000..5133a68 --- /dev/null +++ b/RandomWriter/res/r.txt @@ -0,0 +1,4 @@ +Roses are red. +Violets are blue. +Sugar is sweet, +And so are you! diff --git a/RandomWriter/res/TomSawyer.txt b/RandomWriter/res/t.txt similarity index 100% rename from RandomWriter/res/TomSawyer.txt rename to RandomWriter/res/t.txt diff --git a/RandomWriter/src/RandomWriter.cpp b/RandomWriter/src/RandomWriter.cpp index e591dac..59773b2 100644 --- a/RandomWriter/src/RandomWriter.cpp +++ b/RandomWriter/src/RandomWriter.cpp @@ -6,9 +6,140 @@ #include "random.h" #include "strlib.h" #include "vector.h" +#include "simpio.h" +#include "random.h" + using namespace std; +string promptUserForFile(ifstream & infile, string prompt); //ask for input file +Map> makeMap(Vector vec, int order); +string arToStr(Vector); +string startOfRes(Map>); +string makeRandomTail(string, Map>, int); + int main() { - // TODO: fill in the code - return 0; + ifstream infile; + promptUserForFile(infile, "Enter filename: "); + int order = getInteger("Enter number of order (from 1 to 10):"); + Vector inputFileRead; + char ch; + while (infile.get(ch)){ + if (ch == EOF) break; + inputFileRead.add(ch); + } + Map> map = makeMap(inputFileRead, order); + string a = startOfRes(map); + cout << "RANDOM TEXT: " << makeRandomTail(a, map, order) << endl; + return 0; +} +/* +* function create random text +* +* @param first string from startOfRes, +* map from makeMap, +* oreder - current seed that entered user +* @return random text +*/ +string makeRandomTail(string str, Map> map, int order){ + string res; + res += str; + for(int i = 2000 - order; i > 0; i--){ + string lastOrder = res.substr(res.length() - order, res.length()); + if(!map.containsKey(lastOrder)){ + return res; + } + Vector adding = map.get(lastOrder); + string addToRes = arToStr(adding); + int rnd = randomInteger(0, addToRes.length()-1); + char ch = addToRes[rnd]; + res += ch; + } + return res; +} +/* +* choose random first word, To start random text. +* +* @param Map of seeds and next char +* @return first seed of random text +*/ +string startOfRes(Map> map){ + Map> bestKey; + Vector whereGetStartWord; + string res = ""; + int maxNum = 0; + for(string j : map){ + Vector tmp = map.get(j); + int curNum = tmp.size(); + if(curNum > maxNum){ + maxNum = curNum; + } + } + for(string u : map){ + Vector tmp = map.get(u); + if(tmp.size() == maxNum){ + bestKey.put(u, tmp); + } + + } + whereGetStartWord = bestKey.keys(); + int rand = randomInteger(0,(whereGetStartWord.size() - 1)); + res = whereGetStartWord[rand]; + return res; +} + +/* +* crate Map like key"re" - vector"a, b, g"; +* +* @param vector +* @return string from vector +*/ +Map> makeMap(Vector vec, int order){ + Map> map; + for(int i = 0; i < vec.size() - order - 1; i++){ + Vector sub = vec.subList(i, order); + string kkey = arToStr(sub); + Vector vvalue; + vvalue.add(vec.get(i + order)); + if(map.containsKey(kkey)){ + Vector add = map.get(kkey); + map.remove(kkey); + add += vvalue; + map.put(kkey, add); + add.clear(); + } + if(map.containsKey(kkey) == false){ + map.put(kkey, vvalue); + } + } + return map; +} + +/* +* transfors array of in one string +* +* @param vector +* @return string from vector +*/ +string arToStr(Vector vec){ + string res; + for(char ch : vec){ + res += ch; + } + return res; +} + +//ask user to enter file name +string promptUserForFile(ifstream & infile, string prompt ){ + while(true){ + cout << prompt; + string filename; + getline(cin, filename); + infile.open(filename.c_str()); + if(!infile.fail()) return filename; + infile.clear(); + cout << "UNABLE TO OPEN FILE! Try again." << endl; + if(prompt == ""){ + prompt = "Input filename: "; + } + } } diff --git a/WordLadder/WordLadder.pro b/WordLadder/WordLadder.pro index 85bdbce..4570e8d 100644 --- a/WordLadder/WordLadder.pro +++ b/WordLadder/WordLadder.pro @@ -110,7 +110,7 @@ win32 { QMAKE_LFLAGS += -Wl,--stack,536870912 LIBS += -lDbghelp LIBS += -lbfd - LIBS += -liberty +# LIBS += -liberty LIBS += -limagehlp } macx { diff --git a/WordLadder/src/WordLadder.cpp b/WordLadder/src/WordLadder.cpp index 01d35d7..308330e 100644 --- a/WordLadder/src/WordLadder.cpp +++ b/WordLadder/src/WordLadder.cpp @@ -4,9 +4,113 @@ #include "queue.h" #include "simpio.h" #include "vector.h" +#include using namespace std; +Queue> myqueue; +Lexicon dictionary("EnglishWords.dat"); +Vector diffOneLetterWord(string); +Vector wordLadder(string, string); + int main() { - // TODO: fill in the code - return 0; + while(true){ + string startWord = getLine("Enter start word - "); + if(startWord.length() == 0){ + break; + } + string endWord = getLine("Enter destination word - "); + Vector res; + if(startWord.length() == endWord.length()){ + res = wordLadder(startWord, endWord); + } + if(res.isEmpty()){ //if returned vector is empty print "no ladder" + cout << "No ladder found!" << endl; + } + for(int i = 0; i < res.size(); i++){ //formating result + if(i == (res.size() - 1)){ + cout << res[i] << endl; + } + if(i!=(res.size() - 1)){ + cout << res[i] << " -> "; + } + + } + //if don't clear arry, we get the same array + res.clear(); + } + return 0; +} + +/* +* Make an vector of words from startWord to endWord +* +* @param user input - startWord, endWord +* @return Vector-Ladder of words +*/ + +Vector wordLadder(string startWord, string endWord){ + Lexicon usedWords; + usedWords.add(startWord); + Vector res; + res.add(startWord); + myqueue.enqueue(res); + res.clear(); + + while (!myqueue.isEmpty()) { + //get first ladder from queue + Vector vec = myqueue.dequeue(); + //if last word is equal to endWord + if(vec[vec.size() - 1] == endWord){ + res = vec; + return res; + } + //make an array of different words for last word in vec + Vector tmpque = diffOneLetterWord(vec[vec.size() - 1]); + for(string diffWord : tmpque){ + //if current word is not used earlier. Add new Vector to queue + if(!usedWords.contains(diffWord)){ + usedWords.add(diffWord); + Vector nVec = vec; + nVec.add(diffWord); + myqueue.enqueue(nVec); + } + } + } + return res; +} + +/* +* Make an array of words that have one different letter +* +* @param user input - startWord +* @return Array of words +*/ +Vector diffOneLetterWord(string startWord){ + Vector res; + Vector newWord; + //make from startWord an array newWord to change letter by letter + for(int w = 0; w < startWord.length(); w++){ + newWord.add(startWord[w]); + } + //cout << newWord << endl; + string curWord = ""; + string alphabet = "abcdefghijklmnopqrstuvwxyz"; + //start to change each letter of word (array) + for(int i = 0; i < newWord.size(); i++){ + for(int a = 0; a < alphabet.length(); a++){ + newWord.set(i, alphabet[a]); + //convert array into word + for(int r = 0; r < newWord.size(); r++){ + curWord += newWord[r]; + } + if(curWord != startWord){ + if(dictionary.contains(curWord)){ + res.add(curWord); + } + } + curWord = ""; + } + newWord.set(i, startWord[i]); + } + return res; }